Skip to content

Commit d366746

Browse files
committed
Merge pull request scala#4842 from adriaanm/fields-prep
Set the scene for phase 1 of the new trait encoding.
2 parents fe33616 + 5160387 commit d366746

File tree

17 files changed

+451
-428
lines changed

17 files changed

+451
-428
lines changed

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

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -384,15 +384,6 @@ class Global(var currentSettings: Settings, var reporter: Reporter)
384384

385385
def apply(unit: CompilationUnit): Unit
386386

387-
private val isErased = prev.name == "erasure" || prev.erasedTypes
388-
override def erasedTypes: Boolean = isErased
389-
private val isFlat = prev.name == "flatten" || prev.flatClasses
390-
override def flatClasses: Boolean = isFlat
391-
private val isSpecialized = prev.name == "specialize" || prev.specialized
392-
override def specialized: Boolean = isSpecialized
393-
private val isRefChecked = prev.name == "refchecks" || prev.refChecked
394-
override def refChecked: Boolean = isRefChecked
395-
396387
/** Is current phase cancelled on this unit? */
397388
def cancelled(unit: CompilationUnit) = {
398389
// run the typer only if in `createJavadoc` mode

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

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ package scala.tools.nsc.backend.jvm
88
import scala.tools.asm.tree.{InsnList, AbstractInsnNode, ClassNode, MethodNode}
99
import java.io.{StringWriter, PrintWriter}
1010
import scala.tools.asm.util.{CheckClassAdapter, TraceClassVisitor, TraceMethodVisitor, Textifier}
11-
import scala.tools.asm.{ClassWriter, Attribute, ClassReader}
11+
import scala.tools.asm.{ClassReader, ClassWriter, Attribute}
1212
import scala.collection.convert.decorateAsScala._
13+
import scala.collection.convert.decorateAsJava._
1314
import scala.tools.nsc.backend.jvm.analysis.InitialProducer
1415
import scala.tools.nsc.backend.jvm.opt.InlineInfoAttributePrototype
1516

@@ -55,11 +56,30 @@ object AsmUtils {
5556
node
5657
}
5758

58-
def readClass(filename: String): ClassNode = {
59-
val f = new java.io.RandomAccessFile(filename, "r")
60-
val b = new Array[Byte](f.length.toInt)
61-
f.read(b)
62-
readClass(b)
59+
def readClass(filename: String): ClassNode = readClass(classBytes(filename))
60+
61+
def classBytes(file: String): Array[Byte] = {
62+
val f = new java.io.RandomAccessFile(file, "r")
63+
val bytes = new Array[Byte](f.length.toInt)
64+
f.read(bytes)
65+
bytes
66+
}
67+
68+
def textifyClassStably(bytes: Array[Byte]): Unit = {
69+
val node = new ClassNode()
70+
new ClassReader(bytes).accept(node, ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES)
71+
72+
node.fields = node.fields.asScala.sortBy(_.name).asJava
73+
node.methods = node.methods.asScala.sortBy(_.name).asJava
74+
node.visibleAnnotations = null
75+
node.attrs = null
76+
node.invisibleAnnotations = null
77+
78+
println(textify(node))
79+
}
80+
81+
def main(args: Array[String]): Unit = {
82+
textifyClassStably(classBytes(args.head))
6383
}
6484

6585
/**

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1052,7 +1052,7 @@ abstract class BCodeHelpers extends BCodeIdiomatic with BytecodeWriters {
10521052

10531053
for (m <- moduleClass.info.membersBasedOnFlags(BCodeHelpers.ExcludedForwarderFlags, symtab.Flags.METHOD)) {
10541054
if (m.isType || m.isDeferred || (m.owner eq definitions.ObjectClass) || m.isConstructor)
1055-
debuglog(s"No forwarder for '$m' from $jclassName to '$moduleClass'")
1055+
debuglog(s"No forwarder for '$m' from $jclassName to '$moduleClass': ${m.isType} || ${m.isDeferred} || ${m.owner eq definitions.ObjectClass} || ${m.isConstructor}")
10561056
else if (conflictingNames(m.name))
10571057
log(s"No forwarder for $m due to conflict with ${linkedClass.info.member(m.name)}")
10581058
else if (m.hasAccessBoundary)

src/compiler/scala/tools/nsc/transform/AddInterfaces.scala

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -242,20 +242,18 @@ abstract class AddInterfaces extends InfoTransform { self: Erasure =>
242242
}
243243
}
244244

245-
private def createMemberDef(tree: Tree, isForInterface: Boolean)(create: Tree => Tree) = {
246-
val isInterfaceTree = tree.isDef && isInterfaceMember(tree.symbol)
247-
if (isInterfaceTree && needsImplMethod(tree.symbol))
248-
create(tree)
249-
else if (isInterfaceTree == isForInterface)
250-
tree
251-
else
252-
EmptyTree
253-
}
254-
private def implMemberDef(tree: Tree): Tree = createMemberDef(tree, false)(implMethodDef)
255-
private def ifaceMemberDef(tree: Tree): Tree = createMemberDef(tree, true)(t => DefDef(t.symbol, EmptyTree))
245+
private def isInterfaceTree(tree: Tree) = tree.isDef && isInterfaceMember(tree.symbol)
246+
247+
private def deriveMemberForImplClass(tree: Tree): Tree =
248+
if (isInterfaceTree(tree)) if (needsImplMethod(tree.symbol)) implMethodDef(tree) else EmptyTree
249+
else tree
250+
251+
private def deriveMemberForInterface(tree: Tree): Tree =
252+
if (isInterfaceTree(tree)) if (needsImplMethod(tree.symbol)) DefDef(tree.symbol, EmptyTree) else tree
253+
else EmptyTree
256254

257255
private def ifaceTemplate(templ: Template): Template =
258-
treeCopy.Template(templ, templ.parents, noSelfType, templ.body map ifaceMemberDef)
256+
treeCopy.Template(templ, templ.parents, noSelfType, templ.body map deriveMemberForInterface)
259257

260258
/** Transforms the member tree containing the implementation
261259
* into a member of the impl class.
@@ -286,7 +284,7 @@ abstract class AddInterfaces extends InfoTransform { self: Erasure =>
286284

287285
private def implTemplate(clazz: Symbol, templ: Template): Template = atPos(templ.pos) {
288286
val templ1 = (
289-
Template(templ.parents, noSelfType, addMixinConstructorDef(clazz, templ.body map implMemberDef))
287+
Template(templ.parents, noSelfType, addMixinConstructorDef(clazz, templ.body map deriveMemberForImplClass))
290288
setSymbol clazz.newLocalDummy(templ.pos)
291289
)
292290
templ1.changeOwner(templ.symbol.owner -> clazz, templ.symbol -> templ1.symbol)

src/compiler/scala/tools/nsc/transform/CleanUp.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ abstract class CleanUp extends Statics with Transform with ast.TreeDSL {
4949
clearStatics()
5050
val newBody = transformTrees(body)
5151
val templ = deriveTemplate(tree)(_ => transformTrees(newStaticMembers.toList) ::: newBody)
52-
try addStaticInits(templ, newStaticInits, localTyper) // postprocess to include static ctors
52+
try
53+
if (newStaticInits.isEmpty) templ
54+
else deriveTemplate(templ)(body => staticConstructor(body, localTyper, templ.pos)(newStaticInits.toList) :: body)
5355
finally clearStatics()
5456
}
5557
private def mkTerm(prefix: String): TermName = unit.freshTermName(prefix)

0 commit comments

Comments
 (0)