diff options
-rw-r--r-- | colm/bytecode.c | 41 | ||||
-rw-r--r-- | colm/synthesis.cc | 8 | ||||
-rw-r--r-- | colm/tree.c | 11 | ||||
-rw-r--r-- | colm/tree.h | 1 |
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 ); |