Skip to content

Commit 096bc3b

Browse files
committed
Remove the rest of ICodes
The only pieces of ICodes that were still used - An enum representing bytecode comparisons, re-implemented - The `icodes.IClass` class, which remains for sbt compatibility (scala#4588)
1 parent e6b62aa commit 096bc3b

File tree

8 files changed

+62
-230
lines changed

8 files changed

+62
-230
lines changed

src/compiler/scala/tools/nsc/CompilationUnits.scala

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,7 @@ trait CompilationUnits { global: Global =>
117117
*/
118118
def targetPos: Position = NoPosition
119119

120-
/** The icode representation of classes in this compilation unit.
121-
* It is empty up to phase 'icode'.
122-
*/
120+
/** For sbt compatibility (https://github.com/scala/scala/pull/4588) */
123121
val icode: LinkedHashSet[icodes.IClass] = new LinkedHashSet
124122

125123
@deprecated("Call global.reporter.echo directly instead.", "2.11.2")

src/compiler/scala/tools/nsc/Global.scala

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import ast.parser._
2525
import typechecker._
2626
import transform.patmat.PatternMatching
2727
import transform._
28-
import backend.icode.ICodes
2928
import backend.{ ScalaPrimitives, JavaPlatform }
3029
import backend.jvm.GenBCode
3130
import scala.language.postfixOps
@@ -137,10 +136,10 @@ class Global(var currentSettings: Settings, var reporter: Reporter)
137136
val global: Global.this.type = Global.this
138137
} with ConstantFolder
139138

140-
/** ICode generator */
141-
object icodes extends {
142-
val global: Global.this.type = Global.this
143-
} with ICodes
139+
/** For sbt compatibility (https://github.com/scala/scala/pull/4588) */
140+
object icodes {
141+
class IClass(val symbol: Symbol)
142+
}
144143

145144
/** Scala primitives, used in genicode */
146145
object scalaPrimitives extends {

src/compiler/scala/tools/nsc/backend/icode/ICodes.scala

Lines changed: 0 additions & 17 deletions
This file was deleted.

src/compiler/scala/tools/nsc/backend/icode/Members.scala

Lines changed: 0 additions & 40 deletions
This file was deleted.

src/compiler/scala/tools/nsc/backend/icode/Primitives.scala

Lines changed: 0 additions & 110 deletions
This file was deleted.

src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import scala.tools.asm
1717
import GenBCode._
1818
import BackendReporting._
1919
import 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
}

src/compiler/scala/tools/nsc/backend/jvm/BCodeHelpers.scala

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1352,4 +1352,18 @@ object BCodeHelpers {
13521352
asm.Opcodes.ACC_ABSTRACT | asm.Opcodes.ACC_SYNTHETIC | asm.Opcodes.ACC_ANNOTATION |
13531353
asm.Opcodes.ACC_ENUM
13541354
}
1355+
1356+
class TestOp(val op: Int) extends AnyVal {
1357+
def opcodeIF = asm.Opcodes.IFEQ + op
1358+
def opcodeIFICMP = asm.Opcodes.IF_ICMPEQ + op
1359+
}
1360+
1361+
object TestOp {
1362+
val EQ = new TestOp(0)
1363+
val NE = new TestOp(1)
1364+
val LT = new TestOp(2)
1365+
val GE = new TestOp(3)
1366+
val GT = new TestOp(4)
1367+
val LE = new TestOp(5)
1368+
}
13551369
}

0 commit comments

Comments
 (0)