diff options
Diffstat (limited to 'sources/scalac/transformer/matching')
7 files changed, 70 insertions, 92 deletions
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; } |