diff options
author | Adrian Thurston <thurston@complang.org> | 2015-06-08 10:38:13 -0400 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2015-06-08 10:38:13 -0400 |
commit | b104d124867e77c8baef7b6fe52dffb4608d94df (patch) | |
tree | 029260de7b53691e16c89e1a9f3982ba1ad34456 | |
parent | 158cd89b0b45b68155dfce173f40a18f64a0b5cc (diff) | |
download | colm-b104d124867e77c8baef7b6fe52dffb4608d94df.tar.gz |
some cleanup around the unified list and map generics
-rw-r--r-- | src/bytecode.h | 6 | ||||
-rw-r--r-- | src/compiler.h | 22 | ||||
-rw-r--r-- | src/declare.cc | 129 | ||||
-rw-r--r-- | src/parsetree.h | 8 | ||||
-rw-r--r-- | src/pdabuild.cc | 2 | ||||
-rw-r--r-- | src/resolve.cc | 4 | ||||
-rw-r--r-- | src/struct.c | 2 | ||||
-rw-r--r-- | src/synthesis.cc | 57 | ||||
-rw-r--r-- | test/list4.lm | 2 | ||||
-rw-r--r-- | test/map6.lm | 1 |
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] } |