Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

allow tree of ConstantType as pattern in switch #6956

Closed
scabug opened this issue Jan 10, 2013 · 7 comments
Closed

allow tree of ConstantType as pattern in switch #6956

scabug opened this issue Jan 10, 2013 · 7 comments
Assignees
Milestone

Comments

@scabug
Copy link

scabug commented Jan 10, 2013

This one is trickier, as it requires the pattern matcher and the backend to agree that tableswitches can be generated for something other than literals:

$ cat testTableSwitch.scala 
package test.switch

object Test {
  private[this] final val ONE = 1

  def switchBad(i: Byte): Int = i match {
    case ONE => 1
    case 2 => 2
    case 3 => 3
    case _ => 0
  }

  def switchOkay(i: Byte): Int = i match {
    case 1 => 1
    case 2 => 2
    case 3 => 3
    case _ => 0
  }
}

$ ../build/quick/bin/scalac testTableSwitch.scala

$ javap -classpath . -c 'test.switch.Test$'
Compiled from "testTableSwitch.scala"
public final class test.switch.Test$ {
  public static final test.switch.Test$ MODULE$;

  public static {};
    Code:
       0: new           #2                  // class test/switch/Test$
       3: invokespecial #12                 // Method "<init>":()V
       6: return        

  public int switchBad(byte);
    Code:
       0: iload_1       
       1: istore_2      
       2: iconst_1      
       3: iload_2       
       4: if_icmpne     15
     ... comparing with each constant ...
      43: iconst_0      
      44: istore        4
      46: iload         4
      48: ireturn       

  public int switchOkay(byte);
    Code:
       0: iload_1       
       1: istore_2      
       2: iload_2       
       3: tableswitch   { // 1 to 3
                     1: 40
                     2: 36
                     3: 32
               default: 28
          }
      28: iconst_0      
      29: goto          41
      32: iconst_3      
      33: goto          41
      36: iconst_2      
      37: goto          41
      40: iconst_1      
      41: ireturn       
}
@scabug
Copy link
Author

scabug commented Jan 10, 2013

Imported From: https://issues.scala-lang.org/browse/SI-6956?orig=1
Reporter: @VladUreche
Affected Versions: 2.10.0

@scabug
Copy link
Author

scabug commented Jan 10, 2013

@paulp said:
What? I can't believe this doesn't work already. The constant folder is supposed to do some folding. This isn't tricky, we just have to expose pattern trees to the constant folder.

@scabug
Copy link
Author

scabug commented Jan 10, 2013

@paulp said:
OH, IT'S ANOTHER REGRESSION. Moors! Life doesn't end after typer!

  public int switchBad(byte);
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=3, args_size=2
         0: iload_1       
         1: istore_2      
         2: iconst_1      
         3: iload_2       
         4: if_icmpne     11
         7: iconst_1      
         8: goto          45
        11: iload_2       
        12: tableswitch   { // 2 to 3
                       2: 40
                       3: 44
                 default: 36
            }
        36: iconst_0      
        37: goto          45
        40: iconst_2      
        41: goto          45
        44: iconst_3      
        45: ireturn       

@scabug
Copy link
Author

scabug commented Jan 15, 2013

@adriaanm said:
which version of scalac produced this bytecode?

@scabug
Copy link
Author

scabug commented Jan 15, 2013

@adriaanm said:
nevermind, 2.10.0 -Xoldpatmat will do fine

@scabug
Copy link
Author

scabug commented Jan 16, 2013

@VladUreche said:
I was using the virtualized pattern matcher and a build of 2.10.0-wip.

@scabug scabug closed this as completed Jan 17, 2013
@scabug
Copy link
Author

scabug commented Jan 17, 2013

@VladUreche said:
Thank you Adriaan and Paul!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants