summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/scala-compiler.jar.desired.sha12
-rw-r--r--src/compiler/scala/tools/nsc/ast/TreeGen.scala14
-rw-r--r--src/compiler/scala/tools/nsc/ast/TreePrinters.scala3
3 files changed, 15 insertions, 4 deletions
diff --git a/lib/scala-compiler.jar.desired.sha1 b/lib/scala-compiler.jar.desired.sha1
index 4ebde8cc02..9b42928d0d 100644
--- a/lib/scala-compiler.jar.desired.sha1
+++ b/lib/scala-compiler.jar.desired.sha1
@@ -1 +1 @@
-f11b2adece27e9911372466c3a14c67e61f6d42d ?scala-compiler.jar
+f39fa1359f164294d0bab462c2abbcad629194bb ?scala-compiler.jar
diff --git a/src/compiler/scala/tools/nsc/ast/TreeGen.scala b/src/compiler/scala/tools/nsc/ast/TreeGen.scala
index 219f781605..f2a3aa15fb 100644
--- a/src/compiler/scala/tools/nsc/ast/TreeGen.scala
+++ b/src/compiler/scala/tools/nsc/ast/TreeGen.scala
@@ -307,9 +307,10 @@ abstract class TreeGen
/** Used in situations where you need to access value of an expression several times
*/
- def evalOnce(expr: Tree, owner: Symbol, unit: CompilationUnit)(within: (() => Tree) => Tree): Tree =
+ def evalOnce(expr: Tree, owner: Symbol, unit: CompilationUnit)(within: (() => Tree) => Tree): Tree = {
+ var used = false
if (treeInfo.isPureExpr(expr)) {
- within(() => expr);
+ within(() => if (used) expr.duplicate else { used = true; expr })
} else {
val temp = owner.newValue(expr.pos.makeTransparent, unit.fresh.newName(expr.pos, "ev$"))
.setFlag(SYNTHETIC).setInfo(expr.tpe)
@@ -317,19 +318,26 @@ abstract class TreeGen
ensureNonOverlapping(containing, List(expr))
Block(List(ValDef(temp, expr)), containing) setPos (containing.pos union expr.pos)
}
+ }
def evalOnceAll(exprs: List[Tree], owner: Symbol, unit: CompilationUnit)(within: (List[() => Tree]) => Tree): Tree = {
val vdefs = new ListBuffer[ValDef]
val exprs1 = new ListBuffer[() => Tree]
+ val used = new Array[Boolean](exprs.length)
+ var i = 0
for (expr <- exprs) {
if (treeInfo.isPureExpr(expr)) {
- exprs1 += (() => expr)
+ exprs1 += {
+ val idx = i
+ () => if (used(idx)) expr.duplicate else { used(idx) = true; expr }
+ }
} else {
val temp = owner.newValue(expr.pos.makeTransparent, unit.fresh.newName(expr.pos, "ev$"))
.setFlag(SYNTHETIC).setInfo(expr.tpe)
vdefs += ValDef(temp, expr)
exprs1 += (() => Ident(temp) setPos temp.pos.focus setType expr.tpe)
}
+ i += 1
}
val prefix = vdefs.toList
val containing = within(exprs1.toList)
diff --git a/src/compiler/scala/tools/nsc/ast/TreePrinters.scala b/src/compiler/scala/tools/nsc/ast/TreePrinters.scala
index fe2fa4513d..f208cc54fb 100644
--- a/src/compiler/scala/tools/nsc/ast/TreePrinters.scala
+++ b/src/compiler/scala/tools/nsc/ast/TreePrinters.scala
@@ -376,6 +376,9 @@ abstract class TreePrinters {
print(tpt);
printColumn(whereClauses, " forSome { ", ";", "}")
+ case SelectFromArray(qualifier, name, _) =>
+ print(qualifier); print(".<arr>"); print(symName(tree, name))
+
case tree: StubTree =>
print(tree.toString)