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

Alias type prevents the pattern matcher from generating tableswitches #6955

Closed
scabug opened this Issue Jan 10, 2013 · 3 comments

Comments

Projects
None yet
2 participants
@scabug
Copy link

scabug commented Jan 10, 2013

If the type of the matchee is a type alias, it seems the pattern matcher won't go that extra mile to dealias it and see if it's an Int-like value:

$ cat testTableSwitch.scala 
package test.switch

object Test {
  type Tag = Byte

  def switchBad(i: Tag): Int = i match { // notice type of i is Tag = Byte
    case 1 => 1
    case 2 => 2
    case 3 => 3
    case _ => 0
  }

  def switchOkay(i: Byte): Int = i match { // notice type of i is Byte
    case 1 => 1
    case 2 => 2
    case 3 => 3
    case _ => 0
  }
}
$ 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 each value individually ...

      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

This comment has been minimized.

Copy link
Author

scabug commented Jan 10, 2013

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

@scabug

This comment has been minimized.

Copy link
Author

scabug commented Jan 10, 2013

@paulp said:
Oh good, yet ANOTHER example of moors regressing my beautiful working pattern matcher. Tests? I thought he was better than that! In 2.8 and 2.9:

  public int switchBad(byte);
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=3, args_size=2
         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

This comment has been minimized.

Copy link
Author

scabug commented Jan 10, 2013

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