summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--colm/compile.cpp34
-rw-r--r--colm/lmparse.kl19
-rw-r--r--colm/parsedata.h1
-rw-r--r--colm/parsetree.h9
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<String, ObjField*, CmpStr> ObjFieldMap;
typedef AvlMapEl<String, ObjField*> ObjFieldMapEl;
+typedef DListVal<ObjField*> ObjFieldList;
+
typedef DList<ObjField> 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;