summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2014-01-05 18:23:00 -0500
committerAdrian Thurston <thurston@complang.org>2014-01-05 18:23:00 -0500
commitf77092c630833e09cf34fe9552c6b3d39ec0482c (patch)
tree2d3859b0814440c8260949c70c88ff27e7edbf6b
parent382c1b3c45587fcb3d3b7dfc82d58dc7c0c096e8 (diff)
downloadcolm-f77092c630833e09cf34fe9552c6b3d39ec0482c.tar.gz
removed curScope from ObjectDef, track it in BaseParser
-rw-r--r--src/declare.cc61
-rw-r--r--src/loadcolm.cc8
-rw-r--r--src/parser.cc57
-rw-r--r--src/parser.h1
-rw-r--r--src/parsetree.h9
5 files changed, 69 insertions, 67 deletions
diff --git a/src/declare.cc b/src/declare.cc
index aa42beb4..5ee113fc 100644
--- a/src/declare.cc
+++ b/src/declare.cc
@@ -49,30 +49,30 @@ void Compiler::initUniqueTypes( )
ObjectField *ObjNameScope::checkRedecl( const String &name )
{
- return owner->checkRedecl( name );
+ return owner->checkRedecl( this, name );
}
void ObjNameScope::insertField( const String &name, ObjectField *value )
{
- return owner->insertField( name, value );
+ return owner->insertField( this, name, value );
}
-ObjectField *ObjectDef::checkRedecl( const String &name )
+ObjectField *ObjectDef::checkRedecl( ObjNameScope *inScope, const String &name )
{
- ObjFieldMapEl *objDefMapEl = curScope->objFieldMap->find( name );
+ ObjFieldMapEl *objDefMapEl = inScope->objFieldMap->find( name );
if ( objDefMapEl != 0 )
return objDefMapEl->value;
return 0;
}
-void ObjectDef::insertField( const String &name, ObjectField *value )
+void ObjectDef::insertField( ObjNameScope *inScope, const String &name, ObjectField *value )
{
- curScope->objFieldMap->insert( name, value );
+ inScope->objFieldMap->insert( name, value );
objFieldList->append( value );
- value->scope = curScope;
+ value->scope = inScope;
}
-void ObjectDef::pushScope()
+ObjNameScope *ObjectDef::pushScope( ObjNameScope *curScope )
{
ObjNameScope *newScope = new ObjNameScope;
newScope->objFieldMap = new ObjFieldMap;
@@ -81,7 +81,7 @@ void ObjectDef::pushScope()
newScope->parentScope = curScope;
curScope->children.append( newScope );
- curScope = newScope;
+ return newScope;
}
void LexJoin::varDecl( Compiler *pd, TokenDef *tokenDef )
@@ -124,13 +124,13 @@ void LexTerm::varDecl( Compiler *pd, TokenDef *tokenDef )
void LexFactorAug::varDecl( Compiler *pd, TokenDef *tokenDef )
{
for ( ReCaptureVect::Iter re = reCaptureVect; re.lte(); re++ ) {
- if ( tokenDef->objectDef->checkRedecl( re->objField->name ) != 0 ) {
+ if ( tokenDef->objectDef->rootScope->checkRedecl( re->objField->name ) != 0 ) {
error(re->objField->loc) << "label name \"" <<
re->objField->name << "\" already in use" << endp;
}
/* Insert it into the map. */
- tokenDef->objectDef->insertField( re->objField->name, re->objField );
+ tokenDef->objectDef->rootScope->insertField( re->objField->name, re->objField );
/* Store it in the TokenDef. */
tokenDef->reCaptureVect.append( *re );
@@ -254,7 +254,7 @@ void Compiler::addProdRedObjectVar( ObjectDef *localFrame, LangEl *nonTerm )
initLocalInstructions( el );
- localFrame->insertField( el->name, el );
+ localFrame->rootScope->insertField( el->name, el );
}
void Compiler::addProdLHSLoad( Production *prod, CodeVect &code, long &insertPos )
@@ -309,7 +309,7 @@ void Compiler::addProdRHSVars( ObjectDef *localFrame, ProdElList *prodElList )
/* Only ever fetch for reading since they are constant. */
el->inGetR = IN_GET_LOCAL_R;
- localFrame->insertField( el->name, el );
+ localFrame->rootScope->insertField( el->name, el );
}
}
}
@@ -721,7 +721,7 @@ void Compiler::addMatchLength( ObjectDef *frame, LangEl *lel )
el->isConst = true;
el->useOffset = false;
el->inGetR = IN_GET_MATCH_LENGTH_R;
- frame->insertField( el->name, el );
+ frame->rootScope->insertField( el->name, el );
}
void Compiler::addMatchText( ObjectDef *frame, LangEl *lel )
@@ -736,7 +736,7 @@ void Compiler::addMatchText( ObjectDef *frame, LangEl *lel )
el->isConst = true;
el->useOffset = false;
el->inGetR = IN_GET_MATCH_TEXT_R;
- frame->insertField( el->name, el );
+ frame->rootScope->insertField( el->name, el );
}
void Compiler::addInput( ObjectDef *frame )
@@ -754,7 +754,7 @@ void Compiler::addInput( ObjectDef *frame )
el->inGetR = IN_LOAD_INPUT_R;
el->inGetWV = IN_LOAD_INPUT_WV;
el->inGetWC = IN_LOAD_INPUT_WC;
- frame->insertField( el->name, el );
+ frame->rootScope->insertField( el->name, el );
}
void Compiler::addCtx( ObjectDef *frame )
@@ -772,7 +772,7 @@ void Compiler::addCtx( ObjectDef *frame )
el->inGetR = IN_LOAD_CTX_R;
el->inGetWV = IN_LOAD_CTX_WV;
el->inGetWC = IN_LOAD_CTX_WC;
- frame->insertField( el->name, el );
+ frame->rootScope->insertField( el->name, el );
}
void Compiler::initIntObject( )
@@ -903,10 +903,9 @@ void Compiler::addLengthField( ObjectDef *objDef, Code getLength )
el->useOffset = false;
el->inGetR = getLength;
- objDef->insertField( el->name, el );
+ objDef->rootScope->insertField( el->name, el );
}
-
void Compiler::initTokenObjects( )
{
/* Give all user terminals the token object type. */
@@ -915,15 +914,15 @@ void Compiler::initTokenObjects( )
if ( lel->objectDef != 0 ) {
/* Create the "data" field. */
ObjectField *dataEl = makeDataEl();
- lel->objectDef->insertField( dataEl->name, dataEl );
+ lel->objectDef->rootScope->insertField( dataEl->name, dataEl );
/* Create the "pos" field. */
ObjectField *posEl = makePosEl();
- lel->objectDef->insertField( posEl->name, posEl );
+ lel->objectDef->rootScope->insertField( posEl->name, posEl );
/* Create the "line" field. */
ObjectField *lineEl = makeLineEl();
- lel->objectDef->insertField( lineEl->name, lineEl );
+ lel->objectDef->rootScope->insertField( lineEl->name, lineEl );
}
}
}
@@ -969,7 +968,7 @@ void Compiler::addStdin()
el->inGetR = IN_GET_STDIN;
el->inGetWC = IN_GET_STDIN;
el->inGetWV = IN_GET_STDIN;
- globalObjectDef->insertField( el->name, el );
+ globalObjectDef->rootScope->insertField( el->name, el );
}
void Compiler::addStdout()
@@ -986,7 +985,7 @@ void Compiler::addStdout()
el->inGetR = IN_GET_STDOUT;
el->inGetWC = IN_GET_STDOUT;
el->inGetWV = IN_GET_STDOUT;
- globalObjectDef->insertField( el->name, el );
+ globalObjectDef->rootScope->insertField( el->name, el );
}
void Compiler::addStderr()
@@ -1003,7 +1002,7 @@ void Compiler::addStderr()
el->inGetR = IN_GET_STDERR;
el->inGetWC = IN_GET_STDERR;
el->inGetWV = IN_GET_STDERR;
- globalObjectDef->insertField( el->name, el );
+ globalObjectDef->rootScope->insertField( el->name, el );
}
void Compiler::addArgv()
@@ -1012,7 +1011,7 @@ void Compiler::addArgv()
ObjectField *el = ObjectField::cons( internal, argvTypeRef, "argv" );
el->isArgv = true;
el->isConst = true;
- globalObjectDef->insertField( el->name, el );
+ globalObjectDef->rootScope->insertField( el->name, el );
}
void Compiler::addError()
@@ -1029,7 +1028,7 @@ void Compiler::addError()
el->inGetR = IN_GET_ERROR;
el->inGetWC = IN_GET_ERROR;
el->inGetWV = IN_GET_ERROR;
- globalObjectDef->insertField( el->name, el );
+ globalObjectDef->rootScope->insertField( el->name, el );
}
int Compiler::argvOffset()
@@ -1085,7 +1084,7 @@ void Compiler::initListField( GenericType *gen, const char *name, int offset )
el->inSetWC = IN_SET_LIST_MEM_WC;
el->inSetWV = IN_SET_LIST_MEM_WV;
- gen->objDef->insertField( el->name, el );
+ gen->objDef->rootScope->insertField( el->name, el );
el->useOffset = true;
el->beenReferenced = true;
@@ -1131,7 +1130,7 @@ void Compiler::initParserField( GenericType *gen, const char *name, int offset,
el->inSetWC = IN_SET_PARSER_MEM_WC;
el->inSetWV = IN_SET_PARSER_MEM_WV;
- gen->objDef->insertField( el->name, el );
+ gen->objDef->rootScope->insertField( el->name, el );
el->useOffset = true;
el->beenReferenced = true;
@@ -1157,7 +1156,7 @@ void Compiler::initCtxField( GenericType *gen )
el->inSetWC = IN_SET_PARSER_CTX_WC;
el->inSetWV = IN_SET_PARSER_CTX_WV;
- gen->objDef->insertField( el->name, el );
+ gen->objDef->rootScope->insertField( el->name, el );
el->useOffset = false;
el->beenReferenced = true;
@@ -1189,7 +1188,7 @@ void Compiler::makeFuncVisible( Function *func, bool isUserIter )
if ( func->localFrame->rootScope->findField( param->name ) != 0 )
error(param->loc) << "parameter " << param->name << " redeclared" << endp;
- func->localFrame->insertField( param->name, param );
+ func->localFrame->rootScope->insertField( param->name, param );
param->beenInitialized = true;
param->pos = paramPos;
diff --git a/src/loadcolm.cc b/src/loadcolm.cc
index f06b2597..c6be2c49 100644
--- a/src/loadcolm.cc
+++ b/src/loadcolm.cc
@@ -228,7 +228,7 @@ struct LoadColm
IterCall *iterCall = walkIterCall( Statement.iter_call() );
stmt = forScope( Statement.id().loc(), forDecl,
- curLocalFrame->curScope, typeRef, iterCall, stmtList );
+ curScope, typeRef, iterCall, stmtList );
popScope();
break;
@@ -429,7 +429,7 @@ struct LoadColm
if ( optLabel.prodName() == opt_label::_Id ) {
String id = optLabel.id().data();
varRef = LangVarRef::cons( optLabel.id().loc(),
- context, curLocalFrame->curScope, id );
+ context, curScope, id );
}
return varRef;
}
@@ -1157,7 +1157,7 @@ struct LoadColm
QualItemVect *qualItemVect = walkQual( Qual );
String id = varRef.id().data();
LangVarRef *langVarRef = LangVarRef::cons( varRef.id().loc(),
- context, curLocalFrame->curScope, qualItemVect, id );
+ context, curScope, qualItemVect, id );
return langVarRef;
}
@@ -1814,7 +1814,7 @@ struct LoadColm
case iter_call::_Id: {
String tree = Tree.id().data();
LangVarRef *varRef = LangVarRef::cons( Tree.id().loc(),
- context, curLocalFrame->curScope, tree );
+ context, curScope, tree );
LangTerm *langTerm = LangTerm::cons( Tree.id().loc(),
LangTerm::VarRefType, varRef );
LangExpr *langExpr = LangExpr::cons( langTerm );
diff --git a/src/parser.cc b/src/parser.cc
index 8820475c..586aefe2 100644
--- a/src/parser.cc
+++ b/src/parser.cc
@@ -52,6 +52,7 @@ void BaseParser::init()
pd->rootLocalFrame = ObjectDef::cons( ObjectDef::FrameType,
"local", pd->nextObjectId++ );
curLocalFrame = pd->rootLocalFrame;
+ curScope = pd->rootLocalFrame->rootScope;
/* Declarations of internal types. They must be declared now because we use
* them directly, rather than via type lookup. */
@@ -345,12 +346,14 @@ ObjectDef *BaseParser::blockOpen()
"local", pd->nextObjectId++ );
curLocalFrame = frame;
+ curScope = frame->rootScope;
return frame;
}
void BaseParser::blockClose()
{
curLocalFrame = pd->rootLocalFrame;
+ curScope = pd->rootLocalFrame->rootScope;
}
void BaseParser::functionDef( StmtList *stmtList, ObjectDef *localFrame,
@@ -387,14 +390,14 @@ LangStmt *BaseParser::globalDef( ObjectField *objField, LangExpr *expr,
object = context->contextObjDef;
}
- if ( object->checkRedecl( objField->name ) != 0 )
+ if ( object->rootScope->checkRedecl( objField->name ) != 0 )
error(objField->loc) << "object field renamed" << endp;
- object->insertField( objField->name, objField );
+ object->rootScope->insertField( objField->name, objField );
if ( expr != 0 ) {
LangVarRef *varRef = LangVarRef::cons( objField->loc,
- context, curLocalFrame->curScope, objField->name );
+ context, curScope, objField->name );
stmt = LangStmt::cons( objField->loc,
assignType, varRef, expr );
@@ -418,14 +421,14 @@ void BaseParser::cflDef( NtDef *ntDef, ObjectDef *objectDef, LelDefList *defList
/* If there is a capture, create the field. */
if ( pel->captureField != 0 ) {
/* Might already exist. */
- ObjectField *newOf = objectDef->checkRedecl( pel->captureField->name );
+ ObjectField *newOf = objectDef->rootScope->checkRedecl( pel->captureField->name );
if ( newOf != 0 ) {
/* FIXME: check the types are the same. */
}
else {
newOf = pel->captureField;
newOf->typeRef = pel->typeRef;
- objectDef->insertField( newOf->name, newOf );
+ objectDef->rootScope->insertField( newOf->name, newOf );
}
newOf->isRhsGet = true;
@@ -572,7 +575,7 @@ LangExpr *BaseParser::parseCmd( const InputLoc &loc, bool stop, ObjectField *obj
LangVarRef *varRef = 0;
if ( objField != 0 ) {
varRef = LangVarRef::cons( objField->loc,
- context, curLocalFrame->curScope, objField->name );
+ context, curScope, objField->name );
}
/* The typeref for the parser. */
@@ -588,14 +591,14 @@ LangExpr *BaseParser::parseCmd( const InputLoc &loc, bool stop, ObjectField *obj
/* Check for redeclaration. */
if ( objField != 0 ) {
- if ( curLocalFrame->checkRedecl( objField->name ) != 0 ) {
+ if ( curScope->checkRedecl( objField->name ) != 0 ) {
error( objField->loc ) << "variable " << objField->name <<
" redeclared" << endp;
}
/* Insert it into the field map. */
objField->typeRef = typeRef;
- curLocalFrame->insertField( objField->name, objField );
+ curScope->insertField( objField->name, objField );
}
return expr;
@@ -607,7 +610,7 @@ PatternItemList *BaseParser::consPatternEl( LangVarRef *varRef, PatternItemList
list->head->varRef = varRef;
if ( varRef != 0 ) {
- if ( curLocalFrame->checkRedecl( varRef->name ) != 0 ) {
+ if ( curScope->checkRedecl( varRef->name ) != 0 ) {
error( varRef->loc ) << "variable " << varRef->name <<
" redeclared" << endp;
}
@@ -616,7 +619,7 @@ PatternItemList *BaseParser::consPatternEl( LangVarRef *varRef, PatternItemList
ObjectField *objField = ObjectField::cons( InputLoc(), typeRef, varRef->name );
/* Insert it into the field map. */
- curLocalFrame->insertField( varRef->name, objField );
+ curScope->insertField( varRef->name, objField );
}
return list;
@@ -673,14 +676,14 @@ LangStmt *BaseParser::forScope( const InputLoc &loc, const String &data,
Context *context = contextStack.length() == 0 ? 0 : contextStack.top();
/* Check for redeclaration. */
- if ( curLocalFrame->checkRedecl( data ) != 0 )
+ if ( curScope->checkRedecl( data ) != 0 )
error( loc ) << "variable " << data << " redeclared" << endp;
/* Note that we pass in a null type reference. This type is dependent on
* the result of the iter_call lookup since it must contain a reference to
* the iterator that is called. This lookup is done at compile time. */
ObjectField *iterField = ObjectField::cons( loc, (TypeRef*)0, data );
- curLocalFrame->insertField( data, iterField );
+ curScope->insertField( data, iterField );
LangStmt *stmt = LangStmt::cons( loc, LangStmt::ForIterType,
iterField, typeRef, iterCall, stmtList, context, scope );
@@ -749,10 +752,10 @@ Production *BaseParser::production( const InputLoc &loc, ProdElList *prodElList,
void BaseParser::objVarDef( ObjectDef *objectDef, ObjectField *objField )
{
- if ( objectDef->checkRedecl( objField->name ) != 0 )
+ if ( objectDef->rootScope->checkRedecl( objField->name ) != 0 )
error() << "object field renamed" << endp;
- objectDef->insertField( objField->name, objField );
+ objectDef->rootScope->insertField( objField->name, objField );
}
LelDefList *BaseParser::prodAppend( LelDefList *defList, Production *definition )
@@ -775,7 +778,7 @@ LangExpr *BaseParser::construct( const InputLoc &loc, ObjectField *objField,
LangVarRef *varRef = 0;
if ( objField != 0 ) {
varRef = LangVarRef::cons( objField->loc,
- context, curLocalFrame->curScope, objField->name );
+ context, curScope, objField->name );
}
LangExpr *expr = LangExpr::cons( LangTerm::cons( loc, LangTerm::ConstructType,
@@ -783,14 +786,14 @@ LangExpr *BaseParser::construct( const InputLoc &loc, ObjectField *objField,
/* Check for redeclaration. */
if ( objField != 0 ) {
- if ( curLocalFrame->checkRedecl( objField->name ) != 0 ) {
+ if ( curScope->checkRedecl( objField->name ) != 0 ) {
error( objField->loc ) << "variable " << objField->name <<
" redeclared" << endp;
}
/* Insert it into the field map. */
objField->typeRef = typeRef;
- curLocalFrame->insertField( objField->name, objField );
+ curScope->insertField( objField->name, objField );
}
return expr;
@@ -818,19 +821,19 @@ LangStmt *BaseParser::varDef( ObjectField *objField,
Context *context = contextStack.length() == 0 ? 0 : contextStack.top();
/* Check for redeclaration. */
- if ( curLocalFrame->checkRedecl( objField->name ) != 0 ) {
+ if ( curScope->checkRedecl( objField->name ) != 0 ) {
error( objField->loc ) << "variable " << objField->name <<
" redeclared" << endp;
}
/* Insert it into the field map. */
- curLocalFrame->insertField( objField->name, objField );
+ curScope->insertField( objField->name, objField );
//cout << "var def " << $1->objField->name << endl;
if ( expr != 0 ) {
LangVarRef *varRef = LangVarRef::cons( objField->loc,
- context, curLocalFrame->curScope, objField->name );
+ context, curScope, objField->name );
stmt = LangStmt::cons( objField->loc, assignType, varRef, expr );
}
@@ -847,15 +850,15 @@ LangStmt *BaseParser::exportStmt( ObjectField *objField, LangStmt::Type assignTy
ObjectDef *object = pd->globalObjectDef;
- if ( object->checkRedecl( objField->name ) != 0 )
+ if ( object->rootScope->checkRedecl( objField->name ) != 0 )
error(objField->loc) << "object field renamed" << endp;
- object->insertField( objField->name, objField );
+ object->rootScope->insertField( objField->name, objField );
objField->isExport = true;
if ( expr != 0 ) {
LangVarRef *varRef = LangVarRef::cons( objField->loc,
- 0, curLocalFrame->curScope, objField->name );
+ 0, curScope, objField->name );
stmt = LangStmt::cons( objField->loc, assignType, varRef, expr );
}
@@ -887,10 +890,10 @@ void BaseParser::contextVarDef( const InputLoc &loc, ObjectField *objField )
objField->context = context;
object = context->contextObjDef;
- if ( object->checkRedecl( objField->name ) != 0 )
+ if ( object->rootScope->checkRedecl( objField->name ) != 0 )
error(objField->loc) << "object field renamed" << endp;
- object->insertField( objField->name, objField );
+ object->rootScope->insertField( objField->name, objField );
}
void BaseParser::contextHead( const InputLoc &loc, const String &data )
@@ -965,10 +968,10 @@ void BaseParser::precedenceStmt( PredType predType, PredDeclList *predDeclList )
void BaseParser::pushScope()
{
- curLocalFrame->pushScope();
+ curScope = curLocalFrame->pushScope( curScope );
}
void BaseParser::popScope()
{
- curLocalFrame->curScope = curLocalFrame->curScope->parentScope;
+ curScope = curScope->parentScope;
}
diff --git a/src/parser.h b/src/parser.h
index 156a0791..3eec64ce 100644
--- a/src/parser.h
+++ b/src/parser.h
@@ -43,6 +43,7 @@ struct BaseParser
NamespaceVect namespaceStack;
ContextStack contextStack;
ObjectDef *curLocalFrame;
+ ObjNameScope *curScope;
bool enterRl;
diff --git a/src/parsetree.h b/src/parsetree.h
index fbe3395b..56e3fa90 100644
--- a/src/parsetree.h
+++ b/src/parsetree.h
@@ -2421,7 +2421,7 @@ struct ObjectDef
o->name = name;
o->id = id;
- o->rootScope = o->curScope = new ObjNameScope;
+ o->rootScope = new ObjNameScope;
o->rootScope->owner = o;
o->rootScope->objFieldMap = new ObjFieldMap;
@@ -2437,9 +2437,8 @@ struct ObjectDef
ObjMethodMap *objMethodMap;
ObjNameScope *rootScope;
- ObjNameScope *curScope;
- void pushScope();
+ ObjNameScope *pushScope( ObjNameScope *curScope );
long id;
long nextOffset;
@@ -2449,10 +2448,10 @@ struct ObjectDef
void referenceField( Compiler *pd, ObjectField *field );
void initField( Compiler *pd, ObjectField *field );
void createCode( Compiler *pd, CodeVect &code );
- ObjectField *checkRedecl( const String &name );
ObjMethod *findMethod( const String &name ) const;
ObjectField *findFieldInScope( const ObjNameScope *scope, const String &name ) const;
- void insertField( const String &name, ObjectField *value );
+ ObjectField *checkRedecl( ObjNameScope *inScope, const String &name );
+ void insertField( ObjNameScope *inScope, const String &name, ObjectField *value );
void resolve( Compiler *pd );
ObjectField *findFieldNum( long offset );