diff options
author | Adrian Thurston <thurston@complang.org> | 2015-01-18 16:59:32 -0500 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2015-01-18 16:59:32 -0500 |
commit | 7c402fcd65b36a20c8f7059b551e99212fa4adae (patch) | |
tree | 852717acbe7385d5e981847cdef1d1b4ad943fab | |
parent | e295b7169e3e234994202322737e0e2a337c9311 (diff) | |
download | colm-7c402fcd65b36a20c8f7059b551e99212fa4adae.tar.gz |
some cleanup in the pointer
-rw-r--r-- | src/bytecode.c | 28 | ||||
-rw-r--r-- | src/bytecode.h | 4 | ||||
-rw-r--r-- | src/program.h | 2 | ||||
-rw-r--r-- | src/tree.c | 30 | ||||
-rw-r--r-- | src/tree.h | 7 | ||||
-rw-r--r-- | test/pointer1.lm | 34 |
6 files changed, 57 insertions, 48 deletions
diff --git a/src/bytecode.c b/src/bytecode.c index 8f889e9c..ba8b7375 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -1302,11 +1302,11 @@ again: Tree *obj = vm_pop(); treeDownref( prg, sp, obj ); - Tree *ptr = colm_tree_get_field( obj, field ); - Tree *dval = 0; - if ( ptr ) - dval = (Tree*)colm_get_pointer_val( (Pointer*)ptr ); - vm_push( dval ); + Tree *pointer = colm_tree_get_field( obj, field ); + Value value = 0; + if ( pointer != 0 ) + value = colm_get_pointer_val( pointer ); + vm_push_value( value ); break; } case IN_SET_FIELD_VAL_WC: { @@ -1316,7 +1316,7 @@ again: debug( prg, REALM_BYTECODE, "IN_SET_FIELD_VAL_WC %d\n", field ); Tree *obj = vm_pop(); - Struct *strct = vm_pop_struct(); + Value value = vm_pop_value(); treeDownref( prg, sp, obj ); /* Downref the old value. */ @@ -1324,11 +1324,8 @@ again: treeDownref( prg, sp, prev ); /* Make it into a pointer. */ - Tree *pointer = 0; - if ( strct != 0 ) { - pointer = (Tree*) colm_construct_pointer( prg, (Value)strct ); - treeUpref( pointer ); - } + Tree *pointer = colm_construct_pointer( prg, value ); + treeUpref( pointer ); colm_tree_set_field( prg, obj, field, pointer ); break; @@ -2833,15 +2830,6 @@ again: vm_push( res ); break; } - case IN_TREE_NEW: { - debug( prg, REALM_BYTECODE, "IN_TREE_NEW \n" ); - - Tree *tree = vm_pop(); - Tree *res = (Tree*) colm_construct_pointer( prg, (Value)tree ); - treeUpref( res ); - vm_push( res ); - break; - } case IN_PTR_ACCESS_WV: { debug( prg, REALM_BYTECODE, "IN_PTR_ACCESS_WV\n" ); diff --git a/src/bytecode.h b/src/bytecode.h index 163efc6c..65db7593 100644 --- a/src/bytecode.h +++ b/src/bytecode.h @@ -22,6 +22,7 @@ typedef unsigned char uchar; typedef unsigned long colm_value_t; /* + * 0x24 * 0x6e * 0xbc * 0xe6 @@ -77,7 +78,6 @@ typedef unsigned long colm_value_t; #define IN_CONSTRUCT 0x23 #define IN_CONS_OBJECT 0xf0 #define IN_CONS_GENERIC 0xf1 -#define IN_TREE_NEW 0x24 #define IN_TREE_CAST 0xe4 #define IN_GET_LOCAL_R 0x25 @@ -480,12 +480,14 @@ enum LEL_ID { #define vm_push_stream(i) vm_push_type(Stream*, i) #define vm_push_struct(i) vm_push_type(Struct*, i) #define vm_push_parser(i) vm_push_type(Parser*, i) +#define vm_push_value(i) vm_push_type(Value, i) #define vm_pop_stream() vm_pop_type(Stream*) #define vm_pop_struct() vm_pop_type(Struct*) #define vm_pop_parser() vm_pop_type(Parser*) #define vm_pop_list() vm_pop_type(List*) #define vm_pop_map() vm_pop_type(Map*) +#define vm_pop_value() vm_pop_type(Value) #define vm_pop_ignore() \ ({ (sp+1) >= prg->sb_end ? (sp = vm_bs_pop(prg, sp, 1)) : (sp += 1); }) diff --git a/src/program.h b/src/program.h index 293cf985..92e13ab8 100644 --- a/src/program.h +++ b/src/program.h @@ -115,8 +115,6 @@ struct colm_program Tree *trueVal; Tree *falseVal; - Kid *origHeap; - struct colm_heap_list heap; Stream *stdinVal; @@ -180,20 +180,21 @@ Tree *constructString( Program *prg, Head *s ) return (Tree*)str; } -Pointer *colm_construct_pointer( Program *prg, Value value ) +Tree *colm_construct_pointer( Program *prg, Value value ) { - Kid *kid = kidAllocate( prg ); - kid->tree = value; - kid->next = prg->origHeap; - prg->origHeap = kid; - Pointer *pointer = (Pointer*) treeAllocate( prg ); pointer->id = LEL_ID_PTR; - pointer->value = kid; + pointer->value = value; - return pointer; + return (Tree*)pointer; } +Value colm_get_pointer_val( Tree *ptr ) +{ + return ((Pointer*)ptr)->value; +} + + Tree *constructTerm( Program *prg, Word id, Head *tokdata ) { LangElInfo *lelInfo = prg->rtd->lelInfo; @@ -1288,19 +1289,6 @@ Tree *getFieldSplit( Program *prg, Tree *tree, Word field ) return split; } -Tree *colm_get_pointer_val( Pointer *ptr ) -{ - return ptr->value->tree; -} - -Tree *getPtrValSplit( Program *prg, Pointer *ptr ) -{ - Tree *val = ptr->value->tree; - Tree *split = splitTree( prg, val ); - ptr->value->tree = split; - return split; -} - /* This must traverse in the same order that the bindId assignments are done * in. */ int matchPattern( Tree **bindings, Program *prg, long pat, Kid *kid, int checkNext ) @@ -103,7 +103,7 @@ typedef struct _Pointer long refs; Kid *child; - Kid *value; + colm_value_t value; } Pointer; typedef struct _Str @@ -207,7 +207,7 @@ Kid *treeExtractChild( struct colm_program *prg, Tree *tree ); Kid *reverseKidList( Kid *kid ); Tree *constructInteger( struct colm_program *prg, long i ); -Pointer *colm_construct_pointer( struct colm_program *prg, colm_value_t value ); +Tree *colm_construct_pointer( struct colm_program *prg, colm_value_t value ); Tree *constructTerm( struct colm_program *prg, Word id, Head *tokdata ); Tree *constructTree( struct colm_program *prg, Kid *kid, Tree **bindings, long pat ); @@ -228,8 +228,7 @@ void streamFree( struct colm_program *prg, Stream *s ); Tree *copyTree( struct colm_program *prg, Tree *tree, Kid *oldNextDown, Kid **newNextDown ); -Tree *colm_get_pointer_val( Pointer *ptr ); -Tree *getPtrValSplit( struct colm_program *prg, Pointer *ptr ); +colm_value_t colm_get_pointer_val( Tree *pointer ); Tree *colm_tree_get_field( Tree *tree, Word field ); Tree *getFieldSplit( struct colm_program *prg, Tree *tree, Word field ); Tree *getRhsEl( struct colm_program *prg, Tree *lhs, long position ); diff --git a/test/pointer1.lm b/test/pointer1.lm new file mode 100644 index 00000000..38677bd2 --- /dev/null +++ b/test/pointer1.lm @@ -0,0 +1,34 @@ +struct undo + + lex + ignore /( ' ' | '\t')+/ + literal `* `( `) `^ `; + token NL /'\n'/ + token id /[a-zA-Z_]+/ + end + + struct foo + Start: start + end + + def item + [id] + | [`( item* `)] + + def start + Foo: foo + [item* `; NL] + +end + +Undo: undo = new undo + +parse Input: undo::start(Undo)[ stdin ] + +Input.Foo = new undo::foo +Input.Foo->Start = Input +print( Input.Foo->Start ) +###### IN ###### +a b c ( d e ) f; +###### EXP ###### +a b c ( d e ) f; |