summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/declare.cc21
-rw-r--r--src/loadcolm.cc5
-rw-r--r--src/parsetree.h7
-rw-r--r--src/synthesis.cc22
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: