summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2015-05-03 12:24:51 -0400
committerAdrian Thurston <thurston@complang.org>2015-05-03 12:24:51 -0400
commitb671ce2b6db990339bd6bbbd0694e00945dd55b3 (patch)
tree836ce7ef8b42802c733c2a8ad3db081e555dc496
parentd3e203a7afc9932547f9f6ed054cbfa077c2348f (diff)
downloadcolm-b671ce2b6db990339bd6bbbd0694e00945dd55b3.tar.gz
added inUnwind to the iterators
-rw-r--r--src/bytecode.c19
-rw-r--r--src/bytecode.h8
-rw-r--r--src/iter.c8
-rw-r--r--src/parsetree.cc2
-rw-r--r--src/parsetree.h1
-rw-r--r--src/synthesis.cc64
-rw-r--r--src/tree.h14
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
diff --git a/src/iter.c b/src/iter.c
index 9ba96310..60ba5e54 100644
--- a/src/iter.c
+++ b/src/iter.c
@@ -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 );
diff --git a/src/tree.h b/src/tree.h
index 1076eb98..abe091cf 100644
--- a/src/tree.h
+++ b/src/tree.h
@@ -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 );