summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2015-01-18 16:59:32 -0500
committerAdrian Thurston <thurston@complang.org>2015-01-18 16:59:32 -0500
commit7c402fcd65b36a20c8f7059b551e99212fa4adae (patch)
tree852717acbe7385d5e981847cdef1d1b4ad943fab
parente295b7169e3e234994202322737e0e2a337c9311 (diff)
downloadcolm-7c402fcd65b36a20c8f7059b551e99212fa4adae.tar.gz
some cleanup in the pointer
-rw-r--r--src/bytecode.c28
-rw-r--r--src/bytecode.h4
-rw-r--r--src/program.h2
-rw-r--r--src/tree.c30
-rw-r--r--src/tree.h7
-rw-r--r--test/pointer1.lm34
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;
diff --git a/src/tree.c b/src/tree.c
index 5a76e304..524fa529 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -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 )
diff --git a/src/tree.h b/src/tree.h
index 527e460e..59d0f04f 100644
--- a/src/tree.h
+++ b/src/tree.h
@@ -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;