From 776801ee89ae278741db7fba37ca51a20c996804 Mon Sep 17 00:00:00 2001 From: Adrian Thurston Date: Fri, 31 Aug 2012 22:57:37 -0400 Subject: eliminated the need for vm_contiguous from rev triter --- colm/bytecode.c | 17 +++++------------ colm/tree.c | 26 +++++++++++++++----------- colm/tree.h | 1 - 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 -- cgit v1.2.1