diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/declare.cc | 21 | ||||
-rw-r--r-- | src/loadcolm.cc | 5 | ||||
-rw-r--r-- | src/parsetree.h | 7 | ||||
-rw-r--r-- | src/synthesis.cc | 22 |
4 files changed, 37 insertions, 18 deletions
diff --git a/src/declare.cc b/src/declare.cc index 97bf0009..5e927622 100644 --- a/src/declare.cc +++ b/src/declare.cc @@ -943,24 +943,17 @@ void Compiler::initMapFields( GenericType *gen ) addLengthField( gen->objDef, IN_MAP_LENGTH ); } + void Compiler::initMapElField( GenericType *gen, const char *name, int offset ) { /* Make the type ref and create the field. */ ObjectField *el = ObjectField::cons( internal, - ObjectField::InbuiltOffType, gen->typeArg, name ); - - el->inGetR = IN_GET_MAP_EL_MEM_R; - el->inGetValR = IN_GET_MAP_EL_MEM_R; -// el->inGetWC = IN_GET_LIST2EL_MEM_WC; -// el->inGetWV = IN_GET_LIST2EL_MEM_WV; -// el->inSetWC = IN_SET_LIST2EL_MEM_WC; -// el->inSetWV = IN_SET_LIST2EL_MEM_WV; - - el->useGenericId = true; - el->generic = gen; - - /* Zero for head, One for tail. */ - el->offset = offset; + ObjectField::GenericDependentType, gen->keyTypeArg, name ); + + gen->el->mapKeyField = el; + + /* Offset will be computed when the offset of the owning map element field + * is computed. */ gen->utArg->structEl->structDef->objectDef->rootScope->insertField( el->name, el ); } diff --git a/src/loadcolm.cc b/src/loadcolm.cc index 7ce83b2c..be895249 100644 --- a/src/loadcolm.cc +++ b/src/loadcolm.cc @@ -753,7 +753,7 @@ struct LoadColm TypeRef *elTr = TypeRef::cons( InputLoc(), TypeRef::ListEl, 0, objTr, 0 ); ObjectField *of = ObjectField::cons( InputLoc(), - ObjectField::UserFieldType, elTr, name ); + ObjectField::GenericElementType, elTr, name ); structVarDef( InputLoc(), of ); } @@ -787,9 +787,8 @@ struct LoadColm TypeRef *elTr = TypeRef::cons( InputLoc(), TypeRef::MapEl, 0, objTr, keyTr ); ObjectField *of = ObjectField::cons( InputLoc(), - ObjectField::UserFieldType, elTr, name ); + ObjectField::GenericElementType, elTr, name ); structVarDef( InputLoc(), of ); - } diff --git a/src/parsetree.h b/src/parsetree.h index df53470f..bc3ec2f6 100644 --- a/src/parsetree.h +++ b/src/parsetree.h @@ -2259,7 +2259,9 @@ struct ObjectField RhsNameType, ParamValType, ParamRefType, - LexSubstrType + LexSubstrType, + GenericElementType, + GenericDependentType }; ObjectField() @@ -2274,6 +2276,7 @@ struct ObjectField isExport(false), useGenericId(false), generic(0), + mapKeyField(0), dirtyTree(false), inGetR( IN_HALT ), inGetWC( IN_HALT ), @@ -2348,6 +2351,8 @@ struct ObjectField bool useGenericId; GenericType *generic; + + ObjectField *mapKeyField; /* True if some aspect of the tree has possibly been written to. This does * not include attributes. This is here so we can optimize the storage of diff --git a/src/synthesis.cc b/src/synthesis.cc index f373d137..91856383 100644 --- a/src/synthesis.cc +++ b/src/synthesis.cc @@ -2693,6 +2693,8 @@ void ObjectField::initField() inSetWV = IN_SET_FIELD_WV; break; + case GenericElementType: + case GenericDependentType: case StructFieldType: inGetR = IN_GET_STRUCT_R; inGetWC = IN_GET_STRUCT_WC; @@ -2742,6 +2744,22 @@ void ObjectDef::placeField( Compiler *pd, ObjectField *field ) field->offset = -nextOffset; break; + + case ObjectField::GenericElementType: { + + /* Tree object frame fields. Record the position, then move the + * running offset. */ + field->offset = nextOffset; + nextOffset += sizeOfField( fieldUT ); + + if ( fieldUT->generic->typeId == GEN_MAP_EL ) { + if ( field->mapKeyField != 0 ) + field->mapKeyField->offset = field->offset; + } + + break; + } + case ObjectField::UserFieldType: /* Tree object frame fields. Record the position, then move the @@ -2755,6 +2773,10 @@ void ObjectDef::placeField( Compiler *pd, ObjectField *field ) nextOffset += sizeOfField( fieldUT ); break; + case ObjectField::GenericDependentType: + /* There is an object field that this type depends on. When it is + * placed, this one will be placed as well. Nothing to do now. */ + case ObjectField::InbuiltFieldType: case ObjectField::InbuiltOffType: case ObjectField::InbuiltObjectType: |