summaryrefslogtreecommitdiff
path: root/sources/scalac/transformer/matching/RightTracerInScala.java
diff options
context:
space:
mode:
Diffstat (limited to 'sources/scalac/transformer/matching/RightTracerInScala.java')
-rw-r--r--sources/scalac/transformer/matching/RightTracerInScala.java65
1 files changed, 28 insertions, 37 deletions
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 );}