From d7884f1080497f0432dbe7b6226c5294c5a98f9b Mon Sep 17 00:00:00 2001 From: Adrian Thurston Date: Sun, 1 Mar 2009 03:44:49 +0000 Subject: Added objFieldList so that object attributes have their offets ordered as they appear. Otherwise the args to make_token need to be sorted according to the alphabetical sort of the attribute names. Also, debugging gets harder with an alphabetical sort and this has caused me problems on more than one occation. --- colm/compile.cpp | 34 ++++++++++++++++++++++++++-------- colm/lmparse.kl | 19 ++++++++++++++----- colm/parsedata.h | 1 + colm/parsetree.h | 9 +++++++-- 4 files changed, 48 insertions(+), 15 deletions(-) diff --git a/colm/compile.cpp b/colm/compile.cpp index 2a9b810e..5fce43ce 100644 --- a/colm/compile.cpp +++ b/colm/compile.cpp @@ -1861,6 +1861,7 @@ void ParseData::addProdRedObjectVar( ObjectDef *localFrame, KlangEl *nonTerm ) initLocalInstructions( el ); localFrame->objFieldMap->insert( el->name, el ); + localFrame->objFieldList->append( el ); } void ParseData::addProdRHSVars( ObjectDef *localFrame, ProdElList *prodElList ) @@ -1884,6 +1885,7 @@ void ParseData::addProdRHSVars( ObjectDef *localFrame, ProdElList *prodElList ) el->inGetR = IN_GET_LOCAL_R; localFrame->objFieldMap->insert( el->name, el ); + localFrame->objFieldList->append( el ); } } } @@ -1901,6 +1903,7 @@ void ParseData::addMatchLength( ObjectDef *frame, KlangEl *lel ) el->useOffset = false; el->inGetR = IN_GET_MATCH_LENGTH_R; frame->objFieldMap->insert( el->name, el ); + frame->objFieldList->append( el ); } void ParseData::addMatchText( ObjectDef *frame, KlangEl *lel ) @@ -1916,6 +1919,7 @@ void ParseData::addMatchText( ObjectDef *frame, KlangEl *lel ) el->useOffset = false; el->inGetR = IN_GET_MATCH_TEXT_R; frame->objFieldMap->insert( el->name, el ); + frame->objFieldList->append( el ); } void ParseData::initFieldInstructions( ObjField *el ) @@ -1944,9 +1948,10 @@ void ParseData::initLocalRefInstructions( ObjField *el ) void ParseData::initIntObject( ) { ObjFieldMap *fieldMap = new ObjFieldMap; + ObjFieldList *fieldList = new ObjFieldList; ObjMethodMap *methodMap = new ObjMethodMap; intObj = new ObjectDef( ObjectDef::BuiltinType, "int", - fieldMap, methodMap, nextObjectId++ ); + fieldMap, fieldList, methodMap, nextObjectId++ ); intKlangEl->objectDef = intObj; initFunction( uniqueTypeStr, intObj, "to_string", IN_INT_TO_STR, IN_INT_TO_STR, true ); @@ -1966,14 +1971,16 @@ void ParseData::addLengthField( ObjectDef *objDef, Code getLength ) el->inGetR = getLength; objDef->objFieldMap->insert( el->name, el ); + objDef->objFieldList->append( el ); } void ParseData::initStrObject( ) { ObjFieldMap *fieldMap = new ObjFieldMap; + ObjFieldList *fieldList = new ObjFieldList; ObjMethodMap *methodMap = new ObjMethodMap; strObj = new ObjectDef( ObjectDef::BuiltinType, "str", - fieldMap, methodMap, nextObjectId++ ); + fieldMap, fieldList, methodMap, nextObjectId++ ); strKlangEl->objectDef = strObj; initFunction( uniqueTypeInt, strObj, "atoi", IN_STR_ATOI, IN_STR_ATOI, true ); @@ -1989,9 +1996,10 @@ void ParseData::initStrObject( ) void ParseData::initStreamObject( ) { ObjFieldMap *fieldMap = new ObjFieldMap; + ObjFieldList *fieldList = new ObjFieldList; ObjMethodMap *methodMap = new ObjMethodMap; streamObj = new ObjectDef( ObjectDef::BuiltinType, "stream", - fieldMap, methodMap, nextObjectId++ ); + fieldMap, fieldList, methodMap, nextObjectId++ ); streamKlangEl->objectDef = streamObj; // initFunction( uniqueTypeInt, strObj, "atoi", IN_STR_ATOI, IN_STR_ATOI, true ); @@ -2043,15 +2051,18 @@ void ParseData::initTokenObjects( ) { /* Make a default object Definition. */ ObjFieldMap *fieldMap = new ObjFieldMap; + ObjFieldList *fieldList = new ObjFieldList; ObjMethodMap *methodMap = new ObjMethodMap; - tokenObj = new ObjectDef( ObjectDef::BuiltinType, "token", fieldMap, + tokenObj = new ObjectDef( ObjectDef::BuiltinType, "token", fieldMap, fieldList, methodMap, nextObjectId++ ); ObjField *dataEl = makeDataEl(); tokenObj->objFieldMap->insert( dataEl->name, dataEl ); + tokenObj->objFieldList->append( dataEl ); ObjField *posEl = makePosEl(); tokenObj->objFieldMap->insert( posEl->name, posEl ); + tokenObj->objFieldList->append( posEl ); /* Give all user terminals the token object type. */ @@ -2063,10 +2074,12 @@ void ParseData::initTokenObjects( ) /* Create the "data" field. */ ObjField *dataEl = makeDataEl(); lel->objectDef->objFieldMap->insert( dataEl->name, dataEl ); + lel->objectDef->objFieldList->append( dataEl ); /* Create the "pos" field. */ ObjField *posEl = makePosEl(); lel->objectDef->objFieldMap->insert( posEl->name, posEl ); + lel->objectDef->objFieldList->append( posEl ); } } } @@ -2305,13 +2318,13 @@ void ParseData::initAllLanguageObjects() ObjectDef *obj = lel->objectDef; if ( obj != 0 ) { /* Init all fields of the object. */ - for ( ObjFieldMap::Iter f = *obj->objFieldMap; f.lte(); f++ ) + for ( ObjFieldList::Iter f = *obj->objFieldList; f.lte(); f++ ) obj->initField( this, f->value ); } } /* Init all fields of the global object. */ - for ( ObjFieldMap::Iter f = *globalObjectDef->objFieldMap; f.lte(); f++ ) + for ( ObjFieldList::Iter f = *globalObjectDef->objFieldList; f.lte(); f++ ) globalObjectDef->initField( this, f->value ); } @@ -2356,6 +2369,7 @@ void ParseData::initListField( GenericType *gen, const char *name, int offset ) el->inSetWV = IN_SET_LIST_MEM_WV; gen->objDef->objFieldMap->insert( el->name, el ); + gen->objDef->objFieldList->append( el ); el->useOffset = true; el->beenReferenced = true; @@ -2391,9 +2405,10 @@ void ParseData::resolveGenericTypes() gen->keyUT = gen->keyTypeArg->lookupType( this ); ObjFieldMap *fieldMap = new ObjFieldMap; + ObjFieldList *fieldList = new ObjFieldList; ObjMethodMap *methodMap = new ObjMethodMap; gen->objDef = new ObjectDef( ObjectDef::BuiltinType, - gen->name, fieldMap, methodMap, nextObjectId++ ); + gen->name, fieldMap, fieldList, methodMap, nextObjectId++ ); switch ( gen->typeId ) { case GEN_MAP: @@ -2429,6 +2444,7 @@ void ParseData::makeFuncVisible( Function *func, bool isUserIter ) error(param->loc) << "parameter " << param->name << " redeclared" << endp; func->localFrame->objFieldMap->insert( param->name, param ); + func->localFrame->objFieldList->append( param ); param->beenInitialized = true; param->pos = paramPos; @@ -2447,7 +2463,6 @@ void ParseData::makeFuncVisible( Function *func, bool isUserIter ) * words containing the args. */ long paramOffset = 0; for ( ParameterList::Iter param = *func->paramList; param.lte(); param++ ) { - /* Moving downward, and need the offset to point to the lower half of * the argument. */ paramOffset -= sizeOfField( paramUTs[param->pos] ); @@ -2649,6 +2664,7 @@ void ParseData::addStdin() el->useOffset = false; el->inGetR = IN_GET_STDIN; globalObjectDef->objFieldMap->insert( el->name, el ); + globalObjectDef->objFieldList->append( el ); } void ParseData::addStdout() @@ -2664,6 +2680,7 @@ void ParseData::addStdout() el->useOffset = false; el->inGetR = IN_GET_STDOUT; globalObjectDef->objFieldMap->insert( el->name, el ); + globalObjectDef->objFieldList->append( el ); } void ParseData::addStderr() @@ -2679,6 +2696,7 @@ void ParseData::addStderr() el->useOffset = false; el->inGetR = IN_GET_STDERR; globalObjectDef->objFieldMap->insert( el->name, el ); + globalObjectDef->objFieldList->append( el ); } void ParseData::initGlobalFunctions() diff --git a/colm/lmparse.kl b/colm/lmparse.kl index 04e64d65..6f974c21 100644 --- a/colm/lmparse.kl +++ b/colm/lmparse.kl @@ -88,7 +88,8 @@ block_open: '{' final { /* Init the object representing the local frame. */ $$->localFrame = new ObjectDef( ObjectDef::FrameType, - "local", new ObjFieldMap(), new ObjMethodMap(), pd->nextObjectId++ ); + "local", new ObjFieldMap(), new ObjFieldList, + new ObjMethodMap(), pd->nextObjectId++ ); pd->curLocalFrame = $$->localFrame; }; @@ -239,6 +240,7 @@ global_def: KW_Global var_def opt_def_init error($2->objField->loc) << "object field renamed" << endp; globalObj->objFieldMap->insert( $2->objField->name, $2->objField ); + globalObj->objFieldList->append( $2->objField ); if ( $3->expr != 0 ) { LangVarRef *varRef = new LangVarRef( $2->objField->loc, @@ -296,7 +298,7 @@ cfl_def: cfl_def_head obj_var_list properties_list cfl_prod_list /* Make a new object definition. */ ObjectDef *objectDef = new ObjectDef( ObjectDef::UserType, curDefineId, - pd->objFieldMap, new ObjMethodMap(), pd->nextObjectId++ ); + pd->objFieldMap, pd->objFieldList, new ObjMethodMap(), pd->nextObjectId++ ); langEl->objectDef = objectDef; }; @@ -360,11 +362,13 @@ obj_var_list: obj_var_list var_def error() << "object field renamed" << endp; pd->objFieldMap->insert( $2->objField->name, $2->objField ); + pd->objFieldList->append( $2->objField ); }; obj_var_list: final { pd->objFieldMap = new ObjFieldMap; + pd->objFieldList = new ObjFieldList; }; @@ -487,6 +491,7 @@ pattern_el: opt_label pattern_el_type_or_lit /* Insert it into the field map. */ pd->curLocalFrame->objFieldMap->insert( $1->varRef->name, objField ); + pd->curLocalFrame->objFieldList->append( objField ); } }; @@ -739,7 +744,7 @@ token_def: /* Create the object def for the token. */ ObjectDef *objectDef = new ObjectDef( ObjectDef::UserType, name, - pd->objFieldMap, new ObjMethodMap(), pd->nextObjectId++ ); + pd->objFieldMap, pd->objFieldList, new ObjMethodMap(), pd->nextObjectId++ ); tokEl->objectDef = objectDef; @@ -973,6 +978,7 @@ statement: var_def opt_def_init /* Insert it into the field map. */ pd->curLocalFrame->objFieldMap->insert( $1->objField->name, $1->objField ); + pd->curLocalFrame->objFieldList->append( $1->objField ); if ( $2->expr != 0 ) { LangVarRef *varRef = new LangVarRef( $1->objField->loc, @@ -1025,6 +1031,7 @@ statement: KW_For TK_Word ':' type_ref KW_In iter_call block_or_single * to the iterator that is called. This lookup is done at compile time. */ ObjField *iterField = new ObjField( $2->loc, (TypeRef*)0, $2->data ); pd->curLocalFrame->objFieldMap->insert( $2->data, iterField ); + pd->curLocalFrame->objFieldList->append( iterField ); $$->stmt = new LangStmt( $1->loc, LangStmt::ForIterType, iterField, $4->typeRef, $6->langTerm, $7->stmtList ); @@ -1639,6 +1646,7 @@ factor_with_label: /* Insert it into the map. */ pd->objFieldMap->insert( $1->data, objField ); + pd->objFieldList->append( objField ); /* Create the enter and leaving actions that will mark the substring. */ Action *enter = new Action( MarkMark, pd->nextMatchEndNum++ ); @@ -2001,8 +2009,9 @@ void Parser::init() /* Set up the global object. */ String global = "global"; ObjFieldMap *objFieldMap = new ObjFieldMap; + ObjFieldList *objFieldList = new ObjFieldList; pd->globalObjectDef = new ObjectDef( ObjectDef::UserType, global, - objFieldMap, new ObjMethodMap(), pd->nextObjectId++ ); + objFieldMap, objFieldList, new ObjMethodMap(), pd->nextObjectId++ ); /* The eofTokenRegion defaults to the root region. */ pd->eofTokenRegion = rootRegion; @@ -2014,7 +2023,7 @@ void Parser::init() pd->initGraphDict(); pd->rootLocalFrame = new ObjectDef( ObjectDef::FrameType, - "local", new ObjFieldMap(), new ObjMethodMap(), + "local", new ObjFieldMap(), new ObjFieldList(), new ObjMethodMap(), pd->nextObjectId++ ); pd->curLocalFrame = pd->rootLocalFrame; diff --git a/colm/parsedata.h b/colm/parsedata.h index 93fe2de0..8d4dcb23 100644 --- a/colm/parsedata.h +++ b/colm/parsedata.h @@ -916,6 +916,7 @@ struct ParseData long nextLabelId; ObjFieldMap *objFieldMap; + ObjFieldList *objFieldList; bool revertOn; diff --git a/colm/parsetree.h b/colm/parsetree.h index 86f81e7f..87880364 100644 --- a/colm/parsetree.h +++ b/colm/parsetree.h @@ -30,6 +30,7 @@ #include "bstset.h" #include "vector.h" #include "dlist.h" +#include "dlistval.h" #include "astring.h" #include "bytecode.h" #include "avlbasic.h" @@ -1247,6 +1248,8 @@ struct ObjField typedef AvlMap ObjFieldMap; typedef AvlMapEl ObjFieldMapEl; +typedef DListVal ObjFieldList; + typedef DList ParameterList; struct TemplateType; @@ -1261,14 +1264,16 @@ struct ObjectDef }; ObjectDef( Type type, String name, - ObjFieldMap *objFieldMap, ObjMethodMap *objMethodMap, int id ) + ObjFieldMap *objFieldMap, ObjFieldList *objFieldList, + ObjMethodMap *objMethodMap, int id ) : - type(type), name(name), objFieldMap(objFieldMap), + type(type), name(name), objFieldMap(objFieldMap), objFieldList(objFieldList), objMethodMap(objMethodMap), id(id), nextOffset(0) {} Type type; String name; ObjFieldMap *objFieldMap; + ObjFieldList *objFieldList; ObjMethodMap *objMethodMap; long id; -- cgit v1.2.1