diff options
author | Adrian Thurston <thurston@complang.org> | 2015-02-14 12:39:47 -0500 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2015-02-14 12:39:47 -0500 |
commit | f0089542330fa9ff580faf2e69f18bd6f7367e50 (patch) | |
tree | f5c70455c236ae7049a743f7cd61cbf1e8ef6663 | |
parent | e730b33092cb1e2ce3e8bf8d54133d6e2b92a643 (diff) | |
download | colm-f0089542330fa9ff580faf2e69f18bd6f7367e50.tar.gz |
implementing vlist functions
-rw-r--r-- | src/bytecode.c | 58 | ||||
-rw-r--r-- | src/bytecode.h | 12 | ||||
-rw-r--r-- | src/declare.cc | 20 | ||||
-rw-r--r-- | src/list.c | 59 | ||||
-rw-r--r-- | src/loadcolm.cc | 4 | ||||
-rw-r--r-- | src/pdabuild.cc | 26 | ||||
-rw-r--r-- | src/pdacodegen.cc | 11 | ||||
-rw-r--r-- | src/resolve.cc | 2 | ||||
-rw-r--r-- | src/tree.h | 15 |
9 files changed, 174 insertions, 33 deletions
diff --git a/src/bytecode.c b/src/bytecode.c index 6b7c9353..3c33edb3 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -3926,6 +3926,64 @@ again: vm_push( result ); break; } + case IN_VLIST_PUSH_TAIL_WC: { + short genId; + read_half( genId ); + + debug( prg, REALM_BYTECODE, "IN_VLIST_PUSH_TAIL_WC %hd\n", genId ); + + List *list = vm_pop_list(); + Struct *value = vm_pop_struct(); + + colm_vlist_append( prg, list, value ); + + //treeUpref( prg->trueVal ); + vm_push( prg->trueVal ); + break; + } + case IN_VLIST_PUSH_HEAD_WC: { + short genId; + read_half( genId ); + + debug( prg, REALM_BYTECODE, "IN_VLIST_PUSH_HEAD_WC %hd\n", genId ); + + List *list = vm_pop_list(); + Struct *value = vm_pop_struct(); + + colm_vlist_prepend( prg, list, value ); + + //treeUpref( prg->trueVal ); + vm_push( prg->trueVal ); + break; + } + case IN_VLIST_POP_HEAD_WC: { + short genId; + read_half( genId ); + + debug( prg, REALM_BYTECODE, "IN_VLIST_POP_HEAD_WC %hd\n", genId ); + + List *list = vm_pop_list(); + + Tree *result = colm_vlist_detach_head( prg, list ); + + //treeUpref( prg->trueVal ); + vm_push( result ); + break; + } + case IN_VLIST_POP_TAIL_WC: { + short genId; + read_half( genId ); + + debug( prg, REALM_BYTECODE, "IN_VLIST_POP_TAIL_WC %hd\n", genId ); + + List *list = vm_pop_list(); + + Tree *result = colm_vlist_detach_tail( prg, list ); + + //treeUpref( prg->trueVal ); + vm_push( result ); + break; + } default: { fatal( "UNKNOWN FUNCTION: 0x%2x -- something is wrong\n", c ); break; diff --git a/src/bytecode.h b/src/bytecode.h index c551f1e4..e891c3ab 100644 --- a/src/bytecode.h +++ b/src/bytecode.h @@ -391,6 +391,18 @@ typedef unsigned long colm_value_t; #define IN_VMAP_REMOVE_WC 0x27 #define IN_VMAP_REMOVE_WV 0x28 +#define IN_VLIST_PUSH_TAIL_WV 0x2a +#define IN_VLIST_PUSH_TAIL_WC 0x2b +#define IN_VLIST_PUSH_TAIL_BKT 0x2c +#define IN_VLIST_POP_TAIL_WV 0x2d +#define IN_VLIST_POP_TAIL_WC 0x2e +#define IN_VLIST_POP_TAIL_BKT 0x2f +#define IN_VLIST_PUSH_HEAD_WV 0x30 +#define IN_VLIST_PUSH_HEAD_WC 0x31 +#define IN_VLIST_PUSH_HEAD_BKT 0x32 +#define IN_VLIST_POP_HEAD_WV 0x33 +#define IN_VLIST_POP_HEAD_WC 0x34 +#define IN_VLIST_POP_HEAD_BKT 0x35 enum TYPE { diff --git a/src/declare.cc b/src/declare.cc index 9534feb5..edb2fab7 100644 --- a/src/declare.cc +++ b/src/declare.cc @@ -359,7 +359,7 @@ void GenericType::declare( Compiler *pd, Namespace *nspace ) if ( typeId == GEN_MAP || typeId == GEN_VMAP ) keyUt = keyTr->resolveType( pd ); - if ( typeId == GEN_VMAP ) + if ( typeId == GEN_VMAP || typeId == GEN_VLIST ) valueUt = valueTr->resolveType( pd ); objDef = ObjectDef::cons( ObjectDef::BuiltinType, @@ -1169,22 +1169,22 @@ void Compiler::initListFunctions( GenericType *gen ) void Compiler::initValueListFunctions( GenericType *gen ) { initFunction( uniqueTypeInt, gen->objDef, "push_head", - IN_LIST_PUSH_HEAD_WV, IN_LIST_PUSH_HEAD_WC, gen->elUt, false, true, gen ); + IN_VLIST_PUSH_HEAD_WV, IN_VLIST_PUSH_HEAD_WC, gen->valueUt, false, true, gen ); initFunction( uniqueTypeInt, gen->objDef, "push_tail", - IN_LIST_PUSH_TAIL_WV, IN_LIST_PUSH_TAIL_WC, gen->elUt, false, true, gen ); + IN_VLIST_PUSH_TAIL_WV, IN_VLIST_PUSH_TAIL_WC, gen->valueUt, false, true, gen ); initFunction( uniqueTypeInt, gen->objDef, "push", - IN_LIST_PUSH_HEAD_WV, IN_LIST_PUSH_HEAD_WC, gen->elUt, false, true, gen ); + IN_VLIST_PUSH_HEAD_WV, IN_VLIST_PUSH_HEAD_WC, gen->valueUt, false, true, gen ); - initFunction( gen->elUt, gen->objDef, "pop_head", - IN_LIST_POP_HEAD_WV, IN_LIST_POP_HEAD_WC, false, true, gen ); + initFunction( gen->valueUt, gen->objDef, "pop_head", + IN_VLIST_POP_HEAD_WV, IN_VLIST_POP_HEAD_WC, false, true, gen ); - initFunction( gen->elUt, gen->objDef, "pop_tail", - IN_LIST_POP_TAIL_WV, IN_LIST_POP_TAIL_WC, false, true, gen ); + initFunction( gen->valueUt, gen->objDef, "pop_tail", + IN_VLIST_POP_TAIL_WV, IN_VLIST_POP_TAIL_WC, false, true, gen ); - initFunction( gen->elUt, gen->objDef, "pop", - IN_LIST_POP_HEAD_WV, IN_LIST_POP_HEAD_WC, false, true, gen ); + initFunction( gen->valueUt, gen->objDef, "pop", + IN_VLIST_POP_HEAD_WV, IN_VLIST_POP_HEAD_WC, false, true, gen ); } void Compiler::initListElField( GenericType *gen, const char *name, int offset ) @@ -22,12 +22,70 @@ #include <colm/pdarun.h> #include <colm/program.h> #include <colm/struct.h> +#include <colm/bytecode.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); +void colm_list_prepend( List *list, ListEl *newEl ); +void colm_list_append( List *list, ListEl *newEl ); +ListEl *colm_list_detach( List *list, ListEl *el ); + +void colm_vlist_append( struct colm_program *prg, List *list, Tree *value ) +{ + struct colm_struct *s = colm_struct_new( prg, list->genericInfo->elStructId ); + + colm_struct_set_field( s, Tree*, 0, value ); + + ListEl *listEl = colm_struct_get_addr( s, ListEl*, list->genericInfo->elOffset ); + + colm_list_append( list, listEl ); +} + +void colm_vlist_prepend( struct colm_program *prg, List *list, Tree *value ) +{ + struct colm_struct *s = colm_struct_new( prg, list->genericInfo->elStructId ); + + colm_struct_set_field( s, Tree*, 0, value ); + + ListEl *listEl = colm_struct_get_addr( s, ListEl*, list->genericInfo->elOffset ); + + colm_list_prepend( list, listEl ); +} + +Tree *colm_vlist_detach_tail( struct colm_program *prg, List *list ) +{ + ListEl *listEl = list->tail; + colm_list_detach( list, listEl ); + + struct colm_struct *s = colm_generic_el_container( prg, listEl, + (list->genericInfo - prg->rtd->genericInfo) ); + + Tree *val = colm_struct_get_field( s, Tree*, 0 ); + + if ( list->genericInfo->valueType == TYPE_TREE ) + treeUpref( val ); + + return val; +} + +Tree *colm_vlist_detach_head( struct colm_program *prg, List *list ) +{ + ListEl *listEl = list->head; + colm_list_detach( list, listEl ); + + struct colm_struct *s = colm_generic_el_container( prg, listEl, + (list->genericInfo - prg->rtd->genericInfo) ); + + Tree *val = colm_struct_get_field( s, Tree*, 0 ); + + if ( list->genericInfo->valueType == TYPE_TREE ) + treeUpref( val ); + + return val; +} void colm_list_prepend( List *list, ListEl *newEl ) { @@ -39,7 +97,6 @@ void colm_list_append( List *list, ListEl *newEl ) colm_list_add_after( list, list->tail, newEl ); } -ListEl *colm_list_detach( List *list, ListEl *el ); ListEl *colm_list_detach_head( List *list ) { diff --git a/src/loadcolm.cc b/src/loadcolm.cc index 3c54fbc7..a32d4cef 100644 --- a/src/loadcolm.cc +++ b/src/loadcolm.cc @@ -848,9 +848,9 @@ struct LoadColm structStack.pop(); namespaceStack.pop(); - TypeRef *type = TypeRef::cons( internal, + TypeRef *elType = TypeRef::cons( internal, emptyNspaceQual(), "vlist_el" ); - return TypeRef::cons( typeRef.loc(), TypeRef::ValueList, 0, type, 0 ); + return TypeRef::cons( typeRef.loc(), TypeRef::ValueList, 0, elType, valType ); } TypeRef *walkValueMap( type_ref typeRef ) diff --git a/src/pdabuild.cc b/src/pdabuild.cc index c8a55dc7..62c66e35 100644 --- a/src/pdabuild.cc +++ b/src/pdabuild.cc @@ -1573,19 +1573,25 @@ void Compiler::makeRuntimeData() for ( NamespaceList::Iter nspace = namespaceList; nspace.lte(); nspace++ ) { for ( GenericList::Iter gen = nspace->genericList; gen.lte(); gen++ ) { runtimeData->genericInfo[gen->id].type = gen->typeId; - runtimeData->genericInfo[gen->id].typeArg = gen->elUt->typeId; - runtimeData->genericInfo[gen->id].keyType = gen->keyUt != 0 ? - gen->keyUt->typeId : 0; - runtimeData->genericInfo[gen->id].keyOffset = 0; - runtimeData->genericInfo[gen->id].parserId = - gen->typeId == GEN_PARSER ? gen->elUt->langEl->parserId : -1; + + runtimeData->genericInfo[gen->id].elType = + gen->elUt->typeId; + runtimeData->genericInfo[gen->id].elStructId = + ( gen->typeId == GEN_VMAP || gen->typeId == GEN_VLIST ) ? + gen->elUt->structEl->id : -1; runtimeData->genericInfo[gen->id].elOffset = gen->el != 0 ? gen->el->offset : -1; - runtimeData->genericInfo[gen->id].elStructId = - gen->typeId == GEN_VMAP ? gen->elUt->structEl->id : -1; - runtimeData->genericInfo[gen->id].valueType = gen->valueUt != 0 ? - gen->valueUt->typeId : 0; + + runtimeData->genericInfo[gen->id].keyType = + gen->keyUt != 0 ? gen->keyUt->typeId : 0; + runtimeData->genericInfo[gen->id].keyOffset = 0; + + runtimeData->genericInfo[gen->id].valueType = + gen->valueUt != 0 ? gen->valueUt->typeId : 0; runtimeData->genericInfo[gen->id].valueOffset = 0; + + runtimeData->genericInfo[gen->id].parserId = + gen->typeId == GEN_PARSER ? gen->elUt->langEl->parserId : -1; } } diff --git a/src/pdacodegen.cc b/src/pdacodegen.cc index 5e37cfae..0b297033 100644 --- a/src/pdacodegen.cc +++ b/src/pdacodegen.cc @@ -384,14 +384,15 @@ void PdaCodeGen::writeRuntimeData( RuntimeData *runtimeData, PdaTables *pdaTable for ( int i = 0; i < runtimeData->numGenerics; i++ ) { out << "\t{ " << runtimeData->genericInfo[i].type << ", " << - runtimeData->genericInfo[i].typeArg << ", " << + runtimeData->genericInfo[i].elType << ", " << + runtimeData->genericInfo[i].elStructId << ", " << + runtimeData->genericInfo[i].elOffset << ", " << runtimeData->genericInfo[i].keyType << ", " << runtimeData->genericInfo[i].keyOffset << ", " << - runtimeData->genericInfo[i].parserId << ", " << - runtimeData->genericInfo[i].elOffset << ", " << - runtimeData->genericInfo[i].elStructId << ", " << runtimeData->genericInfo[i].valueType << ", " << - runtimeData->genericInfo[i].valueOffset << " },\n"; + runtimeData->genericInfo[i].valueOffset << ", " << + runtimeData->genericInfo[i].parserId; + out << " },\n"; } out << "};\n\n"; diff --git a/src/resolve.cc b/src/resolve.cc index 9b723d39..268f9fd0 100644 --- a/src/resolve.cc +++ b/src/resolve.cc @@ -295,7 +295,7 @@ UniqueType *TypeRef::resolveTypeValueList( Compiler *pd ) pd->uniqueGenericMap.insert( inMap ); GenericType *generic = new GenericType( GEN_VLIST, - pd->nextGenericId++, typeRef1, 0, 0, listEl ); + pd->nextGenericId++, typeRef1, 0, typeRef2, listEl ); nspace->genericList.append( generic ); @@ -140,15 +140,18 @@ typedef struct _Str typedef struct _GenericInfo { long type; - long typeArg; + + long elType; + long elStructId; + long elOffset; + long keyType; long keyOffset; - long parserId; - long elOffset; - long elStructId; long valueType; long valueOffset; + + long parserId; } GenericInfo; enum IterType @@ -351,6 +354,10 @@ void colm_list_iter_destroy( struct colm_program *prg, Tree ***psp, ListIter *it Tree *colm_list_iter_advance( struct colm_program *prg, Tree ***psp, ListIter *iter ); Tree *colm_list_iter_deref_cur( struct colm_program *prg, ListIter *iter ); +void colm_vlist_append( struct colm_program *prg, List *list, Tree *tree ); +void colm_vlist_prepend( struct colm_program *prg, List *list, Tree *value ); +Tree *colm_vlist_detach_tail( struct colm_program *prg, List *list ); + #if defined(__cplusplus) } #endif |