summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@colm.net>2019-12-30 14:31:22 +0200
committerAdrian Thurston <thurston@colm.net>2019-12-30 14:31:22 +0200
commit06fbe467c0b900ce20705ad3b4eb8e8454b4a56e (patch)
tree4fbd70496081758802910bc8d4fb68cc336cb9ea
parentd01f82860b3d7d4234726cd3e7d8c379e7a5633c (diff)
downloadcolm-06fbe467c0b900ce20705ad3b4eb8e8454b4a56e.tar.gz
colm: implemented IN_SET_RHS_VAL_WC and stubbed related
Was not possible to set a named RHS element in a tree. Added the _WC version and stubbed the others.
-rw-r--r--colm/bytecode.c41
-rw-r--r--colm/synthesis.cc8
-rw-r--r--colm/tree.c11
-rw-r--r--colm/tree.h1
4 files changed, 61 insertions, 0 deletions
diff --git a/colm/bytecode.c b/colm/bytecode.c
index fe0026fc..6f4d0b5d 100644
--- a/colm/bytecode.c
+++ b/colm/bytecode.c
@@ -1558,6 +1558,47 @@ again:
vm_push_tree( val );
break;
}
+ case IN_GET_RHS_VAL_WC:
+ fatal( "UNIMPLEMENTED INSRUCTION: IN_GET_RHS_VAL_WC\n" );
+ break;
+ case IN_GET_RHS_VAL_WV:
+ fatal( "UNIMPLEMENTED INSRUCTION: IN_GET_RHS_VAL_WV\n" );
+ break;
+ case IN_GET_RHS_VAL_BKT:
+ fatal( "UNIMPLEMENTED INSRUCTION: IN_GET_RHS_VAL_BKT\n" );
+ break;
+
+ case IN_SET_RHS_VAL_WC:
+ debug( prg, REALM_BYTECODE, "IN_SET_RHS_VAL_WC\n" );
+ int i, done = 0;
+ uchar len;
+
+ tree_t *obj = vm_pop_tree();
+ tree_t *val = vm_pop_tree();
+ colm_tree_downref( prg, sp, obj );
+
+ read_byte( len );
+ for ( i = 0; i < len; i++ ) {
+ uchar prod_num, child_num;
+ read_byte( prod_num );
+ read_byte( child_num );
+ if ( !done && obj->prod_num == prod_num ) {
+ tree_t *prev = get_rhs_el( prg, obj, child_num );
+ colm_tree_downref( prg, sp, prev );
+ set_rhs_el( prg, obj, child_num, val );
+ done = 1;
+ }
+ }
+
+ //colm_tree_upref( prg, val );
+ //vm_push_tree( val );
+ break;
+ case IN_SET_RHS_VAL_WV:
+ fatal( "UNIMPLEMENTED INSRUCTION: IN_SET_RHS_VAL_WV\n" );
+ break;
+ case IN_SET_RHS_VAL_BKT:
+ fatal( "UNIMPLEMENTED INSRUCTION: IN_SET_RHS_VAL_BKT\n" );
+ break;
case IN_POP_TREE: {
debug( prg, REALM_BYTECODE, "IN_POP_TREE\n" );
diff --git a/colm/synthesis.cc b/colm/synthesis.cc
index e1d192b6..17c2440a 100644
--- a/colm/synthesis.cc
+++ b/colm/synthesis.cc
@@ -760,6 +760,14 @@ void LangVarRef::setField( Compiler *pd, CodeVect &code,
/* Maybe write out an offset. */
if ( el->useOffset() )
code.appendHalf( el->offset );
+ else if ( el->isRhsGet() ) {
+ /* Need to place the array computing the val. */
+ code.append( el->rhsVal.length() );
+ for ( Vector<RhsVal>::Iter rg = el->rhsVal; rg.lte(); rg++ ) {
+ code.append( rg->prodEl->production->prodNum );
+ code.append( rg->prodEl->pos );
+ }
+ }
}
diff --git a/colm/tree.c b/colm/tree.c
index 9e59c464..e05681b9 100644
--- a/colm/tree.c
+++ b/colm/tree.c
@@ -1131,6 +1131,17 @@ tree_t *get_rhs_el( program_t *prg, tree_t *lhs, long position )
return pos->tree;
}
+void set_rhs_el( program_t *prg, tree_t *lhs, long position, tree_t *value )
+{
+ kid_t *pos = tree_child( prg, lhs );
+ while ( position > 0 ) {
+ pos = pos->next;
+ position -= 1;
+ }
+ pos->tree = value;
+}
+
+
kid_t *get_rhs_el_kid( program_t *prg, tree_t *lhs, long position )
{
kid_t *pos = tree_child( prg, lhs );
diff --git a/colm/tree.h b/colm/tree.h
index fefb6b20..460d22c6 100644
--- a/colm/tree.h
+++ b/colm/tree.h
@@ -258,6 +258,7 @@ colm_value_t colm_get_pointer_val( tree_t *pointer );
tree_t *colm_tree_get_field( tree_t *tree, word_t field );
tree_t *get_field_split( struct colm_program *prg, tree_t *tree, word_t field );
tree_t *get_rhs_el( struct colm_program *prg, tree_t *lhs, long position );
+void set_rhs_el( program_t *prg, tree_t *lhs, long position, tree_t *value );
kid_t *get_rhs_el_kid( struct colm_program *prg, tree_t *lhs, long position );
parse_tree_t *get_rhs_parse_tree( struct colm_program *prg,
parse_tree_t *lhs, long position );