summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2012-08-28 15:32:39 -0400
committerAdrian Thurston <thurston@complang.org>2012-08-28 15:32:39 -0400
commit36ede80d17435d45f491a969436fb57eb99dd74f (patch)
tree197b0868f13dd58a9b0163f7a8cbf3543f61ffea
parent6039e0124075b6a92105049e857a4d46e64bc7ab (diff)
downloadcolm-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.c18
-rw-r--r--colm/bytecode.h2
-rw-r--r--colm/map.h11
-rw-r--r--colm/tree.c13
-rw-r--r--colm/tree.h16
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])
diff --git a/colm/map.h b/colm/map.h
index 993ca86e..06007ad8 100644
--- a/colm/map.h
+++ b/colm/map.h
@@ -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