summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2012-08-31 22:57:37 -0400
committerAdrian Thurston <thurston@complang.org>2012-08-31 22:57:37 -0400
commit776801ee89ae278741db7fba37ca51a20c996804 (patch)
treeb9d77a81773682df3c2c4195abce7c060b53baad
parent15b5dd21b608df2d5a02ecbb11b10e03e9beba83 (diff)
downloadcolm-776801ee89ae278741db7fba37ca51a20c996804.tar.gz
eliminated the need for vm_contiguous from rev triter
-rw-r--r--colm/bytecode.c17
-rw-r--r--colm/tree.c26
-rw-r--r--colm/tree.h1
3 files changed, 20 insertions, 24 deletions
diff --git a/colm/bytecode.c b/colm/bytecode.c
index 794946f3..8026a676 100644
--- a/colm/bytecode.c
+++ b/colm/bytecode.c
@@ -1896,23 +1896,16 @@ again:
Ref rootRef;
rootRef.kid = (Kid*)vm_pop();
rootRef.next = (Ref*)vm_pop();
-
- int children = 0;
- Kid *kid = treeChild( prg, rootRef.kid->tree );
- while ( kid != 0 ) {
- children++;
- kid = kid->next;
- }
-
- vm_contiguous( children );
Tree **stackRoot = vm_ptop();
long rootSize = vm_ssize();
-
- kid = treeChild( prg, rootRef.kid->tree );
+
+ int children = 0;
+ Kid *kid = treeChild( prg, rootRef.kid->tree );
while ( kid != 0 ) {
- vm_push( (SW) kid );
+ vm_push( (SW)kid );
kid = kid->next;
+ children++;
}
void *mem = vm_plocal(field);
diff --git a/colm/tree.c b/colm/tree.c
index 43519660..5cdbf755 100644
--- a/colm/tree.c
+++ b/colm/tree.c
@@ -1769,32 +1769,36 @@ Tree *treeRevIterPrevChild( Program *prg, Tree ***psp, RevTreeIter *iter )
if ( iter->kidAtYield != iter->ref.kid ) {
/* Need to reload the kids. */
+ vm_popn( iter->children );
+
+ int c;
Kid *kid = treeChild( prg, iter->rootRef.kid->tree );
- Kid **dst = (Kid**)iter->stackRoot - 1;
- while ( kid != 0 ) {
- *dst-- = kid;
+ for ( c = 0; c < iter->children; c++ ) {
+ vm_push( (SW)kid );
kid = kid->next;
}
}
- if ( iter->ref.kid == 0 )
- iter->cur = (Kid**)iter->stackRoot - iter->children;
- else
- iter->cur += 1;
+ if ( iter->ref.kid != 0 ) {
+ vm_pop_ignore();
+ iter->children -= 1;
+ }
if ( iter->searchId != prg->rtd->anyId ) {
/* Have a previous item, go to the next sibling. */
- while ( iter->cur != (Kid**)iter->stackRoot && (*iter->cur)->tree->id != iter->searchId )
- iter->cur += 1;
+ while ( iter->children > 0 && ((Kid*)(vm_top()))->tree->id != iter->searchId ) {
+ iter->children -= 1;
+ vm_pop_ignore();
+ }
}
- if ( iter->cur == (Kid**)iter->stackRoot ) {
+ if ( iter->children == 0 ) {
iter->ref.next = 0;
iter->ref.kid = 0;
}
else {
iter->ref.next = &iter->rootRef;
- iter->ref.kid = *iter->cur;
+ iter->ref.kid = (Kid*)vm_top();
}
/* We will use this to detect a split above the iterated tree. */
diff --git a/colm/tree.h b/colm/tree.h
index 065f8e0e..30b06762 100644
--- a/colm/tree.h
+++ b/colm/tree.h
@@ -243,7 +243,6 @@ typedef struct _RevTreeIter
/* For detecting a split at the leaf. */
Kid *kidAtYield;
long children;
- Kid **cur;
} RevTreeIter;
typedef struct _UserIter