From 94798b8c5670f226c18db6e24cfceb3ef4da3540 Mon Sep 17 00:00:00 2001 From: Adrian Thurston Date: Mon, 5 Jan 2015 22:19:53 -0500 Subject: some improvements to the struct macros, and code movement --- src/bytecode.c | 71 +++++++++++++++++++++++++------------------------- src/list.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++ src/struct.c | 81 +++------------------------------------------------------- src/struct.h | 25 ++++++++---------- 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 +#include #include +#include +#include +#include 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 #include -#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 -- cgit v1.2.1