Aladdin - Scala Bugtracking
[#146] project: compiler priority: medium category: bug
submitter assigned to status date submitted
Matthias Michel fixed 2003-09-19 12:23:40.0
subject Non-verifiable code for lshl instructions
code
object Bug with Executable {
  def shift32(x: Int): Long = x.asInstanceOf[Long] << 32;
}
what happened
Yields a verifier error at runtime:
Exception in thread "main" java.lang.VerifyError: (class: Bug$, method: shift32signature: (I)J)
    Expecting to find integer on stack
        at Bug.main(Bug.scala)
what expected The generated code is:
Method long shift32(int)
   0 iload 1
   2 invokestatic #81 [Method scala.Int box(int)]
   5 invokevirtual #86 [Method long asLong()]
   8 ldc #87 [Integer 32]
  10 i2l
  11 lshl
  12 lreturn
The instruction at address 10 is erroneous (or better superfluous). The second argument of lshl on the stack has to be an integer. I was also surprised that there was boxing involved in this expression. I believe programmers expect that such sort of expressions are really efficient, but in our case, it even involved method calls and object instantiations.
[back to overview]
Changes of this bug report
Matthias  edited on  2003-09-19 12:24:28.0
Matthias  edited on  2003-09-19 12:26:15.0
Matthias  edited on  2003-09-24 15:15:02.0
I fixed this specific issue, but the code generation routine for operations on primitive types doesn't look good in general.