Skip to content

Commit 0cdfa13

Browse files
committed
Merge pull request #18 from lrytz/backendWip
Backend wip
2 parents fa9074c + 266caf5 commit 0cdfa13

File tree

6 files changed

+50
-43
lines changed

6 files changed

+50
-43
lines changed

src/dotty/tools/dotc/backend/jvm/BCodeBodyBuilder.scala

+23-20
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
241241

242242
def elementType = enteringTyper {
243243
val arrayParent = tpe :: tpe.parents collectFirst {
244-
case dotc.core.Types.TypeRef(_, ArrayClass, elem :: Nil) => elem
244+
case dotc.core.Types.TypeRef(_, ctx.definitions.ArrayClass, elem :: Nil) => elem
245245
}
246246
arrayParent getOrElse sys.error(fun.fullName + " : " + (tpe :: tpe.baseTypeSeq.toList).mkString(", "))
247247
}
@@ -353,7 +353,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
353353
case lblDf : LabelDef => genLabelDef(lblDf, expectedType)
354354

355355
case ValDef(_, nme.THIS, _, _) =>
356-
debuglog("skipping trivial assign to _$this: " + tree)
356+
ctx.debuglog("skipping trivial assign to _$this: " + tree)
357357

358358
case ValDef(_, _, _, rhs) =>
359359
val sym = tree.symbol
@@ -400,7 +400,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
400400
else {
401401
mnode.visitVarInsn(asm.Opcodes.ALOAD, 0)
402402
generatedType =
403-
if (tree.symbol == ArrayClass) ObjectReference
403+
if (tree.symbol == ctx.definitions.ArrayClass) ObjectReference
404404
else brefType(thisName) // inner class (if any) for claszSymbol already tracked.
405405
}
406406

@@ -412,7 +412,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
412412
val sym = tree.symbol
413413
generatedType = symInfoTK(sym)
414414
val hostClass = findHostClass(qualifier.tpe, sym)
415-
debuglog(s"Host class of $sym with qual $qualifier (${qualifier.tpe}) is $hostClass")
415+
ctx.debuglog(s"Host class of $sym with qual $qualifier (${qualifier.tpe}) is $hostClass")
416416
val qualSafeToElide = treeInfo isQualifierSafeToElide qualifier
417417

418418
def genLoadQualUnlessElidable(): Unit = { if (!qualSafeToElide) { genLoadQualifier(tree) } }
@@ -440,11 +440,12 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
440440
}
441441

442442
case Literal(value) =>
443+
import core.Constants._
443444
if (value.tag != UnitTag) (value.tag, expectedType) match {
444-
case (dotc.core.Constants.IntTag, LONG ) => bc.lconst(value.longValue); generatedType = LONG
445-
case (dotc.core.Constants.FloatTag, DOUBLE) => bc.dconst(value.doubleValue); generatedType = DOUBLE
446-
case (dotc.core.Constants.NullTag, _ ) => bc.emit(asm.Opcodes.ACONST_NULL); generatedType = RT_NULL
447-
case _ => genConstant(value); generatedType = tpeTK(tree)
445+
case (IntTag, LONG ) => bc.lconst(value.longValue); generatedType = LONG
446+
case (FloatTag, DOUBLE) => bc.dconst(value.doubleValue); generatedType = DOUBLE
447+
case (NullTag, _ ) => bc.emit(asm.Opcodes.ACONST_NULL); generatedType = RT_NULL
448+
case _ => genConstant(value); generatedType = tpeTK(tree)
448449
}
449450

450451
case blck : Block => genBlock(blck, expectedType)
@@ -517,7 +518,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
517518
*/
518519
def genConstant(const: Constant): Unit = {
519520

520-
import dotc.core.Constants._
521+
import core.Constants._
521522

522523
(const.tag: @switch) match {
523524

@@ -587,7 +588,10 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
587588
case nextCleanup :: rest =>
588589
if (saveReturnValue) {
589590
if (insideCleanupBlock) {
590-
cunit.warning(r.pos, "Return statement found in finally-clause, discarding its return-value in favor of that of a more deeply nested return.")
591+
ctx.warning(
592+
"Return statement found in finally-clause, discarding its return-value in favor of that of a more deeply nested return.",
593+
core.Decorators.sourcePos(r.pos)
594+
)
591595
bc drop returnType
592596
} else {
593597
// regarding return value, the protocol is: in place of a `return-stmt`, a sequence of `adapt, store, jump` are inserted.
@@ -611,11 +615,10 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
611615
case Apply(TypeApply(fun, targs), _) =>
612616

613617
val sym = fun.symbol
614-
val cast = sym match {
615-
case Object_isInstanceOf => false
616-
case Object_asInstanceOf => true
617-
case _ => abort(s"Unexpected type application $fun[sym: ${sym.fullName}] in: $app")
618-
}
618+
val cast =
619+
if (sym == ctx.definitions.Object_isInstanceOf) false
620+
else if (sym == ctx.definitions.Object_asInstanceOf) true
621+
else abort(s"Unexpected type application $fun[sym: ${sym.fullName}] in: $app")
619622

620623
val Select(obj, _) = fun
621624
val l = tpeTK(obj)
@@ -753,7 +756,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
753756
fun match {
754757
case Select(qual, _) =>
755758
val qualSym = findHostClass(qual.tpe, sym)
756-
if (qualSym == ArrayClass) {
759+
if (qualSym == ctx.definitions.ArrayClass) {
757760
targetTypeKind = tpeTK(qual)
758761
ctx.log(s"Stored target type kind for ${sym.fullName} as $targetTypeKind")
759762
}
@@ -766,7 +769,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
766769

767770
case _ =>
768771
}
769-
if ((targetTypeKind != null) && (sym == definitions.Array_clone) && invokeStyle.isDynamic) {
772+
if ((targetTypeKind != null) && (sym == ctx.definitions.Array_clone) && invokeStyle.isDynamic) {
770773
val target: String = targetTypeKind.getInternalName
771774
bc.invokevirtual(target, "clone", "()Ljava/lang/Object;")
772775
}
@@ -910,7 +913,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
910913
}
911914

912915
/* Generate code that loads args into label parameters. */
913-
def genLoadLabelArguments(args: List[Tree], lblDef: LabelDef, gotoPos: dotc.util.Positions.Position): Unit = {
916+
def genLoadLabelArguments(args: List[Tree], lblDef: LabelDef, gotoPos: util.Positions.Position): Unit = {
914917

915918
val aps = {
916919
val params: List[Symbol] = lblDef.params.map(_.symbol)
@@ -1024,7 +1027,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
10241027
def genCallMethod(method: Symbol,
10251028
style: InvokeStyle,
10261029
hostClass0: Symbol = null,
1027-
pos: dotc.util.Positions.Position = dotc.util.Positions.NoPosition) {
1030+
pos: util.Positions.Position = util.Positions.NoPosition) {
10281031

10291032
val siteSymbol = claszSymbol
10301033
val hostSymbol = if (hostClass0 == null) method.owner else hostClass0;
@@ -1307,7 +1310,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
13071310

13081311
markProgramPoint(lNonNull)
13091312
locals.load(eqEqTempLocal)
1310-
genCallMethod(Object_equals, icodes.opcodes.Dynamic)
1313+
genCallMethod(ctx.definitions.Object_equals, icodes.opcodes.Dynamic)
13111314
genCZJUMP(success, failure, icodes.NE, BOOL)
13121315
}
13131316
}

src/dotty/tools/dotc/backend/jvm/BCodeGlue.scala

+3-1
Original file line numberDiff line numberDiff line change
@@ -621,7 +621,9 @@ abstract class BCodeGlue {
621621
*
622622
* must-single-thread
623623
*/
624-
def brefType(iname: String): BType = { brefType(dotc.core.Names.typeName(iname.toCharArray(), 0, iname.length())) }
624+
def brefType(iname: String): BType = {
625+
brefType(core.Names.typeName(iname.toCharArray(), 0, iname.length()))
626+
}
625627

626628
/*
627629
* Creates a BType token for the TypeName received as argument.

src/dotty/tools/dotc/backend/jvm/BCodeHelpers.scala

+13-12
Original file line numberDiff line numberDiff line change
@@ -142,14 +142,14 @@ abstract class BCodeHelpers extends BCodeTypes with BytecodeWriters {
142142
*/
143143
object isJavaEntryPoint {
144144

145-
import dotc.core.Types.{MethodType, PolyType}
145+
import core.Types.{MethodType, PolyType}
146146

147147
/*
148148
* must-single-thread
149149
*/
150-
def apply(sym: Symbol, csymCompUnit: CompilationUnit): Boolean = {
151-
def fail(msg: String, pos: dotc.util.Positions.Position = sym.pos) = {
152-
csymCompUnit.warning(sym.pos,
150+
def apply(sym: Symbol, ctx: Context): Boolean = {
151+
def fail(msg: String, pos: util.Positions.Position = sym.pos) = {
152+
ctx.warning(sym.pos,
153153
sym.name +
154154
s" has a main method with parameter type Array[String], but ${sym.fullName('.')} will not be a runnable program.\n Reason: $msg"
155155
// TODO: make this next claim true, if possible
@@ -491,7 +491,7 @@ abstract class BCodeHelpers extends BCodeTypes with BytecodeWriters {
491491
}
492492

493493
def primitiveOrRefType(sym: Symbol): BType = {
494-
assert(sym != definitions.ArrayClass, "Use primitiveOrArrayOrRefType() instead.")
494+
assert(sym != ctx.definitions.ArrayClass, "Use primitiveOrArrayOrRefType() instead.")
495495

496496
primitiveTypeMap.getOrElse(sym, newReference(sym))
497497
}
@@ -512,25 +512,25 @@ abstract class BCodeHelpers extends BCodeTypes with BytecodeWriters {
512512
}
513513
}
514514

515-
import dotc.core.Types.{ThisType, ConstantType, TypeRef, ClassInfo}
515+
import core.Types.{ThisType, ConstantType, TypeRef, ClassInfo}
516516

517517
// Call to .normalize fixes #3003 (follow type aliases). Otherwise, primitiveOrArrayOrRefType() would return ObjectReference.
518518
t match {
519519

520520
case ThisType(sym) =>
521-
if (sym == ArrayClass) ObjectReference
522-
else phantomTypeMap.getOrElse(sym, exemplar(sym).c)
521+
if (sym == ctx.definitions.ArrayClass) ObjectReference
522+
else phantomTypeMap.getOrElse(sym, exemplar(sym).c)
523523

524524
case SingleType(_, sym) => primitiveOrRefType(sym)
525525

526526
case _: ConstantType => toTypeKind(t.underlying)
527527

528528
case TypeRef(_, sym, args) =>
529-
if (sym == ArrayClass) arrayOf(toTypeKind(args.head))
530-
else primitiveOrRefType2(sym)
529+
if (sym == ctx.definitions.ArrayClass) arrayOf(toTypeKind(args.head))
530+
else primitiveOrRefType2(sym)
531531

532532
case ClassInfo(_, _, sym) =>
533-
assert(sym != ArrayClass, "ClassInfoType to ArrayClass!")
533+
assert(sym != ctx.definitions.ArrayClass, "ClassInfoType to ArrayClass!")
534534
primitiveOrRefType(sym)
535535

536536
case norm => abort(
@@ -667,9 +667,10 @@ abstract class BCodeHelpers extends BCodeTypes with BytecodeWriters {
667667
(arg: @unchecked) match {
668668

669669
case LiteralAnnotArg(const) =>
670+
import core.Constants._
670671
if (const.isNonUnitAnyVal) { av.visit(name, const.value) }
671672
else {
672-
const.tag match {
673+
(const.tag: @switch) match {
673674
case StringTag =>
674675
assert(const.value != null, const) // TODO this invariant isn't documented in `case class Constant`
675676
av.visit(name, const.stringValue) // `stringValue` special-cases null, but that execution path isn't exercised for a const with StringTag

src/dotty/tools/dotc/backend/jvm/BCodeIdiomatic.scala

+1
Original file line numberDiff line numberDiff line change
@@ -693,6 +693,7 @@ abstract class BCodeIdiomatic extends BCodeGlue {
693693
}
694694

695695
def abort(msg: => AnyRef)(implicit ctx: Context): Nothing = {
696+
// TODO(lrytz) If this is indeed the right way to abort, this method should probably be added somewhere more centrally (Context?)
696697
ctx.error(msg)
697698
throw new FatalError(msg)
698699
}

src/dotty/tools/dotc/backend/jvm/icodes.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ object icodes {
150150
/** Call through super[mix].
151151
* On JVM, translated to `invokespecial`.
152152
*/
153-
case class SuperCall(mix: dotc.core.Names.TermName) extends InvokeStyle {
153+
case class SuperCall(mix: core.Names.TermName) extends InvokeStyle {
154154
override def isSuper = true
155155
override def toString(): String = { "super(" + mix + ")" }
156156
}

src/dotty/tools/dotc/backend/jvm/scalaPrimitives.scala

+9-9
Original file line numberDiff line numberDiff line change
@@ -223,13 +223,13 @@ object scalaPrimitives {
223223
import core.StdNames.nme
224224

225225
// scala.Array
226-
val ArrayClass = defn.ArrayClass
226+
lazy val ArrayClass = defn.ArrayClass
227227
addPrimitives(ArrayClass, nme.length, LENGTH)
228228
addPrimitives(ArrayClass, nme.apply, APPLY)
229229
addPrimitives(ArrayClass, nme.update, UPDATE)
230230

231231
// scala.Boolean
232-
val BooleanClass = defn.BooleanClass
232+
lazy val BooleanClass = defn.BooleanClass
233233
addPrimitives(BooleanClass, nme.EQ, EQ)
234234
addPrimitives(BooleanClass, nme.NE, NE)
235235
addPrimitives(BooleanClass, nme.UNARY_!, ZNOT)
@@ -240,7 +240,7 @@ object scalaPrimitives {
240240
addPrimitives(BooleanClass, nme.XOR, XOR)
241241

242242
// scala.Byte
243-
val ByteClass = defn.ByteClass
243+
lazy val ByteClass = defn.ByteClass
244244
addPrimitives(ByteClass, nme.EQ, EQ)
245245
addPrimitives(ByteClass, nme.NE, NE)
246246
addPrimitives(ByteClass, nme.ADD, ADD)
@@ -273,7 +273,7 @@ object scalaPrimitives {
273273
addPrimitives(ByteClass, nme.toDouble, B2D)
274274

275275
// scala.Short
276-
val ShortClass = defn.ShortClass
276+
lazy val ShortClass = defn.ShortClass
277277
addPrimitives(ShortClass, nme.EQ, EQ)
278278
addPrimitives(ShortClass, nme.NE, NE)
279279
addPrimitives(ShortClass, nme.ADD, ADD)
@@ -306,7 +306,7 @@ object scalaPrimitives {
306306
addPrimitives(ShortClass, nme.toDouble, S2D)
307307

308308
// scala.Char
309-
val CharClass = defn.CharClass
309+
lazy val CharClass = defn.CharClass
310310
addPrimitives(CharClass, nme.EQ, EQ)
311311
addPrimitives(CharClass, nme.NE, NE)
312312
addPrimitives(CharClass, nme.ADD, ADD)
@@ -338,7 +338,7 @@ object scalaPrimitives {
338338
addPrimitives(CharClass, nme.toDouble, C2D)
339339

340340
// scala.Int
341-
val IntClass = defn.IntClass
341+
lazy val IntClass = defn.IntClass
342342
addPrimitives(IntClass, nme.EQ, EQ)
343343
addPrimitives(IntClass, nme.NE, NE)
344344
addPrimitives(IntClass, nme.ADD, ADD)
@@ -370,7 +370,7 @@ object scalaPrimitives {
370370
addPrimitives(IntClass, nme.toDouble, I2D)
371371

372372
// scala.Long
373-
val LongClass = defn.LongClass
373+
lazy val LongClass = defn.LongClass
374374
addPrimitives(LongClass, nme.EQ, EQ)
375375
addPrimitives(LongClass, nme.NE, NE)
376376
addPrimitives(LongClass, nme.ADD, ADD)
@@ -402,7 +402,7 @@ object scalaPrimitives {
402402
addPrimitives(LongClass, nme.toDouble, L2D)
403403

404404
// scala.Float
405-
val FloatClass = defn.FloatClass
405+
lazy val FloatClass = defn.FloatClass
406406
addPrimitives(FloatClass, nme.EQ, EQ)
407407
addPrimitives(FloatClass, nme.NE, NE)
408408
addPrimitives(FloatClass, nme.ADD, ADD)
@@ -427,7 +427,7 @@ object scalaPrimitives {
427427
addPrimitives(FloatClass, nme.UNARY_-, NEG)
428428

429429
// scala.Double
430-
val DoubleClass = defn.DoubleClass
430+
lazy val DoubleClass = defn.DoubleClass
431431
addPrimitives(DoubleClass, nme.EQ, EQ)
432432
addPrimitives(DoubleClass, nme.NE, NE)
433433
addPrimitives(DoubleClass, nme.ADD, ADD)

0 commit comments

Comments
 (0)