Skip to content
This repository was archived by the owner on Sep 1, 2020. It is now read-only.

Improved product's toString to include strings #19

Closed
wants to merge 1 commit into from
Closed

Improved product's toString to include strings #19

wants to merge 1 commit into from

Conversation

mxswd
Copy link

@mxswd mxswd commented Sep 5, 2014

Test frameworks and debuggers use toString to show string-based information to users. It helps users a lot if strings are shown with quotes.

scala> case class Person(name: String, age: Int)
defined class Person

scala> Person("", 0)
res0: Person = ("", 0)

@puffnfresh
Copy link

This breaks binary compatibility, seems very specialised and is strange for strings like:

"hello\"world"

Which is printed like:

"hello"world"

@mxswd
Copy link
Author

mxswd commented Sep 5, 2014

  • I'm not sure how binary compatibility is broken.
  • I didn't think about printing the string. Will fix that up.
  • I would like to add it to everywhere, not just product and tuple.

@puffnfresh
Copy link

I'm working under the assumption that this is necessary:

Sources that compile under both scalac and tlc with the same flags should have the same semantics.

@mxswd mxswd closed this Sep 5, 2014
@mxswd mxswd deleted the tostring branch September 5, 2014 04:19
@mxswd
Copy link
Author

mxswd commented Sep 5, 2014

Make -Zreal-parametricity instead.

@Blaisorblade
Copy link

@maxpow4h, I agree the lack of quotes is annoying, but the toString interface is forced.
I think we need a working Show typeclass with deriving support (I know it's more annoying). Does Scalaz not have this?

aloiscochard pushed a commit to aloiscochard/scala that referenced this pull request Sep 5, 2014
Bump versions after the 2.11.0 release.
@milessabin
Copy link
Member

Another consequence is that any projects which have tests which check the result of toString on case classes would be broken by this. That most likely includes the compiler itself.

I think there are better alternatives: using Show or case classes a la carte for example.

milessabin pushed a commit that referenced this pull request Jul 31, 2017
Non local returns aren't eliminated after inlined in 2.11 or 2.12

```
⚡ scala
Welcome to Scala 2.12.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_112).
Type in expressions for evaluation. Or try :help.

scala> @inlune def foo(a: => Any) = if ("".isEmpty) a else ""
<console>:11: error: not found: type inlune
       @inlune def foo(a: => Any) = if ("".isEmpty) a else ""
        ^

scala> @inline def foo(a: => Any) = if ("".isEmpty) a else ""
foo: (a: => Any)Any

scala> class InlineReturn { def test: Any = foo(return "") }
defined class InlineReturn

scala> :javap -c InlineReturn#test
  public java.lang.Object test();
    Code:
       0: new           #4                  // class java/lang/Object
       3: dup
       4: invokespecial #32                 // Method java/lang/Object."<init>":()V
       7: astore_1
       8: getstatic     #36                 // Field $line4/$read$$iw$$iw$.MODULE$:L$line4/$read$$iw$$iw$;
      11: aload_1
      12: invokedynamic #59,  0             // InvokeDynamic #0:apply:(Ljava/lang/Object;)Lscala/Function0;
      17: invokevirtual #63                 // Method $line4/$read$$iw$$iw$.foo:(Lscala/Function0;)Ljava/lang/Object;
      20: goto          44
      23: astore_2
      24: aload_2
      25: invokevirtual #66                 // Method scala/runtime/NonLocalReturnControl.key:()Ljava/lang/Object;
      28: aload_1
      29: if_acmpne     39
      32: aload_2
      33: invokevirtual #69                 // Method scala/runtime/NonLocalReturnControl.value:()Ljava/lang/Object;
      36: goto          41
      39: aload_2
      40: athrow
      41: goto          44
      44: areturn
    Exception table:
       from    to  target type
           8    20    23   Class scala/runtime/NonLocalReturnControl
```

```
⚡ ~/scala/2.11.8/bin/scala
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_112).
Type in expressions for evaluation. Or try :help.

scala> @inline def foo(a: => Any) = if ("".isEmpty) a else ""
foo: (a: => Any)Any

scala> class InlineReturn { def test: Any = foo(return "") }
defined class InlineReturn

scala> :javap -c InlineReturn#test
  public java.lang.Object test();
    Code:
       0: new           #4                  // class java/lang/Object
       3: dup
       4: invokespecial #13                 // Method java/lang/Object."<init>":()V
       7: astore_1
       8: getstatic     #19                 // Field .MODULE$:L;
      11: new           #21                 // class InlineReturn$$anonfun$test$1
      14: dup
      15: aload_0
      16: aload_1
      17: invokespecial #24                 // Method InlineReturn$$anonfun$test$1."<init>":(LInlineReturn;Ljava/lang/Object;)V
      20: invokevirtual #28                 // Method .foo:(Lscala/Function0;)Ljava/lang/Object;
      23: goto          39
      26: astore_2
      27: aload_2
      28: invokevirtual #31                 // Method scala/runtime/NonLocalReturnControl.key:()Ljava/lang/Object;
      31: aload_1
      32: if_acmpne     40
      35: aload_2
      36: invokevirtual #34                 // Method scala/runtime/NonLocalReturnControl.value:()Ljava/lang/Object;
      39: areturn
      40: aload_2
      41: athrow
    Exception table:
       from    to  target type
           8    26    26   Class scala/runtime/NonLocalReturnControl

scala> :quit
```
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants