summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2012-01-01 01:18:10 +0000
committerAdrian Thurston <thurston@complang.org>2012-01-01 01:18:10 +0000
commit90ad97b08f19b5e8d50949e6794ad656f9ec50d9 (patch)
treea52f7cf6b8b8afec3a84957bfd5eb88b0172f6b1
parenta19f22e0a5f9eaeab88b68a4ec048912912d6332 (diff)
downloadcolm-90ad97b08f19b5e8d50949e6794ad656f9ec50d9.tar.gz
Some work on references WRT parsers and streams.
-rw-r--r--colm/bytecode.c14
-rw-r--r--colm/pdarun.c32
-rw-r--r--colm/tree.c10
3 files changed, 11 insertions, 45 deletions
diff --git a/colm/bytecode.c b/colm/bytecode.c
index 80f0def9..d57fd4f9 100644
--- a/colm/bytecode.c
+++ b/colm/bytecode.c
@@ -2116,7 +2116,6 @@ again:
Tree *val = vm_pop();
parserSetContext( prg, sp, (Accum*)obj, val );
treeDownref( prg, sp, obj );
- //treeDownref( prg, sp, val );
break;
}
@@ -2174,11 +2173,8 @@ again:
Tree *input = vm_pop();
streamAppend( prg, sp, input, accumStream->in );
- treeUpref( (Tree*)accumStream );
vm_push( (Tree*)accumStream );
-
treeDownref( prg, sp, input );
- treeDownref( prg, sp, (Tree*)accumStream );
break;
}
case IN_ACCUM_STREAM_APPEND_WV: {
@@ -2198,6 +2194,7 @@ again:
append( &exec->pdaRun->rcodeCollect, SIZEOF_CODE + 3 * SIZEOF_WORD );
break;
}
+
case IN_ACCUM_STREAM_APPEND_BKT: {
Tree *accumStream;
Tree *input;
@@ -2228,7 +2225,6 @@ again:
vm_push( (SW)steps );
vm_push( (SW)accum );
-
break;
}
@@ -2453,6 +2449,7 @@ again:
vm_pop_ignore();
vm_push( accum->result );
+ debug( REALM_BYTECODE, "accum refs: %d\n", accum->refs );
treeDownref( prg, sp, (Tree*)accum );
if ( prg->induceExit )
goto out;
@@ -2752,16 +2749,23 @@ again:
break;
}
case IN_GET_ACCUM_STREAM: {
+ debug( REALM_BYTECODE, "IN_GET_ACCUM_STREAM\n" );
+
Accum *accum = (Accum*)vm_pop();
treeUpref( (Tree*)accum->accumStream );
vm_push( (Tree*)accum->accumStream );
+ treeDownref( prg, sp, (Tree*)accum );
break;
}
case IN_SET_ACCUM_STREAM: {
+ debug( REALM_BYTECODE, "IN_SET_ACCUM_STREAM\n" );
+
Accum *accum = (Accum*)vm_pop();
AccumStream *accumStream = (AccumStream*)vm_pop();
accum->accumStream = accumStream;
treeUpref( (Tree*)accumStream );
+ treeDownref( prg, sp, (Tree*)accum );
+ treeDownref( prg, sp, (Tree*)accumStream );
break;
}
case IN_CONSTRUCT_TERM: {
diff --git a/colm/pdarun.c b/colm/pdarun.c
index 60e5d0da..7b05e075 100644
--- a/colm/pdarun.c
+++ b/colm/pdarun.c
@@ -157,43 +157,11 @@ Head *streamPull( Program *prg, FsmRun *fsmRun, InputStream *inputStream, long l
return tokdata;
}
-#if 0
-void sendBackRunBufHead( FsmRun *fsmRun, InputStream *inputStream )
-{
- debug( REALM_PARSE, "pushing back runbuf\n" );
-
- /* Move to the next run buffer. */
- RunBuf *back = fsmRun->runBuf;
- fsmRun->runBuf = fsmRun->runBuf->next;
-
- /* Flush out the input buffer. */
- back->length = fsmRun->pe - fsmRun->p;
- back->offset = 0;
- pushBackBuf( inputStream, back );
-
- /* Set data and de. */
- if ( fsmRun->runBuf == 0 ) {
- fsmRun->runBuf = newRunBuf();
- fsmRun->runBuf->next = 0;
- fsmRun->p = fsmRun->pe = fsmRun->runBuf->data;
- }
-
- fsmRun->p = fsmRun->pe = fsmRun->runBuf->data + fsmRun->runBuf->length;
-}
-#endif
-
void undoStreamPull( FsmRun *fsmRun, InputStream *inputStream, const char *data, long length )
{
debug( REALM_PARSE, "undoing stream pull\n" );
-// if ( fsmRun->p == fsmRun->pe && fsmRun->p == fsmRun->runBuf->data )
-// sendBackRunBufHead( fsmRun, inputStream );
-//
-// //assert( fsmRun->p - length >= fsmRun->runBuf->data );
-// fsmRun->p -= length;
-
prependData( inputStream, data, length );
-
}
void streamPushText( FsmRun *fsmRun, InputStream *inputStream, const char *data, long length )
diff --git a/colm/tree.c b/colm/tree.c
index ed7d30c6..66dbc207 100644
--- a/colm/tree.c
+++ b/colm/tree.c
@@ -768,13 +768,6 @@ Tree *splitTree( Program *prg, Tree *tree )
assert( tree->refs >= 1 );
if ( tree->refs > 1 ) {
-// #ifdef COLM_LOG_BYTECODE
-// if ( colm_log_bytecode ) {
-// cerr << "splitting tree: " << tree << " refs: " <<
-// tree->refs << endl;
-// }
-// #endif
-
Kid *oldNextDown = 0, *newNextDown = 0;
Tree *newTree = copyTree( prg, tree, oldNextDown, &newNextDown );
treeUpref( newTree );
@@ -879,9 +872,10 @@ free_tree:
Accum *accum = (Accum*)tree;
clearFsmRun( prg, accum->fsmRun );
clearPdaRun( prg, sp, accum->pdaRun );
+ //treeDownref( prg, accum->accumStream );
free( accum->pdaRun );
free( accum->fsmRun );
- free( accum->accumStream->in );
+ //free( accum->accumStream->in );
mapElFree( prg, (MapEl*)accum );
}
else {