summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/loadinit.cc4
-rw-r--r--src/parsetree.h14
-rw-r--r--src/pdabuild.cc21
-rw-r--r--src/synthesis.cc16
4 files changed, 36 insertions, 19 deletions
diff --git a/src/loadinit.cc b/src/loadinit.cc
index e38621fa..aba62146 100644
--- a/src/loadinit.cc
+++ b/src/loadinit.cc
@@ -314,7 +314,7 @@ void LoadInit::consExportTree( StmtList *stmtList )
NamespaceQual *nspaceQual = NamespaceQual::cons( curNspace() );
TypeRef *typeRef = TypeRef::cons( internal, nspaceQual, String("start"), RepeatNone );
ObjectField *program = ObjectField::cons( internal,
- ObjectField::UserFieldType, typeRef, String("ColmTree") );
+ ObjectField::StructFieldType, typeRef, String("ColmTree") );
LangStmt *programExport = exportStmt( program, LangStmt::AssignType, expr );
stmtList->append( programExport );
}
@@ -330,7 +330,7 @@ void LoadInit::consExportError( StmtList *stmtList )
NamespaceQual *nspaceQual = NamespaceQual::cons( curNspace() );
TypeRef *typeRef = TypeRef::cons( internal, nspaceQual, String("str"), RepeatNone );
ObjectField *program = ObjectField::cons( internal,
- ObjectField::UserFieldType, typeRef, String("ColmError") );
+ ObjectField::StructFieldType, typeRef, String("ColmError") );
LangStmt *programExport = exportStmt( program, LangStmt::AssignType, expr );
stmtList->append( programExport );
}
diff --git a/src/parsetree.h b/src/parsetree.h
index 9ed57523..084e596c 100644
--- a/src/parsetree.h
+++ b/src/parsetree.h
@@ -2468,6 +2468,20 @@ struct ObjectField
bool isInbuiltObject()
{ return type == InbuiltObjectType; }
+
+ bool exists()
+ {
+ switch ( type ) {
+ case ObjectField::LhsElType:
+ case ObjectField::UserLocalType:
+ case ObjectField::RedRhsType:
+ case ObjectField::UserFieldType:
+ case ObjectField::StructFieldType:
+ return true;
+ default:
+ return false;
+ }
+ }
InputLoc loc;
Type type;
diff --git a/src/pdabuild.cc b/src/pdabuild.cc
index f9cadb20..7fbab35f 100644
--- a/src/pdabuild.cc
+++ b/src/pdabuild.cc
@@ -1282,22 +1282,25 @@ short *Compiler::makeTrees( ObjectDef *objectDef, int &numTrees )
{
numTrees = 0;
for ( FieldList::Iter of = *objectDef->fieldList; of.lte(); of++ ) {
- UniqueType *ut = of->value->typeRef->resolveType( this );
- if ( ut->typeId == TYPE_TREE || ut->typeId == TYPE_PTR )
- numTrees += 1;
+ if ( of->value->exists() ) {
+ UniqueType *ut = of->value->typeRef->resolveType( this );
+ if ( ut->typeId == TYPE_TREE || ut->typeId == TYPE_PTR )
+ numTrees += 1;
+ }
}
short *trees = new short[numTrees];
memset( trees, 0, sizeof(short) * numTrees );
- short pos = 0, fieldPos = 0;;
+ short pos = 0;
for ( FieldList::Iter of = *objectDef->fieldList; of.lte(); of++ ) {
- UniqueType *ut = of->value->typeRef->resolveType( this );
- if ( ut->typeId == TYPE_TREE || ut->typeId == TYPE_PTR ) {
- trees[pos] = fieldPos;
- pos += 1;
+ if ( of->value->exists() ) {
+ UniqueType *ut = of->value->typeRef->resolveType( this );
+ if ( ut->typeId == TYPE_TREE || ut->typeId == TYPE_PTR ) {
+ trees[pos] = of->value->offset;
+ pos += 1;
+ }
}
- fieldPos += 1;
}
return trees;
diff --git a/src/synthesis.cc b/src/synthesis.cc
index 60e0d3ee..82dd5323 100644
--- a/src/synthesis.cc
+++ b/src/synthesis.cc
@@ -218,7 +218,8 @@ ObjectField *ObjectDef::findFieldNum( long offset )
long sizeOfField( UniqueType *fieldUT )
{
long size = 0;
- if ( fieldUT->typeId == TYPE_ITER ) {
+ switch ( fieldUT->typeId ) {
+ case TYPE_ITER:
/* Select on the iterator type. */
switch ( fieldUT->iterDef->type ) {
case IterDef::Tree:
@@ -239,11 +240,14 @@ long sizeOfField( UniqueType *fieldUT )
size = 1;
break;
}
- }
- else if ( fieldUT->typeId == TYPE_REF )
+ break;
+ case TYPE_REF:
size = 2;
- else
+ break;
+ default:
size = 1;
+ break;
+ }
return size;
}
@@ -2768,10 +2772,6 @@ void Compiler::placeAllLanguageObjects()
objDef->placeField( this, f->value );
}
}
-
- /* Init all fields of the global object. */
- for ( FieldList::Iter f = *globalObjectDef->fieldList; f.lte(); f++ )
- globalObjectDef->placeField( this, f->value );
}
void Compiler::placeAllStructObjects()