diff options
author | Adrian Thurston <thurston@complang.org> | 2012-01-01 01:18:10 +0000 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2012-01-01 01:18:10 +0000 |
commit | 90ad97b08f19b5e8d50949e6794ad656f9ec50d9 (patch) | |
tree | a52f7cf6b8b8afec3a84957bfd5eb88b0172f6b1 | |
parent | a19f22e0a5f9eaeab88b68a4ec048912912d6332 (diff) | |
download | colm-90ad97b08f19b5e8d50949e6794ad656f9ec50d9.tar.gz |
Some work on references WRT parsers and streams.
-rw-r--r-- | colm/bytecode.c | 14 | ||||
-rw-r--r-- | colm/pdarun.c | 32 | ||||
-rw-r--r-- | colm/tree.c | 10 |
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 { |