diff options
Diffstat (limited to 'src/synthesis.cc')
-rw-r--r-- | src/synthesis.cc | 53 |
1 files changed, 52 insertions, 1 deletions
diff --git a/src/synthesis.cc b/src/synthesis.cc index 3cd7462c..b4856f27 100644 --- a/src/synthesis.cc +++ b/src/synthesis.cc @@ -34,7 +34,8 @@ IterDef::IterDef( Type type ) : type(type), func(0), useFuncId(false), - useSearchUT(false) + useSearchUT(false), + useGenericId(false) { switch ( type ) { case Tree: @@ -99,6 +100,19 @@ IterDef::IterDef( Type type ) : inRefFromCur = IN_TRITER_REF_FROM_CUR; useSearchUT = true; break; + + case List: + inCreateWV = IN_LIST_ITER_FROM_REF; + inCreateWC = IN_LIST_ITER_FROM_REF; + inDestroy = IN_LIST_ITER_DESTROY; + inAdvance = IN_LIST_ITER_ADVANCE; + + inGetCurR = IN_LIST_ITER_GET_CUR_R; + inGetCurWC = //IN_LIST_ITER_GET_CUR_WC; + inSetCurWC = //IN_HALT; + inRefFromCur = //IN_LIST_ITER_REF_FROM_CUR; + useGenericId = true; + break; case User: assert(false); @@ -221,10 +235,15 @@ long sizeOfField( UniqueType *fieldUT ) case IterDef::RevRepeat: size = sizeof(TreeIter) / sizeof(Word); break; + case IterDef::RevChild: size = sizeof(RevTreeIter) / sizeof(Word); break; + case IterDef::List: + size = sizeof(ListIter) / sizeof(Word); + break; + case IterDef::User: /* User iterators are just a pointer to the UserIter struct. The * struct needs to go right beneath the call to the user iterator @@ -724,6 +743,21 @@ ObjectField *LangVarRef::evaluateRef( Compiler *pd, CodeVect &code, long pushCou return lookup.objField; } +void LangVarRef::chooseTriterCall( Compiler *pd, CallArgVect *args ) +{ + /* Evaluate the triter args and choose the triter call based on it. */ + if ( args->length() == 1 ) { + /* Evaluate the expression. */ + CodeVect unused; + CallArgVect::Iter pe = *args; + UniqueType *exprUT = (*pe)->expr->evaluate( pd, unused ); + + if ( exprUT->typeId == TYPE_GENERIC && exprUT->generic->typeId == GEN_LIST ) { + cerr << "iterating list" << endl; + name = "list_iter"; + } + } +} ObjectField **LangVarRef::evaluateArgs( Compiler *pd, CodeVect &code, VarRefLookup &lookup, CallArgVect *args ) @@ -2138,6 +2172,9 @@ void LangStmt::compileForIter( Compiler *pd, CodeVect &code ) const /* The type we are searching for. */ UniqueType *searchUT = typeRef->uniqueType; + if ( iterCall->wasExpr ) + iterCall->langTerm->varRef->chooseTriterCall( pd, iterCall->langTerm->args ); + /* Lookup the iterator call. Make sure it is an iterator. */ VarRefLookup lookup = iterCall->langTerm->varRef->lookupMethod( pd ); if ( lookup.objMethod->iterDef == 0 ) { @@ -2182,6 +2219,14 @@ void LangStmt::compileForIter( Compiler *pd, CodeVect &code ) const if ( iterUT->iterDef->useSearchUT ) code.appendHalf( searchUT->langEl->id ); + if ( iterUT->iterDef->useGenericId ) { + CodeVect unused; + UniqueType *ut = + iterCall->langTerm->args->data[0]->expr->evaluate( pd, unused ); + + code.appendHalf( ut->generic->id ); + } + compileForIterBody( pd, code, iterUT ); iterCall->langTerm->varRef->popRefQuals( pd, code, lookup, @@ -2439,6 +2484,12 @@ void Compiler::findLocals( ObjectDef *localFrame, CodeBlock *block ) case IterDef::RevRepeat: type = LT_Iter; break; + + case IterDef::List: + /* ? */ + type = LT_Iter; + break; + case IterDef::RevChild: type = LT_RevIter; break; |