diff options
author | Adrian Thurston <thurston@complang.org> | 2012-01-14 23:02:20 +0000 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2012-01-14 23:02:20 +0000 |
commit | 00ba6fe66b59207ddd531ff88405a9630afd7aab (patch) | |
tree | 76feddfdd84668f63109cd6e88a77d7a3f6b99f1 | |
parent | e3d86f9d80b97cb45b1d113875bbeac01b4475bc (diff) | |
download | colm-00ba6fe66b59207ddd531ff88405a9630afd7aab.tar.gz |
Fixed refcounting when lhs is modified. Eliminated the conditional save to
parsed. True when attr modified and the tree is replaced. Not useful since we
dynamically test for a change regardless. We save to parsed whenever lhs is
accessed.
-rw-r--r-- | colm/bytecode.c | 15 | ||||
-rw-r--r-- | colm/compile.cc | 2 | ||||
-rw-r--r-- | colm/declare.cc | 1 | ||||
-rw-r--r-- | colm/pdarun.c | 10 |
4 files changed, 17 insertions, 11 deletions
diff --git a/colm/bytecode.c b/colm/bytecode.c index 81c82905..61cd3124 100644 --- a/colm/bytecode.c +++ b/colm/bytecode.c @@ -864,6 +864,7 @@ again: read_tree( restore ); debug( REALM_BYTECODE, "IN_RESTORE_LHS\n" ); + treeDownref( prg, sp, exec->pdaRun->input1->tree ); exec->pdaRun->input1->tree = restore; break; } @@ -1192,20 +1193,20 @@ again: vm_local(field) = val; break; } + case IN_INIT_LHS_EL: { short field; - uchar save; read_half( field ); - read_byte( save ); - debug( REALM_BYTECODE, "IN_INIT_LHS_EL %hd %hhu\n", field, save ); + debug( REALM_BYTECODE, "IN_INIT_LHS_EL %hd\n", field ); /* We transfer it to to the local field. Possibly take a copy. */ Tree *val = exec->pdaRun->redLel->tree; - if ( save ) { - treeUpref( val ); - exec->pdaRun->parsed = val; - } + + /* Save it. */ + treeUpref( val ); + exec->pdaRun->parsed = val; + exec->pdaRun->redLel->tree = 0; vm_local(field) = val; break; diff --git a/colm/compile.cc b/colm/compile.cc index 8e09f5ee..42c30390 100644 --- a/colm/compile.cc +++ b/colm/compile.cc @@ -2562,8 +2562,8 @@ void ParseData::compileReductionCode( Definition *prod ) /* Might need to load right hand side values. */ addProdRHSLoads( prod, code, afterInit ); - addProdLHSLoad( prod, code, afterInit ); + addProdLHSLoad( prod, code, afterInit ); addPushBackLHS( prod, code, afterInit ); code.append( IN_POP_LOCALS ); diff --git a/colm/declare.cc b/colm/declare.cc index a50ebcb3..5f43bb2e 100644 --- a/colm/declare.cc +++ b/colm/declare.cc @@ -129,7 +129,6 @@ void ParseData::addProdLHSLoad( Definition *prod, CodeVect &code, long &insertPo if ( lhsField->beenReferenced ) { loads.append( IN_INIT_LHS_EL ); loads.appendHalf( lhsField->offset ); - loads.append( lhsField->dirtyTree ); } code.insert( insertPos, loads ); diff --git a/colm/pdarun.c b/colm/pdarun.c index ad6cdb01..9782caf2 100644 --- a/colm/pdarun.c +++ b/colm/pdarun.c @@ -1779,15 +1779,21 @@ case PcrReduction: if ( pdaRun->parsed != pdaRun->redLel->tree ) { debug( REALM_PARSE, "lhs tree was modified, adding a restore instruction\n" ); - /* Transfer the lhs from the environment to redLel. */ - pdaRun->redLel->tree = prepParseTree( prg, sp, pdaRun->redLel->tree ); + /* Make it into a parse tree. */ + Tree *newPt = prepParseTree( prg, sp, pdaRun->redLel->tree ); + treeDownref( prg, sp, pdaRun->redLel->tree ); + + /* Copy it in. */ + pdaRun->redLel->tree = newPt; treeUpref( pdaRun->redLel->tree ); + /* Add the restore instruct. */ append( &pdaRun->rcodeCollect, IN_RESTORE_LHS ); appendWord( &pdaRun->rcodeCollect, (Word)pdaRun->parsed ); append( &pdaRun->rcodeCollect, SIZEOF_CODE + SIZEOF_WORD ); } else { + /* Not changed. Done with parsed. */ treeDownref( prg, sp, pdaRun->parsed ); } pdaRun->parsed = 0; |