diff options
author | Adrian Thurston <thurston@complang.org> | 2015-05-03 12:24:51 -0400 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2015-05-03 12:24:51 -0400 |
commit | b671ce2b6db990339bd6bbbd0694e00945dd55b3 (patch) | |
tree | 836ce7ef8b42802c733c2a8ad3db081e555dc496 | |
parent | d3e203a7afc9932547f9f6ed054cbfa077c2348f (diff) | |
download | colm-b671ce2b6db990339bd6bbbd0694e00945dd55b3.tar.gz |
added inUnwind to the iterators
-rw-r--r-- | src/bytecode.c | 19 | ||||
-rw-r--r-- | src/bytecode.h | 8 | ||||
-rw-r--r-- | src/iter.c | 8 | ||||
-rw-r--r-- | src/parsetree.cc | 2 | ||||
-rw-r--r-- | src/parsetree.h | 1 | ||||
-rw-r--r-- | src/synthesis.cc | 64 | ||||
-rw-r--r-- | src/tree.h | 14 |
7 files changed, 63 insertions, 53 deletions
diff --git a/src/bytecode.c b/src/bytecode.c index 0fbff9e3..01252f6d 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -299,14 +299,15 @@ static void downref_locals( Program *prg, Tree ***psp, debug( prg, REALM_BYTECODE, "local iter downref: %ld\n", (long)locals[i].offset ); TreeIter *iter = (TreeIter*) vm_get_plocal( exec, (long)locals[i].offset ); - treeIterDestroy( prg, psp, iter ); + colm_tree_iter_destroy( prg, psp, iter ); break; } case LI_RevIter: { debug( prg, REALM_BYTECODE, "local rev iter downref: %ld\n", (long)locals[i].offset ); - RevTreeIter *riter = (RevTreeIter*) vm_get_plocal( exec, (long)locals[i].offset ); - revTreeIterDestroy( prg, psp, riter ); + RevTreeIter *riter = (RevTreeIter*) vm_get_plocal( exec, + (long)locals[i].offset ); + colm_rev_tree_iter_destroy( prg, psp, riter ); break; } case LI_UserIter: { @@ -1420,8 +1421,8 @@ again: vm_push_tree( val ); break; } - case IN_POP: { - debug( prg, REALM_BYTECODE, "IN_POP\n" ); + case IN_POP_TREE: { + debug( prg, REALM_BYTECODE, "IN_POP_TREE\n" ); Tree *val = vm_pop_tree(); treeDownref( prg, sp, val ); @@ -1833,7 +1834,7 @@ again: Tree **stackRoot = vm_ptop(); long rootSize = vm_ssize(); - initTreeIter( (TreeIter*)mem, stackRoot, + colm_init_tree_iter( (TreeIter*)mem, stackRoot, argSize, rootSize, &rootRef, searchTypeId ); break; } @@ -1844,7 +1845,7 @@ again: TreeIter *iter = (TreeIter*) vm_get_plocal(exec, field); debug( prg, REALM_BYTECODE, "IN_TRITER_DESTROY %hd %d\n", field, iter->yieldSize ); - treeIterDestroy( prg, &sp, iter ); + colm_tree_iter_destroy( prg, &sp, iter ); break; } case IN_REV_TRITER_FROM_REF: { @@ -1874,7 +1875,7 @@ again: } void *mem = vm_get_plocal(exec, field); - initRevTreeIter( (RevTreeIter*)mem, stackRoot, + colm_init_rev_tree_iter( (RevTreeIter*)mem, stackRoot, argSize, rootSize, &rootRef, searchTypeId, children ); break; } @@ -1885,7 +1886,7 @@ again: debug( prg, REALM_BYTECODE, "IN_REV_TRITER_DESTROY\n" ); RevTreeIter *iter = (RevTreeIter*) vm_get_plocal(exec, field); - revTreeIterDestroy( prg, &sp, iter ); + colm_rev_tree_iter_destroy( prg, &sp, iter ); break; } case IN_TREE_SEARCH: { diff --git a/src/bytecode.h b/src/bytecode.h index e2414826..330277ee 100644 --- a/src/bytecode.h +++ b/src/bytecode.h @@ -79,6 +79,7 @@ typedef unsigned long colm_value_t; #define IN_GEN_ITER_FROM_REF 0xd3 #define IN_GEN_ITER_DESTROY 0xd5 +#define IN_GEN_ITER_UNWIND 0x74 #define IN_GEN_ITER_GET_CUR_R 0xdf #define IN_GEN_VITER_GET_CUR_R 0xe7 #define IN_LIST_ITER_ADVANCE 0xde @@ -97,7 +98,7 @@ typedef unsigned long colm_value_t; #define IN_CONCAT_STR 0x1a #define IN_TREE_TRIM 0x1b -#define IN_POP 0x1d +#define IN_POP_TREE 0x1d #define IN_POP_N_WORDS 0x1e #define IN_POP_VAL 0xbe #define IN_DUP_VAL 0x1f @@ -156,12 +157,14 @@ typedef unsigned long colm_value_t; #define IN_TRITER_GET_CUR_R 0x44 #define IN_TRITER_GET_CUR_WC 0x45 #define IN_TRITER_SET_CUR_WC 0x46 +#define IN_TRITER_UNWIND 0x73 #define IN_TRITER_DESTROY 0x47 #define IN_TRITER_NEXT_REPEAT 0x48 #define IN_TRITER_PREV_REPEAT 0x49 #define IN_REV_TRITER_FROM_REF 0x4a #define IN_REV_TRITER_DESTROY 0x4b +#define IN_REV_TRITER_UNWIND 0x75 #define IN_REV_TRITER_PREV_CHILD 0x4c #define IN_UITER_DESTROY 0x4d @@ -207,9 +210,6 @@ typedef unsigned long colm_value_t; #define IN_GET_VLIST_MEM_WV 0x70 #define IN_GET_VLIST_MEM_BKT 0x5c -// 0x73 -// 0x74 -// 0x75 // 0x76 // 0x77 @@ -142,7 +142,7 @@ Value colm_viter_deref_cur( Program *prg, GenericIter *iter ) return value; } -void initTreeIter( TreeIter *treeIter, Tree **stackRoot, +void colm_init_tree_iter( TreeIter *treeIter, Tree **stackRoot, long argSize, long rootSize, const Ref *rootRef, int searchId ) { @@ -157,7 +157,7 @@ void initTreeIter( TreeIter *treeIter, Tree **stackRoot, treeIter->argSize = argSize; } -void initRevTreeIter( RevTreeIter *revTriter, Tree **stackRoot, +void colm_init_rev_tree_iter( RevTreeIter *revTriter, Tree **stackRoot, long argSize, long rootSize, const Ref *rootRef, int searchId, int children ) { @@ -223,7 +223,7 @@ void uiterInit( Program *prg, Tree **sp, UserIter *uiter, } -void treeIterDestroy( Program *prg, Tree ***psp, TreeIter *iter ) +void colm_tree_iter_destroy( Program *prg, Tree ***psp, TreeIter *iter ) { if ( (int)iter->type != 0 ) { int i; @@ -238,7 +238,7 @@ void treeIterDestroy( Program *prg, Tree ***psp, TreeIter *iter ) } } -void revTreeIterDestroy( struct colm_program *prg, Tree ***psp, RevTreeIter *riter ) +void colm_rev_tree_iter_destroy( struct colm_program *prg, Tree ***psp, RevTreeIter *riter ) { if ( (int)riter->type != 0 ) { int i; diff --git a/src/parsetree.cc b/src/parsetree.cc index 07f8a97f..dfbd8bab 100644 --- a/src/parsetree.cc +++ b/src/parsetree.cc @@ -162,6 +162,8 @@ int CmpUniqueType::compare( const UniqueType &ut1, const UniqueType &ut2 ) else if ( ut1.iterDef > ut2.iterDef ) return 1; break; + + case TYPE_NOTYPE: case TYPE_NIL: case TYPE_INT: case TYPE_BOOL: diff --git a/src/parsetree.h b/src/parsetree.h index 7ef6cea6..41a225f2 100644 --- a/src/parsetree.h +++ b/src/parsetree.h @@ -1767,6 +1767,7 @@ struct IterImpl Code inCreateWV; Code inCreateWC; Code inDestroy; + Code inUnwind; Code inAdvance; Code inGetCurR; diff --git a/src/synthesis.cc b/src/synthesis.cc index c1eaa05e..e463cc74 100644 --- a/src/synthesis.cc +++ b/src/synthesis.cc @@ -54,10 +54,11 @@ IterImpl::IterImpl( Type type ) : case Tree: inCreateWV = IN_TRITER_FROM_REF; inCreateWC = IN_TRITER_FROM_REF; - inDestroy = IN_TRITER_DESTROY; - inAdvance = IN_TRITER_ADVANCE; + inDestroy = IN_TRITER_DESTROY; + inUnwind = IN_TRITER_UNWIND; + inAdvance = IN_TRITER_ADVANCE; - inGetCurR = IN_TRITER_GET_CUR_R; + inGetCurR = IN_TRITER_GET_CUR_R; inGetCurWC = IN_TRITER_GET_CUR_WC; inSetCurWC = IN_TRITER_SET_CUR_WC; inRefFromCur = IN_TRITER_REF_FROM_CUR; @@ -67,10 +68,11 @@ IterImpl::IterImpl( Type type ) : case Child: inCreateWV = IN_TRITER_FROM_REF; inCreateWC = IN_TRITER_FROM_REF; - inDestroy = IN_TRITER_DESTROY; - inAdvance = IN_TRITER_NEXT_CHILD; + inDestroy = IN_TRITER_DESTROY; + inUnwind = IN_TRITER_UNWIND; + inAdvance = IN_TRITER_NEXT_CHILD; - inGetCurR = IN_TRITER_GET_CUR_R; + inGetCurR = IN_TRITER_GET_CUR_R; inGetCurWC = IN_TRITER_GET_CUR_WC; inSetCurWC = IN_TRITER_SET_CUR_WC; inRefFromCur = IN_TRITER_REF_FROM_CUR; @@ -80,10 +82,11 @@ IterImpl::IterImpl( Type type ) : case RevChild: inCreateWV = IN_REV_TRITER_FROM_REF; inCreateWC = IN_REV_TRITER_FROM_REF; - inDestroy = IN_REV_TRITER_DESTROY; - inAdvance = IN_REV_TRITER_PREV_CHILD; + inDestroy = IN_REV_TRITER_DESTROY; + inUnwind = IN_REV_TRITER_UNWIND; + inAdvance = IN_REV_TRITER_PREV_CHILD; - inGetCurR = IN_TRITER_GET_CUR_R; + inGetCurR = IN_TRITER_GET_CUR_R; inGetCurWC = IN_TRITER_GET_CUR_WC; inSetCurWC = IN_TRITER_SET_CUR_WC; inRefFromCur = IN_TRITER_REF_FROM_CUR; @@ -93,10 +96,11 @@ IterImpl::IterImpl( Type type ) : case Repeat: inCreateWV = IN_TRITER_FROM_REF; inCreateWC = IN_TRITER_FROM_REF; - inDestroy = IN_TRITER_DESTROY; - inAdvance = IN_TRITER_NEXT_REPEAT; + inDestroy = IN_TRITER_DESTROY; + inUnwind = IN_TRITER_UNWIND; + inAdvance = IN_TRITER_NEXT_REPEAT; - inGetCurR = IN_TRITER_GET_CUR_R; + inGetCurR = IN_TRITER_GET_CUR_R; inGetCurWC = IN_TRITER_GET_CUR_WC; inSetCurWC = IN_TRITER_SET_CUR_WC; inRefFromCur = IN_TRITER_REF_FROM_CUR; @@ -106,10 +110,11 @@ IterImpl::IterImpl( Type type ) : case RevRepeat: inCreateWV = IN_TRITER_FROM_REF; inCreateWC = IN_TRITER_FROM_REF; - inDestroy = IN_TRITER_DESTROY; - inAdvance = IN_TRITER_PREV_REPEAT; + inDestroy = IN_TRITER_DESTROY; + inUnwind = IN_TRITER_UNWIND; + inAdvance = IN_TRITER_PREV_REPEAT; - inGetCurR = IN_TRITER_GET_CUR_R; + inGetCurR = IN_TRITER_GET_CUR_R; inGetCurWC = IN_TRITER_GET_CUR_WC; inSetCurWC = IN_TRITER_SET_CUR_WC; inRefFromCur = IN_TRITER_REF_FROM_CUR; @@ -120,6 +125,7 @@ IterImpl::IterImpl( Type type ) : inCreateWV = IN_GEN_ITER_FROM_REF; inCreateWC = IN_GEN_ITER_FROM_REF; inDestroy = IN_GEN_ITER_DESTROY; + inUnwind = IN_GEN_ITER_UNWIND; inAdvance = IN_LIST_ITER_ADVANCE; inGetCurR = IN_GEN_ITER_GET_CUR_R; @@ -133,6 +139,7 @@ IterImpl::IterImpl( Type type ) : inCreateWV = IN_GEN_ITER_FROM_REF; inCreateWC = IN_GEN_ITER_FROM_REF; inDestroy = IN_GEN_ITER_DESTROY; + inUnwind = IN_GEN_ITER_UNWIND; inAdvance = IN_LIST_ITER_ADVANCE; inGetCurR = IN_GEN_VITER_GET_CUR_R; @@ -146,6 +153,7 @@ IterImpl::IterImpl( Type type ) : inCreateWV = IN_GEN_ITER_FROM_REF; inCreateWC = IN_GEN_ITER_FROM_REF; inDestroy = IN_GEN_ITER_DESTROY; + inUnwind = IN_GEN_ITER_UNWIND; inAdvance = IN_MAP_ITER_ADVANCE; inGetCurR = IN_GEN_VITER_GET_CUR_R; @@ -159,6 +167,7 @@ IterImpl::IterImpl( Type type ) : inCreateWV = IN_GEN_ITER_FROM_REF; inCreateWC = IN_GEN_ITER_FROM_REF; inDestroy = IN_GEN_ITER_DESTROY; + inUnwind = IN_GEN_ITER_UNWIND; inAdvance = IN_MAP_ITER_ADVANCE; inGetCurR = IN_GEN_ITER_GET_CUR_R; @@ -1049,7 +1058,7 @@ void LangVarRef::popRefQuals( Compiler *pd, CodeVect &code, if ( paramUT->typeId == TYPE_REF ) { if ( ! expression->canTakeRef( pd ) ) - code.append( IN_POP ); + code.append( IN_POP_TREE ); } } } @@ -1391,7 +1400,7 @@ UniqueType *LangTerm::evaluateParse( Compiler *pd, CodeVect &code, if ( ut->typeId == TYPE_TREE && ut->langEl == pd->voidLangEl ) { /* Clear it away if return type is void. */ - code.append( IN_POP ); + code.append( IN_POP_TREE ); continue; } @@ -1506,8 +1515,8 @@ void ConsItemList::evaluateSendStream( Compiler *pd, CodeVect &code ) UniqueType *ut = item->expr->evaluate( pd, code ); if ( ut->typeId == TYPE_TREE && ut->langEl == pd->voidLangEl ) { /* Clear it away if the the return type is void. */ - code.append( IN_POP ); - code.append( IN_POP ); + code.append( IN_POP_TREE ); + code.append( IN_POP_TREE ); continue; } @@ -1570,7 +1579,7 @@ void LangTerm::evaluateSendParser( Compiler *pd, CodeVect &code, bool strings ) UniqueType *ut = item->expr->evaluate( pd, code ); if ( ut->typeId == TYPE_TREE && ut->langEl == pd->voidLangEl ) { /* Clear it away if return type is void. */ - code.append( IN_POP ); + code.append( IN_POP_TREE ); continue; } @@ -1834,7 +1843,7 @@ UniqueType *LangTerm::evaluate( Compiler *pd, CodeVect &code ) const // if ( retUt->val() ) // pd->unwindCode.insert( 0, IN_POP_VAL ); // else - // pd->unwindCode.insert( 0, IN_POP ); + // pd->unwindCode.insert( 0, IN_POP_TREE ); return retUt; } @@ -1849,7 +1858,7 @@ UniqueType *LangExpr::evaluate( Compiler *pd, CodeVect &code ) const UniqueType *rt = right->evaluate( pd, code ); // pd->unwindCode.remove( 0, 2 ); - // pd->unwindCode.insert( 0, IN_POP ); + // pd->unwindCode.insert( 0, IN_POP_TREE ); if ( lt == pd->uniqueTypeInt && rt == pd->uniqueTypeInt ) { code.append( IN_ADD_INT ); @@ -2204,10 +2213,7 @@ void LangStmt::compileForIterBody( Compiler *pd, /* Add the cleanup for the current loop. */ int lcLen = pd->unwindCode.length(); pd->unwindCode.insertHalf( 0, objField->offset ); - int c = objField->iterImpl->inDestroy; - if ( c == IN_UITER_DESTROY ) - c = IN_UITER_UNWIND; - pd->unwindCode.insert( 0, c ); //objField->iterImpl->inDestroy ); + pd->unwindCode.insert( 0, objField->iterImpl->inUnwind ); /* Compile the contents. */ for ( StmtList::Iter stmt = *stmtList; stmt.lte(); stmt++ ) @@ -2386,7 +2392,7 @@ void LangStmt::compile( Compiler *pd, CodeVect &code ) const block.append( IN_LOAD_STR ); block.appendWord( mapEl->value ); - block.append( IN_POP ); + block.append( IN_POP_TREE ); pd->unwindCode.insert( 0, block ); @@ -2434,14 +2440,14 @@ void LangStmt::compile( Compiler *pd, CodeVect &code ) const code.append( IN_LOAD_GLOBAL_R ); code.append( IN_GET_STDOUT ); consItemList->evaluateSendStream( pd, code ); - code.append( IN_POP ); + code.append( IN_POP_TREE ); break; } case ExprType: { /* Evaluate the exrepssion, then pop it immediately. */ UniqueType *exprUt = expr->evaluate( pd, code ); if ( exprUt->tree() ) - code.append( IN_POP ); + code.append( IN_POP_TREE ); else code.append( IN_POP_VAL ); @@ -328,15 +328,15 @@ UserIter *colm_uiter_create( struct colm_program *prg, Tree ***psp, void uiterInit( struct colm_program *prg, Tree **sp, UserIter *uiter, struct _FunctionInfo *fi, int revertOn ); -void initTreeIter( TreeIter *treeIter, Tree **stackRoot, long argSize, long rootSize, - const Ref *rootRef, int searchId ); -void initRevTreeIter( RevTreeIter *revTriter, Tree **stackRoot, long argSize, long rootSize, - const Ref *rootRef, int searchId, int children ); -void initUserIter( UserIter *userIter, Tree **stackRoot, long rootSize, +void colm_init_tree_iter( TreeIter *treeIter, Tree **stackRoot, + long argSize, long rootSize, const Ref *rootRef, int searchId ); +void colm_init_rev_tree_iter( RevTreeIter *revTriter, Tree **stackRoot, + long argSize, long rootSize, const Ref *rootRef, int searchId, int children ); +void colm_init_user_iter( UserIter *userIter, Tree **stackRoot, long rootSize, long argSize, long searchId ); -void treeIterDestroy( struct colm_program *prg, Tree ***psp, TreeIter *iter ); -void revTreeIterDestroy( struct colm_program *prg, Tree ***psp, RevTreeIter *iter ); +void colm_tree_iter_destroy( struct colm_program *prg, Tree ***psp, TreeIter *iter ); +void colm_rev_tree_iter_destroy( struct colm_program *prg, Tree ***psp, RevTreeIter *iter ); void colm_uiter_destroy( struct colm_program *prg, Tree ***psp, UserIter *uiter ); void colm_uiter_unwind( struct colm_program *prg, Tree ***psp, UserIter *uiter ); |