summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/list.c1
-rw-r--r--src/map.h26
-rw-r--r--src/program.c15
-rw-r--r--src/struct.c50
-rw-r--r--src/struct.h47
-rw-r--r--src/tree.c60
-rw-r--r--src/tree.h15
7 files changed, 105 insertions, 109 deletions
diff --git a/src/list.c b/src/list.c
index a011ae5e..07341c57 100644
--- a/src/list.c
+++ b/src/list.c
@@ -3,6 +3,7 @@
*/
#include <colm/pdarun.h>
+#include <colm/struct.h>
void listAddAfter( List *list, ListEl *prev_el, ListEl *new_el )
{
diff --git a/src/map.h b/src/map.h
index c881ab3f..1cbc2d74 100644
--- a/src/map.h
+++ b/src/map.h
@@ -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)
}
diff --git a/src/tree.c b/src/tree.c
index a741ef39..256b16ed 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -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 );
diff --git a/src/tree.h b/src/tree.h
index e6df8f7b..a8a8da40 100644
--- a/src/tree.h
+++ b/src/tree.h
@@ -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,