diff options
author | Adrian Thurston <thurston@complang.org> | 2012-08-28 15:32:39 -0400 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2012-08-28 15:32:39 -0400 |
commit | 36ede80d17435d45f491a969436fb57eb99dd74f (patch) | |
tree | 197b0868f13dd58a9b0163f7a8cbf3543f61ffea | |
parent | 6039e0124075b6a92105049e857a4d46e64bc7ab (diff) | |
download | colm-36ede80d17435d45f491a969436fb57eb99dd74f.tar.gz |
need to store stack root size in iterators
We can no longer compute it from stackRoot because the stack is now in blocks.
-rw-r--r-- | colm/bytecode.c | 18 | ||||
-rw-r--r-- | colm/bytecode.h | 2 | ||||
-rw-r--r-- | colm/map.h | 11 | ||||
-rw-r--r-- | colm/tree.c | 13 | ||||
-rw-r--r-- | colm/tree.h | 16 |
5 files changed, 39 insertions, 21 deletions
diff --git a/colm/bytecode.c b/colm/bytecode.c index b44ef996..ab904adf 100644 --- a/colm/bytecode.c +++ b/colm/bytecode.c @@ -369,11 +369,16 @@ void downrefLocalTrees( Program *prg, Tree **sp, Tree **frame, char *trees, long UserIter *uiterCreate( Program *prg, Tree ***psp, FunctionInfo *fi, long searchId ) { Tree **sp = *psp; + vm_pushn( sizeof(UserIter) / sizeof(Word) ); void *mem = vm_ptop(); - UserIter *uiter = mem; - initUserIter( uiter, vm_ptop(), fi->argSize, searchId ); + + Tree **stackRoot = vm_ptop(); + long rootSize = vm_ssize(); + + initUserIter( uiter, stackRoot, rootSize, fi->argSize, searchId ); + *psp = sp; return uiter; } @@ -1862,7 +1867,11 @@ again: rootRef.kid = (Kid*)vm_pop(); rootRef.next = (Ref*)vm_pop(); void *mem = vm_plocal(field); - initTreeIter( (TreeIter*)mem, &rootRef, searchTypeId, vm_ptop() ); + + Tree **stackRoot = vm_ptop(); + long rootSize = vm_ssize(); + + initTreeIter( (TreeIter*)mem, stackRoot, rootSize, &rootRef, searchTypeId ); break; } case IN_TRITER_DESTROY: { @@ -1888,6 +1897,7 @@ again: rootRef.next = (Ref*)vm_pop(); Tree **stackRoot = vm_ptop(); + long rootSize = vm_ssize(); int children = 0; Kid *kid = treeChild( prg, rootRef.kid->tree ); @@ -1898,7 +1908,7 @@ again: } void *mem = vm_plocal(field); - initRevTreeIter( (RevTreeIter*)mem, &rootRef, searchTypeId, stackRoot, children ); + initRevTreeIter( (RevTreeIter*)mem, stackRoot, rootSize, &rootRef, searchTypeId, children ); break; } case IN_REV_TRITER_DESTROY: { diff --git a/colm/bytecode.h b/colm/bytecode.h index 1b1bce97..dc4e2ea8 100644 --- a/colm/bytecode.h +++ b/colm/bytecode.h @@ -425,7 +425,7 @@ typedef unsigned char uchar; #define vm_top() (*sp) #define vm_ptop() (sp) -#define vm_ssize() ( prg->sb_total + (prg->sb_end - sb) ) +#define vm_ssize() ( prg->sb_total + (prg->sb_end - sp) ) #define vm_local(o) (exec->framePtr[o]) #define vm_plocal(o) (&exec->framePtr[o]) @@ -80,17 +80,6 @@ long cmpTree( Program *prg, const Tree *tree1, const Tree *tree2 ); void mapImplRemoveEl( Program *prg, Map *map, MapEl *element ); int mapImplRemoveKey( Program *prg, Map *map, Tree *key ); -/* - * Iterators. - */ - -void initTreeIter( TreeIter *treeIter, const Ref *rootRef, int searchId, Tree **stackRoot ); -void initRevTreeIter( RevTreeIter *revTriter, const Ref *rootRef, - int searchId, Tree **stackRoot, int children ); - - -void initUserIter( UserIter *userIter, Tree **stackRoot, long argSize, long searchId ); - Tree *mapFind( Program *prg, Map *map, Tree *key ); long mapLength( Map *map ); Tree *mapUnstore( Program *prg, Map *map, Tree *key, Tree *existing ); diff --git a/colm/tree.c b/colm/tree.c index 95e3a619..8e518884 100644 --- a/colm/tree.c +++ b/colm/tree.c @@ -44,34 +44,39 @@ ListEl *listDetachLast(List *list ) { return listDetach(list, list->tail long listLength(List *list) { return list->listLen; } -void initTreeIter( TreeIter *treeIter, const Ref *rootRef, int searchId, Tree **stackRoot ) +void initTreeIter( TreeIter *treeIter, Tree **stackRoot, long rootSize, + const Ref *rootRef, int searchId ) { treeIter->rootRef = *rootRef; treeIter->searchId = searchId; treeIter->stackRoot = stackRoot; treeIter->yieldSize = 0; + treeIter->rootSize = rootSize; treeIter->ref.kid = 0; treeIter->ref.next = 0; } -void initRevTreeIter( RevTreeIter *revTriter, const Ref *rootRef, - int searchId, Tree **stackRoot, int children ) +void initRevTreeIter( RevTreeIter *revTriter, Tree **stackRoot, long rootSize, + const Ref *rootRef, int searchId, int children ) { revTriter->rootRef = *rootRef; revTriter->searchId = searchId; revTriter->stackRoot = stackRoot; revTriter->yieldSize = children; + revTriter->rootSize = rootSize; revTriter->kidAtYield = 0; revTriter->children = children; revTriter->ref.kid = 0; revTriter->ref.next = 0; } -void initUserIter( UserIter *userIter, Tree **stackRoot, long argSize, long searchId ) +void initUserIter( UserIter *userIter, Tree **stackRoot, long rootSize, + long argSize, long searchId ) { userIter->stackRoot = stackRoot; userIter->argSize = argSize; userIter->yieldSize = 0; + userIter->rootSize = rootSize; userIter->resume = 0; userIter->frame = 0; userIter->searchId = searchId; diff --git a/colm/tree.h b/colm/tree.h index 455e9665..065f8e0e 100644 --- a/colm/tree.h +++ b/colm/tree.h @@ -227,6 +227,7 @@ typedef struct _TreeIter long searchId; Tree **stackRoot; long yieldSize; + long rootSize; } TreeIter; /* This must overlay tree iter because some of the same bytecodes are used. */ @@ -237,6 +238,7 @@ typedef struct _RevTreeIter long searchId; Tree **stackRoot; long yieldSize; + long rootSize; /* For detecting a split at the leaf. */ Kid *kidAtYield; @@ -244,7 +246,6 @@ typedef struct _RevTreeIter Kid **cur; } RevTreeIter; - typedef struct _UserIter { /* The current item. */ @@ -252,6 +253,8 @@ typedef struct _UserIter Tree **stackRoot; long argSize; long yieldSize; + long rootSize; + Code *resume; Tree **frame; long searchId; @@ -348,6 +351,17 @@ void printTreeCollect( struct ColmProgram *prg, Tree **sp, StrCollect *collect, void printTreeFile( struct ColmProgram *prg, Tree **sp, FILE *out, Tree *tree, int trim ); void printXmlStdout( struct ColmProgram *prg, Tree **sp, Tree *tree, int commAttr, int trim ); +/* + * Iterators. + */ + +void initTreeIter( TreeIter *treeIter, Tree **stackRoot, long rootSize, + const Ref *rootRef, int searchId ); +void initRevTreeIter( RevTreeIter *revTriter, Tree **stackRoot, long rootSize, + const Ref *rootRef, int searchId, int children ); +void initUserIter( UserIter *userIter, Tree **stackRoot, long rootSize, + long argSize, long searchId ); + #if defined(__cplusplus) } #endif |