@@ -17,6 +17,7 @@ import scala.tools.asm
1717import GenBCode ._
1818import BackendReporting ._
1919import scala .tools .asm .tree .MethodInsnNode
20+ import scala .tools .nsc .backend .jvm .BCodeHelpers .TestOp
2021
2122/*
2223 *
@@ -34,7 +35,6 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
3435 * Functionality to build the body of ASM MethodNode, except for `synchronized` and `try` expressions.
3536 */
3637 abstract class PlainBodyBuilder (cunit : CompilationUnit ) extends PlainSkelBuilder (cunit) {
37- import icodes .TestOp
3838 import invokeStyles ._
3939
4040 /* If the selector type has a member with the right name,
@@ -120,7 +120,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
120120 code match {
121121 case POS => () // nothing
122122 case NEG => bc.neg(resKind)
123- case NOT => bc.genPrimitiveArithmetic(icodes. NOT , resKind)
123+ case NOT => bc.genPrimitiveNot( resKind)
124124 case _ => abort(s " Unknown unary operation: ${fun.symbol.fullName} code: $code" )
125125 }
126126
@@ -1104,10 +1104,10 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
11041104 (tk : @ unchecked) match {
11051105 case LONG => emit(asm.Opcodes .LCMP )
11061106 case FLOAT =>
1107- if (op == icodes .LT || op == icodes .LE ) emit(asm.Opcodes .FCMPG )
1107+ if (op == TestOp .LT || op == TestOp .LE ) emit(asm.Opcodes .FCMPG )
11081108 else emit(asm.Opcodes .FCMPL )
11091109 case DOUBLE =>
1110- if (op == icodes .LT || op == icodes .LE ) emit(asm.Opcodes .DCMPG )
1110+ if (op == TestOp .LT || op == TestOp .LE ) emit(asm.Opcodes .DCMPG )
11111111 else emit(asm.Opcodes .DCMPL )
11121112 }
11131113 bc.emitIF(op, success)
@@ -1122,8 +1122,8 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
11221122 } else if (tk.isRef) { // REFERENCE(_) | ARRAY(_)
11231123 // @unchecked because references aren't compared with GT, GE, LT, LE.
11241124 (op : @ unchecked) match {
1125- case icodes .EQ => bc emitIFNULL success
1126- case icodes .NE => bc emitIFNONNULL success
1125+ case TestOp .EQ => bc emitIFNULL success
1126+ case TestOp .NE => bc emitIFNONNULL success
11271127 }
11281128 } else {
11291129 (tk : @ unchecked) match {
@@ -1132,21 +1132,28 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
11321132 emit(asm.Opcodes .LCMP )
11331133 case FLOAT =>
11341134 emit(asm.Opcodes .FCONST_0 )
1135- if (op == icodes .LT || op == icodes .LE ) emit(asm.Opcodes .FCMPG )
1135+ if (op == TestOp .LT || op == TestOp .LE ) emit(asm.Opcodes .FCMPG )
11361136 else emit(asm.Opcodes .FCMPL )
11371137 case DOUBLE =>
11381138 emit(asm.Opcodes .DCONST_0 )
1139- if (op == icodes .LT || op == icodes .LE ) emit(asm.Opcodes .DCMPG )
1139+ if (op == TestOp .LT || op == TestOp .LE ) emit(asm.Opcodes .DCMPG )
11401140 else emit(asm.Opcodes .DCMPL )
11411141 }
11421142 bc.emitIF(op, success)
11431143 }
11441144 bc goTo failure
11451145 }
11461146
1147- val testOpForPrimitive : Array [TestOp ] = Array (
1148- icodes.EQ , icodes.NE , icodes.EQ , icodes.NE , icodes.LT , icodes.LE , icodes.GE , icodes.GT
1149- )
1147+ def testOpForPrimitive (primitiveCode : Int ) = (primitiveCode : @ switch) match {
1148+ case scalaPrimitives.ID => TestOp .EQ
1149+ case scalaPrimitives.NI => TestOp .NE
1150+ case scalaPrimitives.EQ => TestOp .EQ
1151+ case scalaPrimitives.NE => TestOp .NE
1152+ case scalaPrimitives.LT => TestOp .LT
1153+ case scalaPrimitives.LE => TestOp .LE
1154+ case scalaPrimitives.GE => TestOp .GE
1155+ case scalaPrimitives.GT => TestOp .GT
1156+ }
11501157
11511158 /** Some useful equality helpers. */
11521159 def isNull (t : Tree ) = PartialFunction .cond(t) { case Literal (Constant (null )) => true }
@@ -1162,7 +1169,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
11621169 private def genCond (tree : Tree , success : asm.Label , failure : asm.Label ) {
11631170
11641171 def genComparisonOp (l : Tree , r : Tree , code : Int ) {
1165- val op : TestOp = testOpForPrimitive(code - scalaPrimitives. ID )
1172+ val op : TestOp = testOpForPrimitive(code)
11661173 // special-case reference (in)equality test for null (null eq x, x eq null)
11671174 var nonNullSide : Tree = null
11681175 if (scalaPrimitives.isReferenceEqualityOp(code) &&
@@ -1181,7 +1188,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
11811188
11821189 def default () = {
11831190 genLoad(tree, BOOL )
1184- genCZJUMP(success, failure, icodes .NE , BOOL )
1191+ genCZJUMP(success, failure, TestOp .NE , BOOL )
11851192 }
11861193
11871194 lineNumber(tree)
@@ -1259,23 +1266,23 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
12591266 genLoad(l, ObjectRef )
12601267 genLoad(r, ObjectRef )
12611268 genCallMethod(equalsMethod, Static (onInstance = false ), pos)
1262- genCZJUMP(success, failure, icodes .NE , BOOL )
1269+ genCZJUMP(success, failure, TestOp .NE , BOOL )
12631270 }
12641271 else {
12651272 if (isNull(l)) {
12661273 // null == expr -> expr eq null
12671274 genLoad(r, ObjectRef )
1268- genCZJUMP(success, failure, icodes .EQ , ObjectRef )
1275+ genCZJUMP(success, failure, TestOp .EQ , ObjectRef )
12691276 } else if (isNull(r)) {
12701277 // expr == null -> expr eq null
12711278 genLoad(l, ObjectRef )
1272- genCZJUMP(success, failure, icodes .EQ , ObjectRef )
1279+ genCZJUMP(success, failure, TestOp .EQ , ObjectRef )
12731280 } else if (isNonNullExpr(l)) {
12741281 // SI-7852 Avoid null check if L is statically non-null.
12751282 genLoad(l, ObjectRef )
12761283 genLoad(r, ObjectRef )
12771284 genCallMethod(Object_equals , Dynamic , pos)
1278- genCZJUMP(success, failure, icodes .NE , BOOL )
1285+ genCZJUMP(success, failure, TestOp .NE , BOOL )
12791286 } else {
12801287 // l == r -> if (l eq null) r eq null else l.equals(r)
12811288 val eqEqTempLocal = locals.makeLocal(ObjectRef , nme.EQEQ_LOCAL_VAR .toString)
@@ -1286,17 +1293,17 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
12861293 genLoad(r, ObjectRef )
12871294 locals.store(eqEqTempLocal)
12881295 bc dup ObjectRef
1289- genCZJUMP(lNull, lNonNull, icodes .EQ , ObjectRef )
1296+ genCZJUMP(lNull, lNonNull, TestOp .EQ , ObjectRef )
12901297
12911298 markProgramPoint(lNull)
12921299 bc drop ObjectRef
12931300 locals.load(eqEqTempLocal)
1294- genCZJUMP(success, failure, icodes .EQ , ObjectRef )
1301+ genCZJUMP(success, failure, TestOp .EQ , ObjectRef )
12951302
12961303 markProgramPoint(lNonNull)
12971304 locals.load(eqEqTempLocal)
12981305 genCallMethod(Object_equals , Dynamic , pos)
1299- genCZJUMP(success, failure, icodes .NE , BOOL )
1306+ genCZJUMP(success, failure, TestOp .NE , BOOL )
13001307 }
13011308 }
13021309 }
0 commit comments