summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sources/scalac/transformer/matching/LeftTracerInScala.java74
-rw-r--r--sources/scalac/transformer/matching/RightTracerInScala.java82
-rw-r--r--sources/scalac/transformer/matching/TracerInScala.java35
3 files changed, 63 insertions, 128 deletions
diff --git a/sources/scalac/transformer/matching/LeftTracerInScala.java b/sources/scalac/transformer/matching/LeftTracerInScala.java
index 576d3129c7..e46434bbe6 100644
--- a/sources/scalac/transformer/matching/LeftTracerInScala.java
+++ b/sources/scalac/transformer/matching/LeftTracerInScala.java
@@ -15,7 +15,6 @@ import ch.epfl.lamp.util.Position;
public class LeftTracerInScala extends TracerInScala {
- HashMap export_nestedMap;
Tree selector;
/** symbol of the accumulator ( scala.SequenceList )
@@ -36,50 +35,11 @@ public class LeftTracerInScala extends TracerInScala {
super( dfa, elementType, owner, cf );
this.selector = selector;
- helpVarDefs = new Vector();
-
- }
-
- Vector helpVarDefs;
-
- Symbol makeHelpVar( Symbol realVar ) {
- Symbol helpVar = new TermSymbol( pos,
- cf.fresh.newName( realVar.name
- .toString() ),
- owner,
- 0)
- .setType( defs.LIST_TYPE( elementType ) ) ;
-
- helpMap.put( realVar, helpVar );
-
- Tree varDef = gen.ValDef( helpVar, gen.Nil( cf.pos ));
- // set mutable flag of symbol helpVar ??
- helpVarDefs.add( varDef );
- return helpVar;
- }
-
- Symbol makeHelpVarSEQ( Tree pat ) {
- String helpName = String.valueOf( pat.hashCode() ); //wicked, in'it ?
- Symbol helpVar =
- new TermSymbol( pos,
- cf.fresh.newName(Name.fromString( helpName )),
- owner,
- 0)
- .setType( defs.LIST_TYPE( pat.getType() )) ;
-
- Tree varDef = gen.ValDef( helpVar,
- gen.mkDefaultValue( cf.pos,
- defs.LIST_TYPE( pat.getType() ))
- );
- helpVarDefs.add( varDef );
- return helpVar;
}
protected void initializeSyms() {
funSymName = "leftTracer";
- export_nestedMap = new HashMap();
-
super.initializeSyms();
this.accumType = _accumType( elementType );
this.accumTypeArg = accumType.typeArgs()[0];
@@ -206,8 +166,6 @@ public class LeftTracerInScala extends TracerInScala {
Vector v = new Vector();
- v.addAll( helpVarDefs );
-
//
// `def leftTracer(...) = ...' the function definition
v.add( theDefDef );
@@ -235,29 +193,19 @@ public class LeftTracerInScala extends TracerInScala {
v.add( run );
- // vars...
- for( Iterator it = helpMap.keySet().iterator(); it.hasNext(); ) {
- v.add( bindVar( (Symbol) it.next()) );
- }
-
- /* DEBUG OUTPUT AT RUNTIME
- v.add( gen.Console...( "the trace is" ) );
- v.add( gen.Console...( gen.Ident( pos, resultSym ) ) );
- */
-
Tree res[] = new Tree[ v.size() ];
int j = 0;
for( Iterator it = v.iterator(); it.hasNext(); )
res[ j++ ] = (Tree) it.next();
- //_m.varMap = export_nestedMap;
-
return res;
}
// calling the AlgebraicMatcher here
Tree _cur_match( Tree pat ) {
+ //return gen.mkBooleanLit(cf.pos, true);
+
//System.out.println("calling algebraic matcher on type:"+pat.type);
Matcher m = new Matcher( funSym,
@@ -267,28 +215,14 @@ public class LeftTracerInScala extends TracerInScala {
if( CollectVariableTraverser.containsBinding( pat )) {
switch( pat ) {
case Sequence(Tree[] pats):
- //System.out.println("ouch! v Left");
- Symbol hv = makeHelpVarSEQ( pat );
- export_nestedMap.put( pat, hv );
- Tree stm = gen.Assign( gen.Ident(Position.FIRSTPOS, hv), currentElem() );
- m.stms = new Tree[2];
- m.stms[0] = stm;
- m.stms[1] = gen.mkBooleanLit(Position.FIRSTPOS, true);
- return gen.mkBlock(m.stms);
+ return gen.mkBooleanLit(cf.pos, true);
}
}
- HashMap helpMap = FreshVariableTraverser.getVars( pat, owner, cf.fresh );
- //System.out.println("varMap: "+helpMap );
-
- //m.varMap = helpMap;
-
- //replaceVars( pat );
-
am.construct( m, new CaseDef[] {
cf.gen.CaseDef( pat,
gen.mkBooleanLit( cf.pos, true )),
- cf.gen.CaseDef( cf.gen.Ident(pat.pos, defs.PATTERN_WILDCARD),
+ cf.gen.CaseDef( cf.gen.Ident( pat.pos, defs.PATTERN_WILDCARD ),
gen.mkBooleanLit( cf.pos, false)) },
false);
Tree res = am.toTree();
diff --git a/sources/scalac/transformer/matching/RightTracerInScala.java b/sources/scalac/transformer/matching/RightTracerInScala.java
index 1b130b4be9..dc2249e58f 100644
--- a/sources/scalac/transformer/matching/RightTracerInScala.java
+++ b/sources/scalac/transformer/matching/RightTracerInScala.java
@@ -30,6 +30,7 @@ public class RightTracerInScala extends TracerInScala {
Symbol targetSym;
+ HashMap helpMap;
HashMap helpMap2 ;
Vector helpVarDefs;
@@ -48,6 +49,7 @@ public class RightTracerInScala extends TracerInScala {
Tree pat,
Type elementType ) {
super( dfa, elementType, owner, cf );
+
this.seqVars = seqVars;
this.allVars = CollectVariableTraverser.collectVars( pat );
@@ -55,6 +57,8 @@ public class RightTracerInScala extends TracerInScala {
varsToExport.addAll( allVars );
varsToExport.removeAll( seqVars );
+ this.helpMap = new HashMap();
+
helpMap2 = new HashMap();
helpVarDefs = new Vector();
@@ -83,11 +87,11 @@ public class RightTracerInScala extends TracerInScala {
void makeHelpVar( Symbol realVar, boolean keepType ) {
Symbol helpVar = new TermSymbol( cf.pos,
cf.fresh.newName( realVar.name
- .toString() ),
+ .toString()+"RTIS" ),
owner,
0);
- //System.out.println("making helpvar : "+realVar+" -> "+helpVar);
+ //System.out.println("RTiS making helpvar : "+realVar+" -> "+helpVar);
if( keepType )
helpVar.setType( realVar.type() );
@@ -273,7 +277,7 @@ public class RightTracerInScala extends TracerInScala {
* now we care about free vars
*/
Tree handleBody1( HashMap helpMap3 ) {
- //System.out.println("Rtis.handleBody ... helpMap = " + helpMap );
+ //System.out.println("Rtis.handleBody ... helpMap3 = " + helpMap );
// todo: change helpMap s.t. symbols are not reused.
Tree res[] = new Tree[ helpMap3.keySet().size() + 1 ];
@@ -282,14 +286,13 @@ public class RightTracerInScala extends TracerInScala {
Symbol vsym = (Symbol) it.next();
Symbol hv = (Symbol) helpMap3.get( vsym );
hv.setType( defs.LIST_TYPE( elementType ) ) ;
- Tree refv = gen.Ident(Position.FIRSTPOS, vsym);
- Tree refhv = gen.Ident(Position.FIRSTPOS, hv);
+ Tree refv = gen.Ident(cf.pos, vsym);
+ Tree refhv = gen.Ident(cf.pos, hv);
res[ j++ ] = gen.Assign( refhv, refv );
}
res[ j ] = gen.mkBooleanLit( Position.FIRSTPOS, true ); // just `true'
-
- return gen.mkBlock(res);
+ return gen.mkBlock(res);
}
// calling the AlgebraicMatcher here
@@ -302,8 +305,8 @@ public class RightTracerInScala extends TracerInScala {
currentElem(),
defs.BOOLEAN_TYPE() );
- final HashMap freshenMap = new HashMap();
- HashMap helpMap3 = new HashMap();
+ final HashMap freshenMap = new HashMap(); // sym2exp -> new sym
+ HashMap helpMap3 = new HashMap(); // new sym -> original sym
// "freshening": never use the same symbol more than once
// (in later invocations of _cur_match)
@@ -435,31 +438,33 @@ System.out.println("RightTracerInScala - the seqVars"+seqVars);
*/
Tree[] getStms( Tree trace ) {
- //System.out.println( "!!getStms.helpVarDefs: "+helpVarDefs);
-
Vector v = new Vector();
- for( Iterator it = helpVarDefs.iterator(); it.hasNext(); ) {
- v.add( (Tree) it.next() );
- }
Tree binderFunDef = gen.DefDef( this.funSym, code_body_NEW() );
if( actionsPresent ) {
+ //System.out.println( "!!getStms.helpVarDefs: "+helpVarDefs);
+ for( Iterator it = helpVarDefs.iterator(); it.hasNext(); ) {
+ v.add( (Tree) it.next() );
+ }
+
//v.add( gen.DefDef( this.funSym, code_body() ) );
v.add( binderFunDef );
v.add( callFun( new Tree[] { trace, gen.mkIntLit( cf.pos, 0 ) } ) );
+
+ // bind variables handled by this righttracer
+ for( Iterator it = seqVars.iterator(); it.hasNext(); ) {
+ v.add( bindVar( (Symbol) it.next() ) );
+ }
+
};
+
/*
- for(Iterator it = helpMap.keySet().iterator(); it.hasNext(); ) {
- // DEBUG
- Symbol var = (Symbol)it.next();
- v.add( cf.debugPrintRuntime( var.name.toString() ));
- v.add( cf.debugPrintRuntime( refHelpVar( var )) );
- }
+ for(Iterator it = helpMap.keySet().iterator(); it.hasNext(); ) {
+ System.out.println( "helpMap" );
+ System.out.println( it.next() );
+ }
*/
- for( Iterator it = seqVars.iterator(); it.hasNext(); ) {
- v.add( bindVar( (Symbol) it.next() ) );
- }
Tree result[] = new Tree[ v.size() ];
int j = 0;
@@ -481,4 +486,35 @@ System.out.println("RightTracerInScala - the seqVars"+seqVars);
Tree current() { return gen.Ident( pos, targetSym );}
+ Tree refHelpVar( Symbol realVar ) {
+ Symbol hv = (Symbol)helpMap.get( realVar );
+ assert hv != null : realVar;
+ return gen.Ident(Position.FIRSTPOS, hv);
+ }
+
+ Tree assignToHelpVar( Symbol realVar, Tree rhs ) {
+ Tree hv = refHelpVar( realVar );
+ return gen.Assign( hv, rhs );
+ }
+
+ Tree bindVar(Symbol realVar) {
+ Tree hv = refHelpVar( realVar );
+ /*
+ System.out.println("binding realVar.name "+realVar.name+" type:"+realVar.type()+" to hv type:"+hv.type());
+ realVar.setOwner( owner );
+ System.out.println("is same as realVar"+realVar.type().isSameAs( elementType ));
+ System.out.println("is same as hv"+realVar.type().isSameAs( hv.type() ));
+ if( realVar.type().isSameAs( elementType ))
+ return gen.ValDef( realVar, cf.SeqList_head( hv ));
+ else
+ return gen.ValDef( realVar, hv );
+ */
+ if( realVar.type().isSameAs( hv.getType())) {
+ return gen.ValDef( realVar, hv ); // e.g. x @ _*
+ }
+ return gen.ValDef( realVar, cf.SeqList_head( hv ));
+
+ }
+
+
}
diff --git a/sources/scalac/transformer/matching/TracerInScala.java b/sources/scalac/transformer/matching/TracerInScala.java
index 280aa4edd7..823a40ddc8 100644
--- a/sources/scalac/transformer/matching/TracerInScala.java
+++ b/sources/scalac/transformer/matching/TracerInScala.java
@@ -20,9 +20,6 @@ public class TracerInScala extends Autom2Scala {
protected boolean optimize = true;
- /* LeftTracer puts into this HashMap all variables it encounters
- */
- HashMap helpMap;
public TracerInScala( DetWordAutom dfa,
Type elementType,
@@ -30,38 +27,6 @@ public class TracerInScala extends Autom2Scala {
CodeFactory cf ) {
super( dfa, elementType, ownerSym, cf );
- this.helpMap = new HashMap();
-
- }
-
- Tree refHelpVar( Symbol realVar ) {
- Symbol hv = (Symbol)helpMap.get( realVar );
- assert hv != null : realVar;
- return gen.Ident(Position.FIRSTPOS, hv);
- }
-
- Tree assignToHelpVar( Symbol realVar, Tree rhs ) {
- Tree hv = refHelpVar( realVar );
- return gen.Assign( hv, rhs );
- }
-
- Tree bindVar(Symbol realVar) {
- Tree hv = refHelpVar( realVar );
- /*
- System.out.println("binding realVar.name "+realVar.name+" type:"+realVar.type()+" to hv type:"+hv.type());
- realVar.setOwner( owner );
- System.out.println("is same as realVar"+realVar.type().isSameAs( elementType ));
- System.out.println("is same as hv"+realVar.type().isSameAs( hv.type() ));
- if( realVar.type().isSameAs( elementType ))
- return gen.ValDef( realVar, cf.SeqList_head( hv ));
- else
- return gen.ValDef( realVar, hv );
- */
- if( realVar.type().isSameAs( hv.getType())) {
- return gen.ValDef( realVar, hv ); // e.g. x @ _*
- }
- return gen.ValDef( realVar, cf.SeqList_head( hv ));
-
}
}