summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2015-01-05 22:19:53 -0500
committerAdrian Thurston <thurston@complang.org>2015-01-05 22:19:53 -0500
commit94798b8c5670f226c18db6e24cfceb3ef4da3540 (patch)
tree753a1f95c91d2ef421cd20bdcbbf9876f9ae1d79
parent484f6b5f78cf3ecfc3e676366c4ef98e8dda9692 (diff)
downloadcolm-94798b8c5670f226c18db6e24cfceb3ef4da3540.tar.gz
some improvements to the struct macros, and code movement
-rw-r--r--src/bytecode.c71
-rw-r--r--src/list.c67
-rw-r--r--src/struct.c81
-rw-r--r--src/struct.h25
4 files changed, 117 insertions, 127 deletions
diff --git a/src/bytecode.c b/src/bytecode.c
index b8d2bea1..926b48a6 100644
--- a/src/bytecode.c
+++ b/src/bytecode.c
@@ -454,8 +454,8 @@ List *constructArgv( Program *prg, int argc, const char **argv )
treeUpref( arg );
Struct *s = colm_struct_new_size( prg, 3 );
- colm_struct_set_field( s, 0, arg );
- ListEl *listEl = colm_struct_get_addr_type( s, ListEl, 1 );
+ colm_struct_set_field( s, Tree*, 0, arg );
+ ListEl *listEl = colm_struct_get_addr( s, ListEl*, 1 );
colm_list_append( list, listEl );
}
@@ -1316,7 +1316,7 @@ again:
debug( prg, REALM_BYTECODE, "IN_GET_STRUCT_R %d\n", field );
Tree *obj = vm_pop();
- Tree *val = colm_struct_get_field( obj, field );
+ Tree *val = colm_struct_get_field( obj, Tree*, field );
treeUpref( val );
vm_push( val );
break;
@@ -1328,7 +1328,7 @@ again:
debug( prg, REALM_BYTECODE, "IN_GET_STRUCT_WC %d\n", field );
Tree *obj = vm_pop();
- Tree *val = colm_struct_get_field( obj, field );
+ Tree *val = colm_struct_get_field( obj, Tree*, field );
treeUpref( val );
vm_push( val );
@@ -1341,7 +1341,7 @@ again:
debug( prg, REALM_BYTECODE, "IN_GET_STRUCT_WV\n" );
Tree *obj = vm_pop();
- Tree *val = colm_struct_get_field( obj, field );
+ Tree *val = colm_struct_get_field( obj, Tree*, field );
treeUpref( val );
vm_push( val );
@@ -1374,9 +1374,9 @@ again:
Tree *val = vm_pop();
/* Downref the old value. */
- Tree *prev = colm_struct_get_field( obj, field );
+ Tree *prev = colm_struct_get_field( obj, Tree*, field );
treeDownref( prg, sp, prev );
- colm_struct_set_field( obj, field, val );
+ colm_struct_set_field( obj, Tree*, field, val );
break;
}
case IN_SET_STRUCT_WV: {
@@ -1389,8 +1389,8 @@ again:
Tree *val = vm_pop();
/* Save the old value, then set the field. */
- Tree *prev = colm_struct_get_field( obj, field );
- colm_struct_set_field( obj, field, val );
+ Tree *prev = colm_struct_get_field( obj, Tree*, field );
+ colm_struct_set_field( obj, Tree*, field, val );
/* Set up the reverse instruction. */
rcodeCode( exec, IN_SET_STRUCT_BKT );
@@ -1410,10 +1410,10 @@ again:
Tree *obj = vm_pop();
/* Downref the old value. */
- Tree *prev = colm_struct_get_field( obj, field );
+ Tree *prev = colm_struct_get_field( obj, Tree*, field );
treeDownref( prg, sp, prev );
- colm_struct_set_field( obj, field, val );
+ colm_struct_set_field( obj, Tree*, field, val );
break;
}
case IN_GET_STRUCT_VAL_R: {
@@ -1423,7 +1423,7 @@ again:
debug( prg, REALM_BYTECODE, "IN_GET_STRUCT_VAL_R %d\n", field );
Tree *obj = vm_pop();
- Tree *val = colm_struct_get_field( obj, field );
+ Tree *val = colm_struct_get_field( obj, Tree*, field );
vm_push( val );
break;
}
@@ -1436,7 +1436,7 @@ again:
Tree *obj = vm_pop();
Tree *val = vm_pop();
- colm_struct_set_field( obj, field, val );
+ colm_struct_set_field( obj, Tree*, field, val );
break;
}
case IN_SET_STRUCT_VAL_WV: {
@@ -1449,7 +1449,7 @@ again:
Tree *val = vm_pop();
/* FIXME: save val here. */
- colm_struct_set_field( obj, field, val );
+ colm_struct_set_field( obj, Tree*, field, val );
break;
}
case IN_GET_RHS_VAL_R: {
@@ -2370,8 +2370,8 @@ again:
debug( prg, REALM_BYTECODE, "IN_PARSE_FRAG_BKT %hd\n", stopId );
- PdaRun *pdaRun = colm_struct_get_field_type( exec->parser, PdaRun *, 6 );
- Stream *input = colm_struct_get_field_type( exec->parser, Stream *, 7 );
+ PdaRun *pdaRun = colm_struct_get_field( exec->parser, PdaRun *, 6 );
+ Stream *input = colm_struct_get_field( exec->parser, Stream *, 7 );
exec->pcr = undoParseFrag( prg, sp, pdaRun, input, exec->steps, exec->pcr );
@@ -2436,12 +2436,12 @@ again:
debug( prg, REALM_BYTECODE, "IN_PARSE_FINISH_WV %hd\n", stopId );
- PdaRun *pdaRun = colm_struct_get_field_type( exec->parser, PdaRun *, 6 );
- Stream *input = colm_struct_get_field_type( exec->parser, Stream *, 7 );
+ PdaRun *pdaRun = colm_struct_get_field( exec->parser, PdaRun *, 6 );
+ Stream *input = colm_struct_get_field( exec->parser, Stream *, 7 );
Tree *result = 0;
exec->pcr = parseFinish( &result, prg, sp, pdaRun, input, true, exec->pcr );
- colm_struct_set_field_type( exec->parser, Tree*, 8, result );
+ colm_struct_set_field( exec->parser, Tree*, 8, result );
if ( exec->pcr == PcrDone )
instr += SIZEOF_CODE;
@@ -2483,8 +2483,8 @@ again:
debug( prg, REALM_BYTECODE, "IN_PARSE_FINISH_BKT %hd\n", stopId );
- PdaRun *pdaRun = colm_struct_get_field_type( exec->parser, PdaRun *, 6 );
- Stream *input = colm_struct_get_field_type( exec->parser, Stream *, 7 );
+ PdaRun *pdaRun = colm_struct_get_field( exec->parser, PdaRun *, 6 );
+ Stream *input = colm_struct_get_field( exec->parser, Stream *, 7 );
exec->pcr = undoParseFrag( prg, sp, pdaRun, input, exec->steps, exec->pcr );
@@ -3022,8 +3022,8 @@ again:
List *list = vm_pop_type( List* );
Struct *s = vm_pop_type( Struct* );
- ListEl *listEl = colm_struct_get_addr_type( s, ListEl,
- prg->rtd->genericInfo[genId].elOffset );
+ GenericInfo *gi = &prg->rtd->genericInfo[genId];
+ ListEl *listEl = colm_struct_get_addr( s, ListEl*, gi->elOffset );
colm_list_prepend( list, listEl );
@@ -3039,8 +3039,8 @@ again:
List *list = vm_pop_type(List*);
Struct *s = vm_pop_type(Struct*);
- ListEl *listEl = colm_struct_get_addr_type( s, ListEl,
- prg->rtd->genericInfo[genId].elOffset );
+ GenericInfo *gi = &prg->rtd->genericInfo[genId];
+ ListEl *listEl = colm_struct_get_addr( s, ListEl*, gi->elOffset );
colm_list_prepend( list, listEl );
@@ -3067,8 +3067,8 @@ again:
List *list = vm_pop_type(List*);
Struct *s = vm_pop_type(Struct*);
- ListEl *listEl = colm_struct_get_addr_type( s, ListEl,
- prg->rtd->genericInfo[genId].elOffset );
+ GenericInfo *gi = &prg->rtd->genericInfo[genId];
+ ListEl *listEl = colm_struct_get_addr( s, ListEl*, gi->elOffset );
colm_list_append( list, listEl );
@@ -3084,8 +3084,8 @@ again:
List *list = vm_pop_type(List*);
Struct *s = vm_pop_type(Struct*);
- ListEl *listEl = colm_struct_get_addr_type( s, ListEl,
- prg->rtd->genericInfo[genId].elOffset );
+ GenericInfo *gi = &prg->rtd->genericInfo[genId];
+ ListEl *listEl = colm_struct_get_addr( s, ListEl*, gi->elOffset );
colm_list_append( list, listEl );
@@ -3112,8 +3112,8 @@ again:
debug( prg, REALM_BYTECODE, "IN_GET_LIST_EL_MEM_R\n" );
Struct *s = vm_pop_type( Struct * );
- ListEl *listEl = colm_struct_get_addr_type( s, ListEl,
- prg->rtd->genericInfo[genId].elOffset );
+ GenericInfo *gi = &prg->rtd->genericInfo[genId];
+ ListEl *listEl = colm_struct_get_addr( s, ListEl*, gi->elOffset );
Struct *val = colm_list_el_get( prg, listEl, genId, field );
vm_push_type( Struct *, val );
break;
@@ -3177,7 +3177,8 @@ again:
ListEl *head = list->head;
colm_list_detach_head( list );
- Struct *s = ((void*)head) - (prg->rtd->genericInfo[genId].elOffset * sizeof(Tree*)) - sizeof(struct colm_struct);
+ GenericInfo *gi = &prg->rtd->genericInfo[genId];
+ Struct *s = colm_struct_container( head, gi->elOffset );
vm_push_type( Struct *, s );
break;
}
@@ -3850,9 +3851,9 @@ again:
/* Tree comes back upreffed. */
Tree *tree = constructArgv0( prg, prg->argc, prg->argv );
- Tree *prev = colm_struct_get_field( prg->global, field );
+ Tree *prev = colm_struct_get_field( prg->global, Tree*, field );
treeDownref( prg, sp, prev );
- colm_struct_set_field( prg->global, field, tree );
+ colm_struct_set_field( prg->global, Tree*, field, tree );
break;
}
case IN_LOAD_ARGV: {
@@ -3861,7 +3862,7 @@ again:
debug( prg, REALM_BYTECODE, "IN_LOAD_ARGV %lu\n", field );
List *list = constructArgv( prg, prg->argc, prg->argv );
- colm_struct_set_field_type( prg->global, List*, field, list );
+ colm_struct_set_field( prg->global, List*, field, list );
break;
}
case IN_INIT_LOCALS: {
diff --git a/src/list.c b/src/list.c
index ee8644a9..050ba948 100644
--- a/src/list.c
+++ b/src/list.c
@@ -3,7 +3,11 @@
*/
#include <colm/pdarun.h>
+#include <colm/program.h>
#include <colm/struct.h>
+#include <string.h>
+#include <stdlib.h>
+#include <assert.h>
static void colm_list_add_after( List *list, ListEl *prev_el, ListEl *new_el );
static void colm_list_add_before( List *list, ListEl *next_el, ListEl *new_el);
@@ -116,3 +120,66 @@ ListEl *colm_list_detach( List *list, ListEl *el )
list->listLen--;
return el;
}
+
+void colm_list_destroy( struct colm_program *prg, Tree **sp, struct colm_struct *s )
+{
+}
+
+List *colm_list_new( struct colm_program *prg )
+{
+ size_t memsize = sizeof(struct colm_list);
+ struct colm_list *list = (struct colm_list*) malloc( memsize );
+ memset( list, 0, memsize );
+ colm_struct_add( prg, (struct colm_struct *)list );
+ list->id = STRUCT_INBUILT_ID;
+ list->destructor = &colm_list_destroy;
+ return list;
+}
+
+struct colm_struct *colm_list_get( struct colm_program *prg,
+ List *list, Word genId, Word field )
+{
+ GenericInfo *gi = &prg->rtd->genericInfo[genId];
+ ListEl *result = 0;
+ switch ( field ) {
+ case 0:
+ result = list->head;
+ break;
+ case 1:
+ result = list->tail;
+ break;
+ default:
+ assert( 0 );
+ break;
+ }
+
+ struct colm_struct *s = result != 0 ?
+ colm_struct_container( result, gi->elOffset ) : 0;
+ return s;
+}
+
+struct colm_struct *colm_list_el_get( struct colm_program *prg,
+ ListEl *listEl, Word genId, Word field )
+{
+ GenericInfo *gi = &prg->rtd->genericInfo[genId];
+ ListEl *result = 0;
+ switch ( field ) {
+ case 0:
+ result = listEl->list_prev;
+ break;
+ case 1:
+ result = listEl->list_next;
+ break;
+// case 2:
+// result = listEl->value;
+// treeUpref( result );
+// break;
+ default:
+ assert( 0 );
+ break;
+ }
+
+ struct colm_struct *s = result != 0 ?
+ colm_struct_container( result, gi->elOffset ) : 0;
+ return s;
+}
diff --git a/src/struct.c b/src/struct.c
index 8f567f7c..b737a8a4 100644
--- a/src/struct.c
+++ b/src/struct.c
@@ -5,14 +5,12 @@
#include <string.h>
#include <assert.h>
-#define STRUCT_INBUILT_ID -1
-
struct colm_tree *colm_get_global( Program *prg, long pos )
{
- return colm_struct_get_field( prg->global, pos );
+ return colm_struct_get_field( prg->global, Tree*, pos );
}
-static void colm_struct_add( Program *prg, struct colm_struct *item )
+void colm_struct_add( Program *prg, struct colm_struct *item )
{
if ( prg->heap.head == 0 ) {
prg->heap.head = prg->heap.tail = item;
@@ -55,7 +53,7 @@ void colm_struct_delete( Program *prg, Tree **sp, struct colm_struct *el )
short *t = prg->rtd->selInfo[el->id].trees;
int i, len = prg->rtd->selInfo[el->id].treesLen;
for ( i = 0; i < len; i++ ) {
- Tree *tree = colm_struct_get_field( el, t[i] );
+ Tree *tree = colm_struct_get_field( el, Tree*, t[i] );
treeDownref( prg, sp, tree );
}
}
@@ -104,29 +102,6 @@ Stream *colm_stream_new2( Program *prg )
return stream;
}
-void colm_list_destroy( Program *prg, Tree **sp, struct colm_struct *s )
-{
- struct colm_list *list = (struct colm_list*) s;
-
- ListEl *el = list->head;
-// while ( el != 0 ) {
-// ListEl *next = el->list_next;
-// treeDownref( prg, sp, el->value );
-// //listElFree( prg, el );
-// el = next;
-// }
-}
-
-List *colm_list_new( struct colm_program *prg )
-{
- size_t memsize = sizeof(struct colm_list);
- struct colm_list *list = (struct colm_list*) malloc( memsize );
- memset( list, 0, memsize );
- colm_struct_add( prg, (struct colm_struct *)list );
- list->id = STRUCT_INBUILT_ID;
- list->destructor = &colm_list_destroy;
- return list;
-}
void colm_map_destroy( Program *prg, Tree **sp, struct colm_struct *s )
{
@@ -152,53 +127,3 @@ Map *colm_map_new( struct colm_program *prg )
return map;
}
-struct colm_struct *colm_list_get( struct colm_program *prg,
- List *list, Word genId, Word field )
-{
- GenericInfo *genericInfo = &prg->rtd->genericInfo[genId];
- ListEl *result = 0;
- switch ( field ) {
- case 0:
- result = list->head;
- break;
- case 1:
- result = list->tail;
- break;
- default:
- assert( 0 );
- break;
- }
-
- struct colm_struct *s = result != 0 ?
- ((void*)result) - (genericInfo->elOffset * sizeof(Tree*)) -
- sizeof(struct colm_struct) : 0;
- return s;
-}
-
-struct colm_struct *colm_list_el_get( struct colm_program *prg,
- ListEl *listEl, Word genId, Word field )
-{
- GenericInfo *genericInfo = &prg->rtd->genericInfo[genId];
- ListEl *result = 0;
- switch ( field ) {
- case 0:
- result = listEl->list_prev;
- break;
- case 1:
- result = listEl->list_next;
- break;
-// case 2:
-// result = listEl->value;
-// treeUpref( result );
-// break;
- default:
- assert( 0 );
- break;
- }
-
- struct colm_struct *s = result != 0 ?
- ((void*)result) - (genericInfo->elOffset * sizeof(Tree*)) -
- sizeof(struct colm_struct) : 0;
- return s;
-}
-
diff --git a/src/struct.h b/src/struct.h
index 9c6bb959..73400d4f 100644
--- a/src/struct.h
+++ b/src/struct.h
@@ -101,29 +101,24 @@ typedef struct colm_map
struct colm_struct *colm_struct_new_size( struct colm_program *prg, int size );
struct colm_struct *colm_struct_new( struct colm_program *prg, int id );
+void colm_struct_add( struct colm_program *prg, struct colm_struct *item );
void colm_struct_delete( struct colm_program *prg, struct colm_tree **sp,
struct colm_struct *el );
struct colm_struct *colm_struct_inbuilt( struct colm_program *prg, int size,
colm_destructor_t destructor );
-#define colm_struct_get_field( obj, field ) \
- ((struct colm_tree**)(((struct colm_struct*)obj)+1))[field]
+#define colm_struct_get_field( obj, type, field ) \
+ (type)(((void**)(((struct colm_struct*)obj)+1))[field])
-#define colm_struct_get_field_type( obj, type, field ) \
- ((type*)(((struct colm_struct*)obj)+1))[field]
-
-#define colm_struct_get_addr( obj, field ) \
- &(((void **)(((struct colm_struct*)obj)+1))[field])
+#define colm_struct_set_field( obj, type, field, val ) \
+ ((type*)(((struct colm_struct*)obj)+1))[field] = val
-#define colm_struct_get_addr_type( obj, type, field ) \
- (type*)(&(((void **)(((struct colm_struct*)obj)+1))[field]))
+#define colm_struct_get_addr( obj, type, field ) \
+ (type)(&(((void **)(((struct colm_struct*)obj)+1))[field]))
-#define colm_struct_set_field( obj, field, val ) \
- ((struct colm_tree**)(((struct colm_struct*)obj)+1))[field] = val
-
-#define colm_struct_set_field_type( obj, type, field, val ) \
- ((type*)(((struct colm_struct*)obj)+1))[field] = val
+#define colm_struct_container( el, field ) \
+ ((void*)el) - (field * sizeof(void*)) - sizeof(struct colm_struct)
Parser *colm_parser_new( struct colm_program *prg, GenericInfo *gi );
Stream *colm_stream_new( struct colm_program *prg );
@@ -139,6 +134,8 @@ long colm_list_length( List *list );
Map *colm_map_new( struct colm_program *prg );
+#define STRUCT_INBUILT_ID -1
+
#if defined(__cplusplus)
}
#endif