diff options
-rw-r--r-- | src/loadinit.cc | 4 | ||||
-rw-r--r-- | src/parsetree.h | 14 | ||||
-rw-r--r-- | src/pdabuild.cc | 21 | ||||
-rw-r--r-- | src/synthesis.cc | 16 |
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() |