diff options
author | Martin Odersky <odersky@gmail.com> | 2009-09-25 21:25:57 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2009-09-25 21:25:57 +0000 |
commit | 3fb279ed38ac8c6cb8614abfd1cda374429676f8 (patch) | |
tree | 196992565e1f54cd61bcee8c43c2d5b138d4f755 /src | |
parent | 726ca37676b2d26e263cf25ea0f1592d97f3bfb5 (diff) | |
download | scala-3fb279ed38ac8c6cb8614abfd1cda374429676f8.tar.gz scala-3fb279ed38ac8c6cb8614abfd1cda374429676f8.tar.bz2 scala-3fb279ed38ac8c6cb8614abfd1cda374429676f8.zip |
Fixed another array problem
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/ast/TreeGen.scala | 14 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/ast/TreePrinters.scala | 3 |
2 files changed, 14 insertions, 3 deletions
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) |