diff options
-rw-r--r-- | src/list.c | 1 | ||||
-rw-r--r-- | src/map.h | 26 | ||||
-rw-r--r-- | src/program.c | 15 | ||||
-rw-r--r-- | src/struct.c | 50 | ||||
-rw-r--r-- | src/struct.h | 47 | ||||
-rw-r--r-- | src/tree.c | 60 | ||||
-rw-r--r-- | src/tree.h | 15 |
7 files changed, 105 insertions, 109 deletions
@@ -3,6 +3,7 @@ */ #include <colm/pdarun.h> +#include <colm/struct.h> void listAddAfter( List *list, ListEl *prev_el, ListEl *new_el ) { @@ -10,32 +10,8 @@ extern "C" { #endif #include <colm/program.h> +#include <colm/struct.h> -typedef struct _MapEl -{ - /* Must overlay Kid. */ - Tree *tree; - struct _MapEl *next; - struct _MapEl *prev; - - struct _MapEl *left, *right, *parent; - long height; - Tree *key; -} MapEl; - -typedef struct _Map -{ - /* Must overlay Tree. */ - short id; - unsigned short flags; - long refs; - MapEl *head; - - MapEl *tail; - MapEl *root; - long treeSize; - GenericInfo *genericInfo; -} Map; void mapListAbandon( Map *map ); diff --git a/src/program.c b/src/program.c index 4824fa55..d3044faa 100644 --- a/src/program.c +++ b/src/program.c @@ -159,8 +159,6 @@ Program *colm_new_program( RuntimeData *rtd ) assert( sizeof(Int) <= sizeof(Tree) ); assert( sizeof(Str) <= sizeof(Tree) ); assert( sizeof(Pointer) <= sizeof(Tree) ); - assert( sizeof(Map) <= sizeof(MapEl) ); - assert( sizeof(List) <= sizeof(MapEl) ); prg->rtd = rtd; prg->ctxDepParsing = 1; @@ -264,18 +262,6 @@ Tree *colm_run_func( struct colm_program *prg, int frameId, return prg->returnVal; }; -static void colm_clear_orig_heap( Program *prg, Tree **sp ) -{ - /* Clear the heap. */ - Kid *a = prg->origHeap; - while ( a != 0 ) { - Kid *next = a->next; - objectDownref( prg, sp, a->tree ); - kidFree( prg, a ); - a = next; - } -} - static void colm_clear_heap( Program *prg, Tree **sp ) { struct colm_struct *hi = prg->heap.head; @@ -292,7 +278,6 @@ int colm_delete_program( Program *prg ) int exitStatus = prg->exitStatus; treeDownref( prg, sp, prg->returnVal ); - colm_clear_orig_heap( prg, sp ); colm_clear_heap( prg, sp ); treeDownref( prg, sp, prg->trueVal ); diff --git a/src/struct.c b/src/struct.c index 2682f9dd..3386db14 100644 --- a/src/struct.c +++ b/src/struct.c @@ -88,7 +88,7 @@ Parser *colm_parser_new( Program *prg, GenericInfo *gi ) colm_struct_add( prg, (struct colm_struct*) parser ); parser->id = STRUCT_INBUILT_ID; - parser->destructor = colm_parser_destroy; + parser->destructor = &colm_parser_destroy; parser->pdaRun = pdaRun; return parser; @@ -103,3 +103,51 @@ Stream *colm_stream_new2( Program *prg ) stream->id = STRUCT_INBUILT_ID; 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->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 ) +{ + struct colm_map *map = (struct colm_map*) s; + + MapEl *el = map->head; + while ( el != 0 ) { + MapEl *next = el->next; + treeDownref( prg, sp, el->key ); + treeDownref( prg, sp, el->tree ); + mapElFree( prg, el ); + el = next; + } +} + +Map *colm_map_new( struct colm_program *prg ) +{ + size_t memsize = sizeof(struct colm_map); + struct colm_map *map = (struct colm_map*) malloc( memsize ); + memset( map, 0, memsize ); + colm_struct_add( prg, (struct colm_struct *)map ); + map->id = STRUCT_INBUILT_ID; + return map; +} diff --git a/src/struct.h b/src/struct.h index 1034a007..c6f6d0b1 100644 --- a/src/struct.h +++ b/src/struct.h @@ -5,6 +5,7 @@ extern "C" { #endif + typedef struct _StreamImpl StreamImpl; typedef void (*colm_destructor_t)( struct colm_program *prg, @@ -51,14 +52,54 @@ typedef struct colm_stream StreamImpl *impl; } Stream; +/* Must overlay colm_inbuilt. */ +typedef struct colm_list +{ + short id; + struct colm_struct *prev, *next; + colm_destructor_t destructor; + + void *buffer[8]; + + ListEl *head, *tail; + long listLen; + GenericInfo *genericInfo; +} List; + +typedef struct _MapEl +{ + /* Must overlay Kid. */ + Tree *tree; + struct _MapEl *next; + struct _MapEl *prev; + + struct _MapEl *left, *right, *parent; + long height; + Tree *key; +} MapEl; + +typedef struct colm_map +{ + short id; + struct colm_struct *prev, *next; + colm_destructor_t destructor; + + void *buffer[8]; + + MapEl *head; + MapEl *tail; + MapEl *root; + long treeSize; + GenericInfo *genericInfo; +} Map; + struct colm_struct *colm_struct_new( struct colm_program *prg, int id ); void colm_struct_delete( struct colm_program *prg, struct colm_tree **sp, struct colm_struct *el ); -struct colm_struct *colm_struct_inbuilt( Program *prg, int size, +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] @@ -75,6 +116,8 @@ struct colm_struct *colm_struct_inbuilt( Program *prg, int size, Parser *colm_parser_new( struct colm_program *prg, GenericInfo *gi ); Stream *colm_stream_new( struct colm_program *prg ); Stream *colm_stream_new2( struct colm_program *prg ); +List *colm_list_new( struct colm_program *prg ); +Map *colm_map_new( struct colm_program *prg ); #if defined(__cplusplus) } @@ -955,15 +955,13 @@ Tree *constructGeneric( Program *prg, long genericId ) Tree *newGeneric = 0; switch ( genericInfo->type ) { case GEN_MAP: { - Map *map = (Map*)mapElAllocate( prg ); - map->id = genericInfo->langElId; + Map *map = colm_map_new( prg ); map->genericInfo = genericInfo; newGeneric = (Tree*) map; break; } case GEN_LIST: { - List *list = (List*)mapElAllocate( prg ); - list->id = genericInfo->langElId; + List *list = colm_list_new( prg ); list->genericInfo = genericInfo; newGeneric = (Tree*) list; break; @@ -994,7 +992,6 @@ Tree *constructGeneric( Program *prg, long genericId ) return 0; } - treeUpref( newGeneric ); return newGeneric; } @@ -1083,54 +1080,16 @@ free_tree: if ( genericId > 0 ) { GenericInfo *generic = &prg->rtd->genericInfo[genericId]; switch ( generic->type ) { - case GEN_LIST: { - List *list = (List*) tree; - ListEl *el = list->head; - while ( el != 0 ) { - ListEl *next = el->next; - vm_push( el->value ); - listElFree( prg, el ); - el = next; - } - mapElFree( prg, (MapEl*)list ); + case GEN_LIST: break; - } - case GEN_MAP: { - Map *map = (Map*)tree; - MapEl *el = map->head; - while ( el != 0 ) { - MapEl *next = el->next; - vm_push( el->key ); - vm_push( el->tree ); - mapElFree( prg, el ); - el = next; - } - mapElFree( prg, (MapEl*)map ); + case GEN_MAP: break; - } -// case GEN_PARSER: { -// Parser *parser = (Parser*)tree; -// clearPdaRun( prg, sp, parser->pdaRun ); -// free( parser->pdaRun ); -// treeDownref( prg, sp, (Tree*)parser->input ); -// mapElFree( prg, (MapEl*)parser ); -// break; -// } - case GEN_LIST2EL: { + case GEN_PARSER: break; - } - case GEN_LIST2: { - List *list = (List*) tree; -// ListEl *el = list->head; -// while ( el != 0 ) { -// ListEl *next = el->next; -// vm_push( el->value ); -// listElFree( prg, el ); -// el = next; -// } - mapElFree( prg, (MapEl*)list ); + case GEN_LIST2EL: + break; + case GEN_LIST2: break; - } case GEN_MAP2EL: case GEN_MAP2: break; @@ -1555,7 +1514,6 @@ void splitRef( Program *prg, Tree ***psp, Ref *fromRef ) Tree *setListMem( List *list, Half field, Tree *value ) { - assert( list->refs == 1 ); if ( value != 0 ) assert( value->refs >= 1 ); @@ -1619,7 +1577,6 @@ long mapLength( Map *map ) void listPushTail( Program *prg, List *list, Tree *val ) { - assert( list->refs == 1 ); if ( val != 0 ) assert( val->refs >= 1 ); ListEl *listEl = listElAllocate( prg ); @@ -1672,7 +1629,6 @@ void list2PushTail( Program *prg, Tree **sp, List *list, Tree *val ) void listPushHead( Program *prg, List *list, Tree *val ) { - assert( list->refs == 1 ); if ( val != 0 ) assert( val->refs >= 1 ); ListEl *listEl = listElAllocate( prg ); @@ -20,6 +20,7 @@ struct _FunctionInfo; typedef struct colm_stream Stream; typedef struct colm_parser Parser; +typedef struct colm_list List; typedef struct colm_location { @@ -137,20 +138,6 @@ typedef struct _GenericInfo long elOffset; } GenericInfo; -typedef struct _List -{ - /* Must overlay Tree. */ - short id; - unsigned short flags; - long refs; - ListEl *head; - - ListEl *tail; - long listLen; - GenericInfo *genericInfo; - -} List; - enum IterType { IT_Tree = 1, |