Skip to content

Commit b1b4e5c

Browse files
committed
wip: lambdalift fix
test/files/trait-defaults/lambdalift.scala works, but still some related tests failing (note that we can't use a bootstrapped compiler yet due to binary incompatibility in partest) Selected 34 tests drawn from specified tests !! 1 - pos/t6780.scala [compilation failed] ok 1 - neg/anytrait.scala ok 2 - neg/t1960.scala ok 3 - neg/t562.scala ok 4 - neg/t2796.scala ok 5 - neg/t5455.scala ok 6 - neg/delayed-init-ref.scala ok 7 - neg/t6446-show-phases.scala ok 8 - neg/t6446-missing ok 9 - neg/t6276.scala ok 10 - neg/t6829.scala ok 11 - neg/t6446-additional ok 12 - neg/t7494-no-options !! 1 - run/bugs.scala [output differs] !! 2 - run/inner-obj-auto.scala [non-zero exit code] ok 3 - run/delambdafy_t6555.scala ok 4 - run/delambdafy_t6028.scala ok 5 - run/preinits.scala ok 6 - run/lazy-locals.scala ok 7 - run/analyzerPlugins.scala ok 8 - run/t0936.scala ok 9 - run/programmatic-main.scala !! 10 - run/showraw_mods.scala [output differs] ok 11 - run/t4426.scala ok 12 - run/t5938.scala ok 13 - run/t6733.scala !! 14 - run/t7406.scala [non-zero exit code] ok 15 - run/t6555.scala ok 16 - run/t6028.scala ok 17 - run/t8002.scala ok 18 - run/t7533.scala ok 19 - run/t7569.scala ok 1 - jvm/t7006 !! 2 - jvm/innerClassAttribute [non-zero exit code] test/partest --update-check \ /Users/adriaan/git/scala/test/files/pos/t6780.scala \ /Users/adriaan/git/scala/test/files/run/bugs.scala \ /Users/adriaan/git/scala/test/files/run/inner-obj-auto.scala \ /Users/adriaan/git/scala/test/files/run/showraw_mods.scala \ /Users/adriaan/git/scala/test/files/run/t7406.scala \ /Users/adriaan/git/scala/test/files/jvm/innerClassAttribute
1 parent 81e7f67 commit b1b4e5c

File tree

3 files changed

+42
-18
lines changed

3 files changed

+42
-18
lines changed

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ abstract class LambdaLift extends InfoTransform {
148148
* }
149149
*/
150150
private def markFree(sym: Symbol, enclosure: Symbol): Boolean = {
151-
println(s"mark free: ${sym.fullLocationString} marked free in $enclosure")
151+
// println(s"mark free: ${sym.fullLocationString} marked free in $enclosure")
152152
(enclosure == sym.owner.logicallyEnclosingMember) || {
153153
debuglog("%s != %s".format(enclosure, sym.owner.logicallyEnclosingMember))
154154
if (enclosure.isPackageClass || !markFree(sym, enclosure.skipConstructor.owner.logicallyEnclosingMember)) false
@@ -167,15 +167,15 @@ abstract class LambdaLift extends InfoTransform {
167167
}
168168

169169
private def markCalled(sym: Symbol, owner: Symbol) {
170-
println(s"mark called: $sym of ${sym.owner} is called by $owner")
170+
// println(s"mark called: $sym of ${sym.owner} is called by $owner")
171171
symSet(called, owner) += sym
172172
if (sym.enclClass != owner.enclClass) calledFromInner += sym
173173
}
174174

175175
/** The traverse function */
176176
private val freeVarTraverser = new Traverser {
177177
override def traverse(tree: Tree) {
178-
try { //debug
178+
// try { //debug
179179
val sym = tree.symbol
180180
tree match {
181181
case ClassDef(_, _, _, _) =>
@@ -222,11 +222,11 @@ abstract class LambdaLift extends InfoTransform {
222222
case _ =>
223223
}
224224
super.traverse(tree)
225-
} catch {//debug
226-
case ex: Throwable =>
227-
Console.println(s"$ex while traversing $tree")
228-
throw ex
229-
}
225+
// } catch {//debug
226+
// case ex: Throwable =>
227+
// Console.println(s"$ex while traversing $tree")
228+
// throw ex
229+
// }
230230
}
231231
}
232232

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

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ abstract class Mixin extends InfoTransform with ast.TreeDSL {
4646
sym.owner.isImplClass
4747
&& sym.isMethod
4848
&& (!sym.isModule || sym.hasFlag(PRIVATE | LIFTED))
49-
&& (!(sym hasFlag (ACCESSOR | SUPERACCESSOR)) || sym.isLazy || !(sym hasFlag SYNTHESIZE_IMPL_IN_SUBCLASS))
49+
&& (!(sym hasFlag (ACCESSOR | SUPERACCESSOR)) || (sym hasFlag LAZY | PARAMACCESSOR)|| !(sym hasFlag SYNTHESIZE_IMPL_IN_SUBCLASS))
5050
)
5151

5252
/** A member of a trait is static only if it belongs only to the
@@ -159,7 +159,7 @@ abstract class Mixin extends InfoTransform with ast.TreeDSL {
159159
/** Add given member to given class, and mark member as mixed-in.
160160
*/
161161
def addMember(clazz: Symbol, member: Symbol): Symbol = {
162-
debuglog("new member of " + clazz + ":" + member.defString)
162+
// println(s"mixing into $clazz: ${member.defString}")
163163
clazz.info.decls enter member setFlag MIXEDIN
164164
}
165165
def cloneAndAddMember(mixinClass: Symbol, mixinMember: Symbol, clazz: Symbol): Symbol =
@@ -288,16 +288,18 @@ abstract class Mixin extends InfoTransform with ast.TreeDSL {
288288
def mixinTraitMembers(mixinClass: Symbol) {
289289
// For all members of a trait's interface do:
290290
for (mixinMember <- mixinClass.info.decls) {
291-
if (isConcreteAccessor(mixinMember) && mixinMember.isLazy) {
291+
if (isConcreteAccessor(mixinMember) && (mixinMember hasFlag LAZY | PARAMACCESSOR)) {
292292
if (isOverriddenAccessor(mixinMember, clazz.info.baseClasses))
293293
devWarning(s"Overridden concrete accessor: ${mixinMember.fullLocationString}")
294294
else {
295295
// mixin field accessors
296296
val mixedInAccessor = cloneAndAddMixinMember(mixinClass, mixinMember)
297-
initializer(mixedInAccessor) = (
298-
implClass(mixinClass).info.decl(mixinMember.name)
299-
orElse abort("Could not find initializer for " + mixinMember.name)
300-
)
297+
if (mixinMember hasFlag LAZY)
298+
initializer(mixedInAccessor) = (
299+
implClass(mixinClass).info.decl(mixinMember.name)
300+
orElse abort("Could not find initializer for " + mixinMember.name)
301+
)
302+
301303
if (!mixinMember.isSetter)
302304
mixinMember.tpe match {
303305
case MethodType(Nil, ConstantType(_)) =>
@@ -320,7 +322,7 @@ abstract class Mixin extends InfoTransform with ast.TreeDSL {
320322

321323
val newFlags = (
322324
( PrivateLocal )
323-
| ( mixinMember getFlag MUTABLE | LAZY)
325+
| ( mixinMember getFlag MUTABLE | LAZY | PARAMACCESSOR )
324326
| ( if (mixinMember.hasStableFlag) 0 else MUTABLE )
325327
)
326328

@@ -1063,7 +1065,7 @@ abstract class Mixin extends InfoTransform with ast.TreeDSL {
10631065
}
10641066
// if class is not a trait add accessor definitions
10651067
else if (!clazz.isTrait) {
1066-
if (isConcreteAccessor(sym) && sym.isLazy) {
1068+
if (isConcreteAccessor(sym) && (sym hasFlag LAZY | PARAMACCESSOR)) {
10671069
// add accessor definitions
10681070
addDefDef(sym, {
10691071
if (sym.isSetter) {
@@ -1090,7 +1092,7 @@ abstract class Mixin extends InfoTransform with ast.TreeDSL {
10901092

10911093
addDefDef(sym, rhs1)
10921094
}
1093-
else if (!sym.isMethod && sym.isLazy) {
1095+
else if (!sym.isMethod && (sym hasFlag LAZY | PARAMACCESSOR)) {
10941096
// add fields
10951097
addValDef(sym)
10961098
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Lift {
2+
def foo = {
3+
// this will be captured by the MouseHandler trait,
4+
// which gives rise to a new trait field during LambdaLift
5+
var Clicked = "Clicked"
6+
7+
def bar = Clicked
8+
9+
trait MouseHandler {
10+
def mouseClicked = Clicked + bar
11+
}
12+
13+
class CC extends MouseHandler
14+
15+
// new C {}
16+
(new CC).mouseClicked
17+
}
18+
}
19+
20+
object O extends Lift with App {
21+
println(foo)
22+
}

0 commit comments

Comments
 (0)