diff options
Diffstat (limited to 'sources/scalac/transformer')
12 files changed, 87 insertions, 122 deletions
diff --git a/sources/scalac/transformer/AddConstructors.java b/sources/scalac/transformer/AddConstructors.java index 5ef1e1c406..d08581aa7c 100644 --- a/sources/scalac/transformer/AddConstructors.java +++ b/sources/scalac/transformer/AddConstructors.java @@ -179,10 +179,9 @@ public class AddConstructors extends GenTransformer { // add valdefs and class-level expression to the constructorr body constrBody.addAll(constrBody2); - Tree constrTree = constrBody.size() > 1 ? - gen.Block((Tree[])constrBody. - toArray(new Tree[constrBody.size()])): - (Tree) constrBody.get(0); + Tree constrTree = gen.mkUnitBlock( + clasz.primaryConstructor().pos, + (Tree[])constrBody.toArray(new Tree[constrBody.size()])); classBody.add(gen.DefDef(clasz.primaryConstructor(),constrTree)); @@ -210,7 +209,7 @@ public class AddConstructors extends GenTransformer { subst.removeSymbol(constructor.valueParams()); subst.removeSymbol(constructor.typeParams()); // add consistent result expression - rhs = gen.mkBlock(new Tree[] { rhs, gen.mkUnitLit(rhs.pos) }); + rhs = gen.mkUnitBlock(rhs); return gen.DefDef(initializer, rhs); case ValDef(_, _, _, _): diff --git a/sources/scalac/transformer/Erasure.java b/sources/scalac/transformer/Erasure.java index e6a5fdd795..5da45dd2c5 100644 --- a/sources/scalac/transformer/Erasure.java +++ b/sources/scalac/transformer/Erasure.java @@ -220,7 +220,7 @@ public class Erasure extends GenTransformer implements Modifiers { case Literal(AConstant.ZERO): return gen.mkNullLit(tree.pos); - case Block(_): + case Block(_, _): case If(_, _, _): case Switch(_, _, _, _): return transform(tree, tree.getType().fullErasure()); @@ -251,13 +251,8 @@ public class Erasure extends GenTransformer implements Modifiers { private Tree transform(Tree tree, Type pt) { switch (tree) { - case Block(Tree[] stats): - if (stats.length == 0) return transformUnit(tree.pos, pt); - stats = Tree.cloneArray(stats); - for (int i = 0; i < stats.length - 1; i++) - stats[i] = transform(stats[i]); - stats[stats.length - 1] = transform(stats[stats.length - 1], pt); - return gen.Block(tree.pos, stats); + case Block(Tree[] stats, Tree value): + return gen.Block(tree.pos, transform(stats), transform(value, pt)); case If(Tree cond, Tree thenp, Tree elsep): cond = transform(cond, UNBOXED_BOOLEAN); @@ -272,8 +267,9 @@ public class Erasure extends GenTransformer implements Modifiers { return gen.Switch(tree.pos, test, tags, bodies, otherwise, pt); case Return(_): + // !!! why do we build a block here? Tree value = transform(gen.mkDefaultValue(tree.pos, pt), pt); - return gen.mkBlock(new Tree[] {transform(tree), value}); + return gen.mkBlock(transform(tree), value); case LabelDef(_, _, _): case Assign(_, _): @@ -354,7 +350,7 @@ public class Erasure extends GenTransformer implements Modifiers { Symbol symbol = primitives.getBoxValueSymbol(tree.getType()); Tree boxtree = gen.mkGlobalRef(tree.pos, symbol); return tree.getType().equals(UNBOXED_UNIT) - ? gen.Block(new Tree[]{tree, gen.mkApply__(boxtree)}) + ? gen.mkBlock(tree, gen.mkApply__(boxtree)) : gen.mkApply_V(boxtree, new Tree[]{tree}); } diff --git a/sources/scalac/transformer/LambdaLift.java b/sources/scalac/transformer/LambdaLift.java index 7129d5bdab..b580812ecb 100644 --- a/sources/scalac/transformer/LambdaLift.java +++ b/sources/scalac/transformer/LambdaLift.java @@ -350,10 +350,10 @@ public class LambdaLift extends OwnerTransformer tree.type = descr.transform(tree.type, currentOwner); //System.out.println(tree.type);//DEBUG switch (tree) { - case Block(Tree[] stats): + case Block(Tree[] stats, Tree value): for (int i = 0; i < stats.length; i++) liftSymbol(stats[i]); - return copy.Block(tree, transform(stats)); + return copy.Block(tree, transform(stats), transform(value)); case ClassDef(int mods, _, AbsTypeDef[] tparams, ValDef[][] vparams, Tree tpe, Template impl): Symbol sym = tree.symbol(); @@ -461,9 +461,7 @@ public class LambdaLift extends OwnerTransformer // fn2 may be like "{ println("hello"); Predef}.Array" switch (fn2) { case Select(Tree qualifier, _): - return gen.Block( - args[0].pos, - new Tree[] {qualifier, array}); + return gen.mkBlock(args[0].pos, qualifier, array); default: throw Debug.abort("illegal case", fn2); } diff --git a/sources/scalac/transformer/TailCallPhase.java b/sources/scalac/transformer/TailCallPhase.java index 60574ad00c..a170671880 100644 --- a/sources/scalac/transformer/TailCallPhase.java +++ b/sources/scalac/transformer/TailCallPhase.java @@ -109,13 +109,8 @@ public class TailCallPhase extends Phase { method = null; return tree; - case Block(Tree[] stats): - if (stats.length == 0) return tree; - Tree expr = transform(stats[stats.length - 1]); - if (expr == stats[stats.length - 1]) return tree; - stats = Tree.cloneArray(stats); - stats[stats.length - 1] = expr; - return gen.Block(tree.pos, stats); + case Block(Tree[] stats, Tree value): + return gen.Block(tree.pos, stats, transform(value)); case If(Tree cond, Tree thenp, Tree elsep): Type type = tree.type(); diff --git a/sources/scalac/transformer/TransMatch.java b/sources/scalac/transformer/TransMatch.java index 19d1fc0eb8..e64191f385 100644 --- a/sources/scalac/transformer/TransMatch.java +++ b/sources/scalac/transformer/TransMatch.java @@ -94,14 +94,13 @@ public class TransMatch extends OwnerTransformer { Set nilvars = TestRegTraverser.getNilVariables(); if(!nilvars.isEmpty()) { //System.err.println("nilvars present"); - Tree[] newBody = new Tree[ nilvars.size() + 1 ]; + Tree[] newBody = new Tree[ nilvars.size() ]; int j=0; for( Iterator it = nilvars.iterator(); it.hasNext(); ) { Symbol v = (Symbol) it.next(); newBody[ j++ ] = gen.ValDef(v, gen.mkNil(cases[i].pos)); } - newBody[ newBody.length - 1 ] = cases[i].body; - cases[i].body = gen.mkBlock( newBody ); + cases[i].body = gen.mkBlock( newBody, cases[i].body ); } i++; } diff --git a/sources/scalac/transformer/matching/AlgebraicMatcher.java b/sources/scalac/transformer/matching/AlgebraicMatcher.java index 6b96072bae..fc70741cd4 100644 --- a/sources/scalac/transformer/matching/AlgebraicMatcher.java +++ b/sources/scalac/transformer/matching/AlgebraicMatcher.java @@ -79,13 +79,13 @@ public class AlgebraicMatcher extends PatternMatcher { //////////// generator methods public Tree toTree() { - TreeList ts = new TreeList(); - ts.append( gen.ValDef(root.symbol(), _m.selector )); - ts.append( gen.ValDef(resultVar, - gen.mkDefaultValue(_m.pos, resultVar.info()) )); - ts.append( gen.If( toTree(root.and), + Tree[] ts = { + gen.ValDef(root.symbol(), _m.selector ), + gen.ValDef(resultVar, + gen.mkDefaultValue(_m.pos, resultVar.info()) )}; + Tree res = gen.If( toTree(root.and), gen.Ident( _m.pos, resultVar ), - cf.ThrowMatchError( _m.pos, _m.resultType ))); + cf.ThrowMatchError( _m.pos, _m.resultType )); /* gen.If( _m.pos, @@ -93,7 +93,7 @@ public class AlgebraicMatcher extends PatternMatcher { gen.Ident( _m.pos, resultVar ), cf.ThrowMatchError( _m.resultType )); */ - return gen.mkBlock(_m.pos, ts.toArray()); + return gen.mkBlock(_m.pos, ts, res); } protected Tree toTree(PatternNode node, Tree selector) { diff --git a/sources/scalac/transformer/matching/Autom2Scala.java b/sources/scalac/transformer/matching/Autom2Scala.java index 6f99a699cf..102353c8d4 100644 --- a/sources/scalac/transformer/matching/Autom2Scala.java +++ b/sources/scalac/transformer/matching/Autom2Scala.java @@ -92,9 +92,9 @@ public class Autom2Scala { cf.gen.ValDef( this.curSym, gen.If( gen.Ident( pos, hasnSym ), cf._next( _iter() ), - gen.mkDefaultValue(cf.pos,curSym.type()))), + gen.mkDefaultValue(cf.pos,curSym.type())))}, - body }); + body ); } /** bug ?? */ @@ -189,10 +189,10 @@ public class Autom2Scala { /** some error happened which is due to bug in translation/automaton */ final Tree code_error() { - return gen.Block( new Tree[] { + return gen.mkBlock( gen.Console_print( pos, "System error during pattern matching. Please file bug report\n"), cf.ThrowMatchError( pos, funRetType() ) - }); + ); } Tree code_fail() { diff --git a/sources/scalac/transformer/matching/LeftTracerInScala.java b/sources/scalac/transformer/matching/LeftTracerInScala.java index 4c02ce28dc..875b1dd89b 100644 --- a/sources/scalac/transformer/matching/LeftTracerInScala.java +++ b/sources/scalac/transformer/matching/LeftTracerInScala.java @@ -208,7 +208,8 @@ public class LeftTracerInScala extends TracerInScala { new Ident[] { gen.Ident( pos, stateSym ), gen.Ident( pos, accumSym ) - }, code_body() /* code_body_new ? */ ))}); + }, code_body() /* code_body_new ? */ ))}, + gen.Ident( cf.pos, resultSym )); } // calling the AlgebraicMatcher here diff --git a/sources/scalac/transformer/matching/PatternMatcher.java b/sources/scalac/transformer/matching/PatternMatcher.java index b2c45278ef..eeebe6321d 100644 --- a/sources/scalac/transformer/matching/PatternMatcher.java +++ b/sources/scalac/transformer/matching/PatternMatcher.java @@ -766,16 +766,15 @@ public class PatternMatcher extends PatternTool { } public Tree generalSwitchToTree() { - TreeList ts = new TreeList(); - ts.append(gen.ValDef(root.symbol(), selector)); - ts.append(gen.ValDef(resultVar, gen.mkDefaultValue(selector.pos, resultVar.getType()))); - ts.append( - gen.If( - selector.pos, - toTree(root.and), - gen.Ident(selector.pos, resultVar), - cf.ThrowMatchError(selector.pos, resultVar.getType()))); - return gen.mkBlock(selector.pos, ts.toArray()); + Tree[] ts = { + gen.ValDef(root.symbol(), selector), + gen.ValDef(resultVar, gen.mkDefaultValue(selector.pos, resultVar.getType()))}; + Tree res = gen.If( + selector.pos, + toTree(root.and), + gen.Ident(selector.pos, resultVar), + cf.ThrowMatchError(selector.pos, resultVar.getType())); + return gen.mkBlock(selector.pos, ts, res); } protected Tree toTree(PatternNode node) { @@ -799,18 +798,15 @@ public class PatternMatcher extends PatternTool { } else if (!doBinding) bound = new ValDef[][]{new ValDef[]{}}; for (int i = guard.length - 1; i >= 0; i--) { - Tree[] ts = new Tree[bound[i].length + 1]; - System.arraycopy(bound[i], 0, ts, 0, bound[i].length); - ts[bound[i].length] = gen.mkBlock( - new Tree[]{ - gen.Assign( - gen.Ident(body[i].pos, resultVar), - body[i]), - gen.mkBooleanLit(body[i].pos, true) - }); + Tree[] ts = bound[i]; + Tree res0 = gen.mkBlock( + gen.Assign( + gen.Ident(body[i].pos, resultVar), + body[i]), + gen.mkBooleanLit(body[i].pos, true)); if (guard[i] != Tree.Empty) - ts[bound[i].length] = cf.And(guard[i], ts[bound[i].length]); - res = cf.Or(gen.mkBlock(body[i].pos, ts), res); + res0 = cf.And(guard[i], res0); + res = cf.Or(gen.mkBlock(body[i].pos, ts, res0), res); } return res; default: @@ -922,10 +918,9 @@ public class PatternMatcher extends PatternTool { return gen.If( gen.mkIsInstanceOf(selector.duplicate(), node.type), gen.mkBlock( - new Tree[]{ - gen.ValDef(casted, - gen.mkAsInstanceOf(selector.duplicate(), node.type)), - toTree(node.and)}), + gen.ValDef(casted, + gen.mkAsInstanceOf(selector.duplicate(), node.type)), + toTree(node.and)), toTree(node.or, selector.duplicate())); case SequencePat(Symbol casted, int len): return gen.If( @@ -939,10 +934,9 @@ public class PatternMatcher extends PatternTool { defs.SEQ_LENGTH())), gen.mkIntLit(selector.pos, len))), gen.mkBlock( - new Tree[]{ - gen.ValDef(casted, - gen.mkAsInstanceOf(selector.duplicate(), node.type)), - toTree(node.and)}), + gen.ValDef(casted, + gen.mkAsInstanceOf(selector.duplicate(), node.type)), + toTree(node.and)), toTree(node.or, selector.duplicate())); case ConstantPat(AConstant value): return gen.If( diff --git a/sources/scalac/transformer/matching/RightTracerInScala.java b/sources/scalac/transformer/matching/RightTracerInScala.java index e7ef7ae029..e6fc1378ae 100644 --- a/sources/scalac/transformer/matching/RightTracerInScala.java +++ b/sources/scalac/transformer/matching/RightTracerInScala.java @@ -32,7 +32,7 @@ public class RightTracerInScala extends TracerInScala { HashMap helpMap; HashMap helpMap2 ; - Vector helpVarDefs; + TreeList helpVarDefs; /** translate right tracer to code @@ -60,7 +60,7 @@ public class RightTracerInScala extends TracerInScala { this.helpMap = new HashMap(); helpMap2 = new HashMap(); - helpVarDefs = new Vector(); + helpVarDefs = new TreeList(); for( Iterator it = seqVars.iterator(); it.hasNext(); ) { makeHelpVar( (Symbol) it.next() ); @@ -110,7 +110,7 @@ public class RightTracerInScala extends TracerInScala { helpVar.flags |= Modifiers.MUTABLE; Tree varDef = gen.ValDef( helpVar, rhs ); //((ValDef) varDef).kind = Kinds.VAR; - helpVarDefs.add( varDef ); + helpVarDefs.append( varDef ); } @@ -174,16 +174,16 @@ public class RightTracerInScala extends TracerInScala { // load current elem and trace Tree loadCurrentElem( Tree body ) { - return gen.mkBlock( new Tree[] { + return gen.If( cf.isEmpty( _iter() ), run_finished( 0 ), // we are done gen.mkBlock( new Tree[] { gen.ValDef( this.targetSym, cf.SeqTrace_headState( gen.Ident( pos, iterSym))), gen.ValDef( this.curSym, - cf.SeqTrace_headElem( gen.Ident( pos, iterSym ))), - body }) - )}); + cf.SeqTrace_headElem( gen.Ident( pos, iterSym )))}, + body ) + ); } /** see code_state0_NEW @@ -354,7 +354,7 @@ System.out.println("RightTracerInScala - the seqVars"+seqVars); // case _ => false - Tree res[] = new Tree[ helpMap3.keySet().size() + 1 ]; + Tree ts[] = new Tree[ helpMap3.keySet().size() ]; int j = 0; for( Iterator it = helpMap3.keySet().iterator(); it.hasNext(); ) { Symbol vsym = (Symbol) it.next(); @@ -362,12 +362,12 @@ System.out.println("RightTracerInScala - the seqVars"+seqVars); //hv.setType( defs.LIST_TYPE( elementType ) ) ; DEBUG ALARM ? Tree refv = gen.Ident(cf.pos, vsym); Tree refhv = gen.Ident(cf.pos, hv); - res[ j++ ] = gen.Assign( refhv, refv ); + ts[ j++ ] = gen.Assign( refhv, refv ); // System.out.println( "the assign" + res[ j - 1 ] ); } - res[ j ] = gen.mkBooleanLit( cf.pos, true ); // just `true' - Tree theBody = gen.mkBlock(res); + Tree res = gen.mkBooleanLit( cf.pos, true ); // just `true' + Tree theBody = gen.mkBlock(ts, res); am.construct( m, new CaseDef[] { @@ -417,8 +417,7 @@ System.out.println("RightTracerInScala - the seqVars"+seqVars); assert vars != null; Tree stms[] = new Tree[ vars.size() - + ((algMatchTree != null )? 1 : 0 ) - + 1 ]; + + ((algMatchTree != null )? 1 : 0 ) ]; int j = 0; for( Iterator it = vars.iterator(); it.hasNext(); ) { Symbol var = (Symbol) it.next(); @@ -431,10 +430,10 @@ System.out.println("RightTracerInScala - the seqVars"+seqVars); if( algMatchTree != null ) stms[ j++ ] = algMatchTree ; - stms[ j ] = callFun( new Tree[] { cf.SeqTrace_tail( _iter() ), - gen.mkIntLit( cf.pos, ntarget.intValue() ) } ); + Tree value = callFun( new Tree[] { cf.SeqTrace_tail( _iter() ), + gen.mkIntLit( cf.pos, ntarget.intValue() ) } ); - return gen.mkBlock( pos, stms ); + return gen.mkBlock( pos, stms, value ); } Tree stateWrap(int i) { @@ -445,23 +444,23 @@ System.out.println("RightTracerInScala - the seqVars"+seqVars); /* returns statements that do the work of the right-transducer */ - Tree[] getStms( Tree trace, Unit unit, Tree body ) { + Tree getStms( Tree trace, Unit unit, Tree body ) { - Vector v = new Vector(); + TreeList stms = new TreeList(); Tree loopbody = code_body_NEW(); - v.add( gen.ValDef( iterSym, trace ) ); - v.add( gen.ValDef( stateSym, gen.mkIntLit( cf.pos, 0 ) ) ); - v.addAll( helpVarDefs ); - v.add( gen.LabelDef( this.funSym, - new Ident[] { - gen.Ident( pos, iterSym ), - gen.Ident( pos, stateSym ) - }, loopbody )); + stms.append( gen.ValDef( iterSym, trace ) ); + stms.append( gen.ValDef( stateSym, gen.mkIntLit( cf.pos, 0 ) ) ); + stms.append( helpVarDefs ); + stms.append( gen.LabelDef( this.funSym, + new Ident[] { + gen.Ident( pos, iterSym ), + gen.Ident( pos, stateSym ) + }, loopbody )); // bind variables handled by this righttracer for( Iterator it = seqVars.iterator(); it.hasNext(); ) { - v.add( bindVar( (Symbol) it.next() ) ); + stms.append( bindVar( (Symbol) it.next() ) ); } Transformer treeCloner = new Transformer(unit.global) { @@ -475,15 +474,7 @@ System.out.println("RightTracerInScala - the seqVars"+seqVars); } }; - v.add( treeCloner.transform( body ) ); - - Tree result[] = new Tree[ v.size() ]; - int j = 0; - for( Iterator it = v.iterator(); it.hasNext(); ) { - result[ j++ ] = (Tree) it.next(); - } - - return result; + return gen.mkBlock(stms.toArray(), treeCloner.transform( body )); } @@ -492,7 +483,7 @@ System.out.println("RightTracerInScala - the seqVars"+seqVars); * todo: move tree generation of Unit somewhere else */ Tree run_finished( int state ) { - return gen.Block(Position.FIRSTPOS, Tree.EMPTY_ARRAY); + return gen.mkUnitLit(Position.FIRSTPOS); } Tree current() { return gen.Ident( pos, targetSym );} diff --git a/sources/scalac/transformer/matching/SequenceMatcher.java b/sources/scalac/transformer/matching/SequenceMatcher.java index 68d698986c..78334e5c10 100644 --- a/sources/scalac/transformer/matching/SequenceMatcher.java +++ b/sources/scalac/transformer/matching/SequenceMatcher.java @@ -55,8 +55,6 @@ public class SequenceMatcher extends PatternTool { Tree trace = ltis.getTrace(); - Tree theTrace = gen.Ident( cf.pos, ltis.resultSym ); - // (c) determinize + translate R DetWordAutom dRight = new DetWordAutom( right, left, dLeft ); @@ -67,16 +65,10 @@ public class SequenceMatcher extends PatternTool { new RightTracerInScala( dRight, seqVars, _m.owner, cf, pat, elementType ); - Tree stms2[] = rtis.getStms( theTrace, unit, body ); - - // paste statements together - - Tree items[] = new Tree[ 1 + stms2.length ]; - - items[ 0 ] = trace; - System.arraycopy( stms2, 0, items, 1, stms2.length ); - - return gen.mkBlock( body.pos, items ); + // !!! Tree stms2 = rtis.getStms( theTrace, unit, body ); + // !!! gen.mkBlock_( body.pos, trace, stms2 ); + Tree stms2 = rtis.getStms( trace, unit, body ); + return stms2; } private NondetWordAutom[] buildNfas( Tree[] pat ) { diff --git a/sources/scalac/transformer/matching/WordAutomInScala.java b/sources/scalac/transformer/matching/WordAutomInScala.java index bb05f6f63b..c84291b9ae 100644 --- a/sources/scalac/transformer/matching/WordAutomInScala.java +++ b/sources/scalac/transformer/matching/WordAutomInScala.java @@ -60,8 +60,8 @@ public class WordAutomInScala extends Autom2Scala { result = cf.gen.mkBlock( cf.pos, new Tree[] { gen.ValDef( iterSym, cf.newIterator( selector )), gen.ValDef( stateSym, gen.mkIntLit( cf.pos, 0) ), - gen.ValDef( resultSym, theDefDef ), - result } ); + gen.ValDef( resultSym, theDefDef )}, + result ); //unit.global.debugPrinter.print( result ); return result; } |