summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2015-06-08 10:38:13 -0400
committerAdrian Thurston <thurston@complang.org>2015-06-08 10:38:13 -0400
commitb104d124867e77c8baef7b6fe52dffb4608d94df (patch)
tree029260de7b53691e16c89e1a9f3982ba1ad34456
parent158cd89b0b45b68155dfce173f40a18f64a0b5cc (diff)
downloadcolm-b104d124867e77c8baef7b6fe52dffb4608d94df.tar.gz
some cleanup around the unified list and map generics
-rw-r--r--src/bytecode.h6
-rw-r--r--src/compiler.h22
-rw-r--r--src/declare.cc129
-rw-r--r--src/parsetree.h8
-rw-r--r--src/pdabuild.cc2
-rw-r--r--src/resolve.cc4
-rw-r--r--src/struct.c2
-rw-r--r--src/synthesis.cc57
-rw-r--r--test/list4.lm2
-rw-r--r--test/map6.lm1
10 files changed, 70 insertions, 163 deletions
diff --git a/src/bytecode.h b/src/bytecode.h
index 3cbdc1ec..381a8f80 100644
--- a/src/bytecode.h
+++ b/src/bytecode.h
@@ -425,13 +425,11 @@ typedef unsigned long colm_value_t;
/* Types of Generics. */
enum GEN {
- GEN_LIST = 0x10,
GEN_LIST_EL = 0x11,
- GEN_MAP = 0x12,
GEN_MAP_EL = 0x13,
GEN_PARSER = 0x14,
- GEN_VLIST = 0x15,
- GEN_VMAP = 0x16,
+ GEN_LIST = 0x15,
+ GEN_MAP = 0x16,
};
/* Known language element ids. */
diff --git a/src/compiler.h b/src/compiler.h
index 3ab6fe97..e7cd3fc8 100644
--- a/src/compiler.h
+++ b/src/compiler.h
@@ -753,27 +753,19 @@ struct Compiler
void verifyParseStopGrammar( LangEl *langEl, PdaGraph *pdaGraph );
void computeAdvanceReductions( LangEl *langEl, PdaGraph *pdaGraph );
- void initMapElKey( GenericType *gen, const char *name, int offset );
- void initMapElField( GenericType *gen, const char *name, int offset );
- void initMapField( GenericType *gen, const char *name, int offset );
-
- void initMapFunctions( GenericType *gen );
- void initMapFields( GenericType *gen );
- void initMapElFields( GenericType *gen );
-
- void initListField( GenericType *gen, const char *name, int offset );
void initListElField( GenericType *gen, const char *name, int offset );
+ void initListFieldEl( GenericType *gen, const char *name, int offset );
+ void initListFieldVal( GenericType *gen, const char *name, int offset );
void initListFields( GenericType *gen );
void initListFunctions( GenericType *gen );
- void initListElFields( GenericType *gen );
- void initValueListField( GenericType *gen, const char *name, int offset );
- void initValueListFields( GenericType *gen );
- void initValueListFunctions( GenericType *gen );
+ void initMapElKey( GenericType *gen, const char *name, int offset );
+ void initMapElField( GenericType *gen, const char *name, int offset );
+ void initMapField( GenericType *gen, const char *name, int offset );
- void initValueMapFunctions( GenericType *gen );
- void initValueMapFields( GenericType *gen );
+ void initMapFields( GenericType *gen );
+ void initMapFunctions( GenericType *gen );
void initVectorFunctions( GenericType *gen );
void initParserField( GenericType *gen, const char *name,
diff --git a/src/declare.cc b/src/declare.cc
index 52b8396a..f35544e0 100644
--- a/src/declare.cc
+++ b/src/declare.cc
@@ -361,10 +361,10 @@ void GenericType::declare( Compiler *pd, Namespace *nspace )
{
elUt = elTr->resolveType( pd );
- if ( typeId == GEN_MAP || typeId == GEN_VMAP )
+ if ( typeId == GEN_MAP )
keyUt = keyTr->resolveType( pd );
- if ( typeId == GEN_VMAP || typeId == GEN_VLIST )
+ if ( typeId == GEN_MAP || typeId == GEN_LIST )
valueUt = valueTr->resolveType( pd );
objDef = ObjectDef::cons( ObjectDef::BuiltinType,
@@ -374,22 +374,10 @@ void GenericType::declare( Compiler *pd, Namespace *nspace )
case GEN_MAP:
pd->initMapFunctions( this );
pd->initMapFields( this );
- pd->initMapElFields( this );
- break;
- case GEN_VMAP:
- pd->initValueMapFunctions( this );
- pd->initValueMapFields( this );
- pd->initMapElFields( this );
break;
case GEN_LIST:
pd->initListFunctions( this );
pd->initListFields( this );
- pd->initListElFields( this );
- break;
- case GEN_VLIST:
- pd->initValueListFunctions( this );
- pd->initValueListFields( this );
- pd->initListElFields( this );
break;
case GEN_PARSER:
elUt->langEl->parserId = pd->nextParserId++;
@@ -705,17 +693,7 @@ void Compiler::makeDefaultIterators()
ObjectMethod *objMethod = initFunction( uniqueTypeAny, globalObjectDef,
"list_iter", IN_HALT, IN_HALT, anyRefUT, true );
- IterDef *triter = findIterDef( IterDef::List );
- objMethod->iterDef = triter;
- }
-
- /* Value List iterator. */
- {
- UniqueType *anyRefUT = findUniqueType( TYPE_REF, anyLangEl );
- ObjectMethod *objMethod = initFunction( uniqueTypeAny, globalObjectDef,
- "vlist_iter", IN_HALT, IN_HALT, anyRefUT, true );
-
- IterDef *triter = findIterDef( IterDef::ValueList );
+ IterDef *triter = findIterDef( IterDef::ListEl );
objMethod->iterDef = triter;
}
@@ -723,9 +701,9 @@ void Compiler::makeDefaultIterators()
{
UniqueType *anyRefUT = findUniqueType( TYPE_REF, anyLangEl );
ObjectMethod *objMethod = initFunction( uniqueTypeAny, globalObjectDef,
- "rev_vlist_iter", IN_HALT, IN_HALT, anyRefUT, true );
+ "rev_list_iter", IN_HALT, IN_HALT, anyRefUT, true );
- IterDef *triter = findIterDef( IterDef::RevValueList );
+ IterDef *triter = findIterDef( IterDef::RevListVal );
objMethod->iterDef = triter;
}
@@ -735,7 +713,7 @@ void Compiler::makeDefaultIterators()
ObjectMethod *objMethod = initFunction( uniqueTypeAny, globalObjectDef,
"map_iter", IN_HALT, IN_HALT, anyRefUT, true );
- IterDef *triter = findIterDef( IterDef::Map );
+ IterDef *triter = findIterDef( IterDef::MapEl );
objMethod->iterDef = triter;
}
}
@@ -1111,18 +1089,7 @@ void Compiler::addError()
void Compiler::initMapFunctions( GenericType *gen )
{
- initFunction( gen->elUt, gen->objDef, "find",
- IN_MAP_FIND, IN_MAP_FIND, gen->keyUt, true, true, gen );
-
- initFunction( uniqueTypeInt, gen->objDef, "insert",
- IN_MAP_INSERT_WV, IN_MAP_INSERT_WC, gen->elUt, false, true, gen );
-
- initFunction( gen->elUt, gen->objDef, "detach",
- IN_MAP_DETACH_WV, IN_MAP_DETACH_WC, gen->elUt, false, true, gen );
-}
-
-void Compiler::initValueMapFunctions( GenericType *gen )
-{
+ /* Value functions. */
initFunction( gen->valueUt, gen->objDef, "find",
IN_VMAP_FIND, IN_VMAP_FIND, gen->keyUt, true, true, gen );
@@ -1133,6 +1100,9 @@ void Compiler::initValueMapFunctions( GenericType *gen )
initFunction( gen->elUt, gen->objDef, "remove",
IN_VMAP_REMOVE_WV, IN_VMAP_REMOVE_WC, gen->keyUt, false, true, gen );
+ /*
+ * Element Functions
+ */
initFunction( gen->elUt, gen->objDef, "find_el",
IN_MAP_FIND, IN_MAP_FIND, gen->keyUt, true, true, gen );
@@ -1174,14 +1144,11 @@ void Compiler::initMapFields( GenericType *gen )
initMapField( gen, "head_el", 0 );
initMapField( gen, "tail_el", 1 );
-}
-void Compiler::initValueMapFields( GenericType *gen )
-{
- addLengthField( gen->objDef, IN_MAP_LENGTH );
+ initMapElKey( gen, "key", 0 );
- initMapField( gen, "head_el", 0 );
- initMapField( gen, "tail_el", 1 );
+ initMapElField( gen, "prev", 0 );
+ initMapElField( gen, "next", 1 );
}
void Compiler::initMapElKey( GenericType *gen, const char *name, int offset )
@@ -1220,38 +1187,9 @@ void Compiler::initMapElField( GenericType *gen, const char *name, int offset )
gen->elUt->structEl->structDef->objectDef->rootScope->insertField( el->name, el );
}
-void Compiler::initMapElFields( GenericType *gen )
-{
- initMapElKey( gen, "key", 0 );
-
- initMapElField( gen, "prev", 0 );
- initMapElField( gen, "next", 1 );
-}
-
void Compiler::initListFunctions( GenericType *gen )
{
initFunction( uniqueTypeInt, gen->objDef, "push_head",
- IN_LIST_PUSH_HEAD_WV, IN_LIST_PUSH_HEAD_WC, gen->elUt, false, true, gen );
-
- initFunction( uniqueTypeInt, gen->objDef, "push_tail",
- IN_LIST_PUSH_TAIL_WV, IN_LIST_PUSH_TAIL_WC, gen->elUt, false, true, gen );
-
- initFunction( uniqueTypeInt, gen->objDef, "push",
- IN_LIST_PUSH_HEAD_WV, IN_LIST_PUSH_HEAD_WC, gen->elUt, 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->elUt, gen->objDef, "pop_tail",
- IN_LIST_POP_TAIL_WV, IN_LIST_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 );
-}
-
-void Compiler::initValueListFunctions( GenericType *gen )
-{
- initFunction( uniqueTypeInt, gen->objDef, "push_head",
IN_VLIST_PUSH_HEAD_WV, IN_VLIST_PUSH_HEAD_WC, gen->valueUt, false, true, gen );
initFunction( uniqueTypeInt, gen->objDef, "push_tail",
@@ -1310,15 +1248,7 @@ void Compiler::initListElField( GenericType *gen, const char *name, int offset )
gen->elUt->structEl->structDef->objectDef->rootScope->insertField( el->name, el );
}
-void Compiler::initListElFields( GenericType *gen )
-{
- addLengthField( gen->objDef, IN_LIST_LENGTH );
-
- initListElField( gen, "prev", 0 );
- initListElField( gen, "next", 1 );
-}
-
-void Compiler::initListField( GenericType *gen, const char *name, int offset )
+void Compiler::initListFieldEl( GenericType *gen, const char *name, int offset )
{
/* Make the type ref and create the field. */
ObjectField *el = ObjectField::cons( internal,
@@ -1343,14 +1273,7 @@ void Compiler::initListField( GenericType *gen, const char *name, int offset )
el->offset = offset;
}
-void Compiler::initListFields( GenericType *gen )
-{
- initListField( gen, "head", 0 );
- initListField( gen, "tail", 1 );
- initListField( gen, "top", 0 );
-}
-
-void Compiler::initValueListField( GenericType *gen, const char *name, int offset )
+void Compiler::initListFieldVal( GenericType *gen, const char *name, int offset )
{
/* Make the type ref and create the field. */
ObjectField *el = ObjectField::cons( internal,
@@ -1375,15 +1298,23 @@ void Compiler::initValueListField( GenericType *gen, const char *name, int offse
el->offset = offset;
}
-void Compiler::initValueListFields( GenericType *gen )
+void Compiler::initListFields( GenericType *gen )
{
- initValueListField( gen, "head", 0 );
- initValueListField( gen, "tail", 1 );
- initValueListField( gen, "top", 0 );
+ /* The value fields. */
+ initListFieldVal( gen, "head", 0 );
+ initListFieldVal( gen, "tail", 1 );
+ initListFieldVal( gen, "top", 0 );
+
+ /* The element fields. */
+ initListFieldEl( gen, "head_el", 0 );
+ initListFieldEl( gen, "tail_el", 1 );
+ initListFieldEl( gen, "top_el", 0 );
- initListField( gen, "head_el", 0 );
- initListField( gen, "tail_el", 1 );
- initListField( gen, "top_el", 0 );
+ addLengthField( gen->objDef, IN_LIST_LENGTH );
+
+ /* The fields of the list element. */
+ initListElField( gen, "prev", 0 );
+ initListElField( gen, "next", 1 );
}
void Compiler::initParserFunctions( GenericType *gen )
diff --git a/src/parsetree.h b/src/parsetree.h
index a7751ca0..2d959506 100644
--- a/src/parsetree.h
+++ b/src/parsetree.h
@@ -1745,8 +1745,8 @@ struct Function;
struct IterDef
{
enum Type { Tree, Child, RevChild, Repeat,
- RevRepeat, User, List, ValueList,
- RevValueList, Map };
+ RevRepeat, User, ListEl,
+ RevListVal, MapEl };
IterDef( Type type, Function *func );
IterDef( Type type );
@@ -1759,8 +1759,8 @@ struct IterDef
struct IterImpl
{
enum Type { Tree, Child, RevChild, Repeat,
- RevRepeat, User, List, ValueList,
- RevValueList, Map, ValueMap };
+ RevRepeat, User, ListEl, ListVal,
+ RevListVal, MapEl, MapVal };
IterImpl( Type type, Function *func );
IterImpl( Type type );
diff --git a/src/pdabuild.cc b/src/pdabuild.cc
index f360c3b2..b97b9d11 100644
--- a/src/pdabuild.cc
+++ b/src/pdabuild.cc
@@ -1589,7 +1589,7 @@ void Compiler::makeRuntimeData()
runtimeData->generic_info[gen->id].el_type =
gen->elUt->typeId;
runtimeData->generic_info[gen->id].el_struct_id =
- ( gen->typeId == GEN_VMAP || gen->typeId == GEN_VLIST ) ?
+ ( gen->typeId == GEN_MAP || gen->typeId == GEN_LIST ) ?
gen->elUt->structEl->id : -1;
runtimeData->generic_info[gen->id].el_offset =
gen->el != 0 ? gen->el->offset : -1;
diff --git a/src/resolve.cc b/src/resolve.cc
index 94bc76c3..199b7b36 100644
--- a/src/resolve.cc
+++ b/src/resolve.cc
@@ -148,7 +148,7 @@ UniqueType *TypeRef::resolveTypeList( Compiler *pd )
inMap = new UniqueGeneric( searchKey );
pd->uniqueGenericMap.insert( inMap );
- GenericType *generic = new GenericType( GEN_VLIST,
+ GenericType *generic = new GenericType( GEN_LIST,
pd->nextGenericId++, typeRef1, 0, typeRef2, listEl );
nspace->genericList.append( generic );
@@ -370,7 +370,7 @@ UniqueType *TypeRef::resolveTypeMap( Compiler *pd )
inMap = new UniqueGeneric( searchKey );
pd->uniqueGenericMap.insert( inMap );
- GenericType *generic = new GenericType( GEN_VMAP,
+ GenericType *generic = new GenericType( GEN_MAP,
pd->nextGenericId++, typeRef2, typeRef1, typeRef3, mapEl );
nspace->genericList.append( generic );
diff --git a/src/struct.c b/src/struct.c
index 80ae37bf..5d6ab676 100644
--- a/src/struct.c
+++ b/src/struct.c
@@ -129,7 +129,6 @@ struct_t *colm_construct_generic( program_t *prg, long generic_id )
break;
case GEN_MAP:
- case GEN_VMAP:
{
map_t *map = colm_map_new( prg );
map->generic_info = generic_info;
@@ -137,7 +136,6 @@ struct_t *colm_construct_generic( program_t *prg, long generic_id )
break;
}
case GEN_LIST:
- case GEN_VLIST:
{
list_t *list = colm_list_new( prg );
list->generic_info = generic_info;
diff --git a/src/synthesis.cc b/src/synthesis.cc
index 6bdd3ec4..a491084c 100644
--- a/src/synthesis.cc
+++ b/src/synthesis.cc
@@ -121,7 +121,7 @@ IterImpl::IterImpl( Type type ) :
useSearchUT = true;
break;
- case List:
+ case ListEl:
inCreateWV = IN_GEN_ITER_FROM_REF;
inCreateWC = IN_GEN_ITER_FROM_REF;
inUnwind = IN_GEN_ITER_UNWIND;
@@ -135,7 +135,7 @@ IterImpl::IterImpl( Type type ) :
useGenericId = true;
break;
- case ValueList:
+ case ListVal:
inCreateWV = IN_GEN_ITER_FROM_REF;
inCreateWC = IN_GEN_ITER_FROM_REF;
inUnwind = IN_GEN_ITER_UNWIND;
@@ -149,7 +149,7 @@ IterImpl::IterImpl( Type type ) :
useGenericId = true;
break;
- case RevValueList:
+ case RevListVal:
inCreateWV = IN_GEN_ITER_FROM_REF;
inCreateWC = IN_GEN_ITER_FROM_REF;
inUnwind = IN_GEN_ITER_UNWIND;
@@ -164,7 +164,7 @@ IterImpl::IterImpl( Type type ) :
break;
- case ValueMap:
+ case MapVal:
inCreateWV = IN_GEN_ITER_FROM_REF;
inCreateWC = IN_GEN_ITER_FROM_REF;
inUnwind = IN_GEN_ITER_UNWIND;
@@ -178,7 +178,7 @@ IterImpl::IterImpl( Type type ) :
useGenericId = true;
break;
- case Map:
+ case MapEl:
inCreateWV = IN_GEN_ITER_FROM_REF;
inCreateWC = IN_GEN_ITER_FROM_REF;
inUnwind = IN_GEN_ITER_UNWIND;
@@ -320,10 +320,9 @@ long sizeOfField( UniqueType *fieldUT )
size = sizeof(rev_tree_iter_t) / sizeof(word_t);
break;
- case IterDef::Map:
- case IterDef::List:
- case IterDef::ValueList:
- case IterDef::RevValueList:
+ case IterDef::MapEl:
+ case IterDef::ListEl:
+ case IterDef::RevListVal:
size = sizeof(generic_iter_t) / sizeof(word_t);
break;
@@ -838,24 +837,18 @@ IterImpl *LangVarRef::chooseTriterCall( Compiler *pd,
CallArgVect::Iter pe = *args;
UniqueType *exprUT = (*pe)->expr->evaluate( pd, unused );
- if ( exprUT->typeId == TYPE_GENERIC && exprUT->generic->typeId == GEN_LIST )
- iterImpl = new IterImpl( IterImpl::List );
-
- if ( exprUT->typeId == TYPE_GENERIC && exprUT->generic->typeId == GEN_VLIST ) {
+ if ( exprUT->typeId == TYPE_GENERIC && exprUT->generic->typeId == GEN_LIST ) {
if ( searchUT->structEl != 0 && searchUT->structEl->listEl )
- iterImpl = new IterImpl( IterImpl::List );
+ iterImpl = new IterImpl( IterImpl::ListEl );
else
- iterImpl = new IterImpl( IterImpl::ValueList );
+ iterImpl = new IterImpl( IterImpl::ListVal );
}
- if ( exprUT->typeId == TYPE_GENERIC && exprUT->generic->typeId == GEN_MAP )
- iterImpl = new IterImpl( IterImpl::Map );
-
- if ( exprUT->typeId == TYPE_GENERIC && exprUT->generic->typeId == GEN_VMAP ) {
+ if ( exprUT->typeId == TYPE_GENERIC && exprUT->generic->typeId == GEN_MAP ) {
if ( searchUT->structEl != 0 && searchUT->structEl->mapEl )
- iterImpl = new IterImpl( IterImpl::Map );
+ iterImpl = new IterImpl( IterImpl::MapEl );
else
- iterImpl = new IterImpl( IterImpl::ValueMap );
+ iterImpl = new IterImpl( IterImpl::MapVal );
}
}
@@ -2319,17 +2312,14 @@ void LangStmt::compileForIter( Compiler *pd, CodeVect &code ) const
case IterDef::User:
iterImpl = new IterImpl( IterImpl::User, iterUT->iterDef->func );
break;
- case IterDef::List:
- iterImpl = new IterImpl( IterImpl::List );
- break;
- case IterDef::ValueList:
- iterImpl = new IterImpl( IterImpl::ValueList );
+ case IterDef::ListEl:
+ iterImpl = new IterImpl( IterImpl::ListEl );
break;
- case IterDef::RevValueList:
- iterImpl = new IterImpl( IterImpl::RevValueList );
+ case IterDef::RevListVal:
+ iterImpl = new IterImpl( IterImpl::RevListVal );
break;
- case IterDef::Map:
- iterImpl = new IterImpl( IterImpl::Map );
+ case IterDef::MapEl:
+ iterImpl = new IterImpl( IterImpl::MapEl );
break;
}
@@ -2643,10 +2633,9 @@ void Compiler::findLocals( ObjectDef *localFrame, CodeBlock *block )
type = LT_Iter;
break;
- case IterDef::Map:
- case IterDef::List:
- case IterDef::ValueList:
- case IterDef::RevValueList:
+ case IterDef::MapEl:
+ case IterDef::ListEl:
+ case IterDef::RevListVal:
/* ? */
type = LT_Iter;
break;
diff --git a/test/list4.lm b/test/list4.lm
index 64eff726..76a79535 100644
--- a/test/list4.lm
+++ b/test/list4.lm
@@ -14,7 +14,7 @@ L->push_head( "..." )
L->pop_tail()
L->pop_head()
-for S: str in rev_vlist_iter(L) {
+for S: str in rev_list_iter(L) {
print "[S]
}
diff --git a/test/map6.lm b/test/map6.lm
index 97f0c223..7261256e 100644
--- a/test/map6.lm
+++ b/test/map6.lm
@@ -15,7 +15,6 @@ for A: str in argv {
M->insert_el( El )
}
-
for El: map_el<str, str> in M {
print "[El->key] [El->value]
}