summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2015-02-14 12:39:47 -0500
committerAdrian Thurston <thurston@complang.org>2015-02-14 12:39:47 -0500
commitf0089542330fa9ff580faf2e69f18bd6f7367e50 (patch)
treef5c70455c236ae7049a743f7cd61cbf1e8ef6663 /src
parente730b33092cb1e2ce3e8bf8d54133d6e2b92a643 (diff)
downloadcolm-f0089542330fa9ff580faf2e69f18bd6f7367e50.tar.gz
implementing vlist functions
Diffstat (limited to 'src')
-rw-r--r--src/bytecode.c58
-rw-r--r--src/bytecode.h12
-rw-r--r--src/declare.cc20
-rw-r--r--src/list.c59
-rw-r--r--src/loadcolm.cc4
-rw-r--r--src/pdabuild.cc26
-rw-r--r--src/pdacodegen.cc11
-rw-r--r--src/resolve.cc2
-rw-r--r--src/tree.h15
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 )
diff --git a/src/list.c b/src/list.c
index ecdde3f5..4c96ddcc 100644
--- a/src/list.c
+++ b/src/list.c
@@ -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 );
diff --git a/src/tree.h b/src/tree.h
index 6c1533fd..8395432c 100644
--- a/src/tree.h
+++ b/src/tree.h
@@ -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