summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2012-01-14 23:02:20 +0000
committerAdrian Thurston <thurston@complang.org>2012-01-14 23:02:20 +0000
commit00ba6fe66b59207ddd531ff88405a9630afd7aab (patch)
tree76feddfdd84668f63109cd6e88a77d7a3f6b99f1
parente3d86f9d80b97cb45b1d113875bbeac01b4475bc (diff)
downloadcolm-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.c15
-rw-r--r--colm/compile.cc2
-rw-r--r--colm/declare.cc1
-rw-r--r--colm/pdarun.c10
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;