diff options
author | Adrian Thurston <thurston@complang.org> | 2013-12-31 11:43:20 -0500 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2013-12-31 11:43:20 -0500 |
commit | 415c21f86d1d0b7ff49932b4b61251870e7400fb (patch) | |
tree | b2bb76e45525bf496084e78be1ae1d3e8d2133a1 /src | |
parent | fc1d502d70df74114c8edff5c7ce808895f156f9 (diff) | |
download | colm-415c21f86d1d0b7ff49932b4b61251870e7400fb.tar.gz |
pass the current scope to VarRef cons
This will lets us eliminate the scope walk needed for successful VarRef lookup.
Diffstat (limited to 'src')
-rw-r--r-- | src/consinit.cc | 8 | ||||
-rw-r--r-- | src/loadcolm.cc | 10 | ||||
-rw-r--r-- | src/loadinit.cc | 9 | ||||
-rw-r--r-- | src/lookup.cc | 20 | ||||
-rw-r--r-- | src/parser.cc | 13 | ||||
-rw-r--r-- | src/parsetree.h | 20 | ||||
-rw-r--r-- | src/synthesis.cc | 22 |
7 files changed, 56 insertions, 46 deletions
diff --git a/src/consinit.cc b/src/consinit.cc index e056d797..c2daf627 100644 --- a/src/consinit.cc +++ b/src/consinit.cc @@ -745,7 +745,8 @@ void ConsInit::parseInput( StmtList *stmtList ) QualItemVect *popQual = new QualItemVect; popQual->append( QualItem( QualItem::Dot, internal, String( "argv" ) ) ); - LangVarRef *popRef = LangVarRef::cons( internal, popQual, String("pop") ); + LangVarRef *popRef = LangVarRef::cons( internal, + pd->curLocalFrame->scope, popQual, String("pop") ); LangExpr *pop = LangExpr::cons( LangTerm::cons( InputLoc(), popRef, popArgs ) ); /* Construct a literal string 'r', for second arg to open. */ @@ -756,7 +757,8 @@ void ConsInit::parseInput( StmtList *stmtList ) /* Call open. */ QualItemVect *openQual = new QualItemVect; - LangVarRef *openRef = LangVarRef::cons( internal, openQual, String("open") ); + LangVarRef *openRef = LangVarRef::cons( internal, + pd->curLocalFrame->scope, openQual, String("open") ); CallArgVect *openArgs = new CallArgVect; openArgs->append( new CallArg(pop) ); openArgs->append( new CallArg(modeExpr) ); @@ -778,7 +780,7 @@ void ConsInit::parseInput( StmtList *stmtList ) void ConsInit::exportTree( StmtList *stmtList ) { QualItemVect *qual = new QualItemVect; - LangVarRef *varRef = LangVarRef::cons( internal, qual, String("P") ); + LangVarRef *varRef = LangVarRef::cons( internal, pd->curLocalFrame->scope, qual, String("P") ); LangExpr *expr = LangExpr::cons( LangTerm::cons( internal, LangTerm::VarRefType, varRef ) ); NamespaceQual *nspaceQual = NamespaceQual::cons( namespaceStack.top() ); diff --git a/src/loadcolm.cc b/src/loadcolm.cc index f09cc4ac..d7746686 100644 --- a/src/loadcolm.cc +++ b/src/loadcolm.cc @@ -425,7 +425,8 @@ struct LoadColm LangVarRef *varRef = 0; if ( optLabel.prodName() == opt_label::_Id ) { String id = optLabel.id().data(); - varRef = LangVarRef::cons( optLabel.id().loc(), id ); + varRef = LangVarRef::cons( optLabel.id().loc(), + pd->curLocalFrame->scope, id ); } return varRef; } @@ -1146,7 +1147,8 @@ struct LoadColm qual Qual = varRef.qual(); QualItemVect *qualItemVect = walkQual( Qual ); String id = varRef.id().data(); - LangVarRef *langVarRef = LangVarRef::cons( varRef.id().loc(), qualItemVect, id ); + LangVarRef *langVarRef = LangVarRef::cons( varRef.id().loc(), + pd->curLocalFrame->scope, qualItemVect, id ); return langVarRef; } @@ -1800,8 +1802,10 @@ struct LoadColm } case iter_call::_Id: { String tree = IterCall.id().data(); + LangVarRef *varRef = LangVarRef::cons( IterCall.id().loc(), + pd->curLocalFrame->scope, tree ); LangTerm *langTerm = LangTerm::cons( IterCall.id().loc(), - LangTerm::VarRefType, LangVarRef::cons( IterCall.id().loc(), tree ) ); + LangTerm::VarRefType, varRef ); LangExpr *langExpr = LangExpr::cons( langTerm ); iterCall = LangIterCall::cons( LangIterCall::VarRef, langExpr ); break; diff --git a/src/loadinit.cc b/src/loadinit.cc index b594fc57..ebc7d41a 100644 --- a/src/loadinit.cc +++ b/src/loadinit.cc @@ -285,7 +285,7 @@ void LoadInit::consParseStmt( StmtList *stmtList ) QualItemVect *popQual = new QualItemVect; popQual->append( QualItem( QualItem::Dot, internal, String( "argv" ) ) ); - LangVarRef *popRef = LangVarRef::cons( internal, popQual, String("pop") ); + LangVarRef *popRef = LangVarRef::cons( internal, pd->curLocalFrame->scope, popQual, String("pop") ); LangExpr *pop = LangExpr::cons( LangTerm::cons( InputLoc(), popRef, popArgs ) ); /* Construct a literal string 'r', for second arg to open. */ @@ -296,7 +296,8 @@ void LoadInit::consParseStmt( StmtList *stmtList ) /* Call open. */ QualItemVect *openQual = new QualItemVect; - LangVarRef *openRef = LangVarRef::cons( internal, openQual, String("open") ); + LangVarRef *openRef = LangVarRef::cons( internal, + pd->curLocalFrame->scope, openQual, String("open") ); CallArgVect *openArgs = new CallArgVect; openArgs->append( new CallArg(pop) ); openArgs->append( new CallArg(modeExpr) ); @@ -318,7 +319,7 @@ void LoadInit::consParseStmt( StmtList *stmtList ) void LoadInit::consExportTree( StmtList *stmtList ) { QualItemVect *qual = new QualItemVect; - LangVarRef *varRef = LangVarRef::cons( internal, qual, String("P") ); + LangVarRef *varRef = LangVarRef::cons( internal, pd->curLocalFrame->scope, qual, String("P") ); LangExpr *expr = LangExpr::cons( LangTerm::cons( internal, LangTerm::VarRefType, varRef ) ); NamespaceQual *nspaceQual = NamespaceQual::cons( namespaceStack.top() ); @@ -331,7 +332,7 @@ void LoadInit::consExportTree( StmtList *stmtList ) void LoadInit::consExportError( StmtList *stmtList ) { QualItemVect *qual = new QualItemVect; - LangVarRef *varRef = LangVarRef::cons( internal, qual, String("error") ); + LangVarRef *varRef = LangVarRef::cons( internal, pd->curLocalFrame->scope, qual, String("error") ); LangExpr *expr = LangExpr::cons( LangTerm::cons( internal, LangTerm::VarRefType, varRef ) ); NamespaceQual *nspaceQual = NamespaceQual::cons( namespaceStack.top() ); diff --git a/src/lookup.cc b/src/lookup.cc index a2815acb..2c6dd9ea 100644 --- a/src/lookup.cc +++ b/src/lookup.cc @@ -29,6 +29,26 @@ using std::cout; using std::cerr; using std::endl; +/* Recurisve find through a single object def's scope. */ +ObjectField *ObjectDef::findFieldInScope( const String &name, ObjNameScope *inScope ) +{ + ObjFieldMapEl *objDefMapEl = inScope->objFieldMap->find( name ); + if ( objDefMapEl != 0 ) + return objDefMapEl->value; + if ( inScope->parentScope != 0 ) + return findFieldInScope( name, inScope->parentScope ); + return 0; +} + +ObjectField *ObjectDef::findField( const String &name ) +{ + //cout << "looking for " << name << endl; + ObjectField *objField = findFieldInScope( name, scope ); + if ( objField != 0 ) + return objField; + return 0; +} + UniqueType *LangVarRef::lookup( Compiler *pd ) const { /* Lookup the loadObj. */ diff --git a/src/parser.cc b/src/parser.cc index 20914727..8741773d 100644 --- a/src/parser.cc +++ b/src/parser.cc @@ -391,7 +391,8 @@ LangStmt *BaseParser::globalDef( ObjectField *objField, LangExpr *expr, object->insertField( objField->name, objField ); if ( expr != 0 ) { - LangVarRef *varRef = LangVarRef::cons( objField->loc, objField->name ); + LangVarRef *varRef = LangVarRef::cons( objField->loc, + pd->curLocalFrame->scope, objField->name ); stmt = LangStmt::cons( objField->loc, assignType, varRef, expr ); @@ -567,7 +568,7 @@ LangExpr *BaseParser::parseCmd( const InputLoc &loc, bool stop, ObjectField *obj /* The parser may be referenced. */ LangVarRef *varRef = 0; if ( objField != 0 ) - varRef = LangVarRef::cons( objField->loc, objField->name ); + varRef = LangVarRef::cons( objField->loc, pd->curLocalFrame->scope, objField->name ); /* The typeref for the parser. */ TypeRef *parserTypeRef = TypeRef::cons( loc, @@ -764,7 +765,7 @@ LangExpr *BaseParser::construct( const InputLoc &loc, ObjectField *objField, LangVarRef *varRef = 0; if ( objField != 0 ) - varRef = LangVarRef::cons( objField->loc, objField->name ); + varRef = LangVarRef::cons( objField->loc, pd->curLocalFrame->scope, objField->name ); LangExpr *expr = LangExpr::cons( LangTerm::cons( loc, LangTerm::ConstructType, varRef, objField, typeRef, fieldInitVect, constructor ) ); @@ -816,8 +817,8 @@ LangStmt *BaseParser::varDef( ObjectField *objField, //cout << "var def " << $1->objField->name << endl; if ( expr != 0 ) { - LangVarRef *varRef = LangVarRef::cons( objField->loc, - objField->name ); + LangVarRef *varRef = LangVarRef::cons( objField->loc, + pd->curLocalFrame->scope, objField->name ); stmt = LangStmt::cons( objField->loc, assignType, varRef, expr ); } @@ -842,7 +843,7 @@ LangStmt *BaseParser::exportStmt( ObjectField *objField, LangStmt::Type assignTy if ( expr != 0 ) { LangVarRef *varRef = LangVarRef::cons( objField->loc, - objField->name ); + pd->curLocalFrame->scope, objField->name ); stmt = LangStmt::cons( objField->loc, assignType, varRef, expr ); } diff --git a/src/parsetree.h b/src/parsetree.h index bc863c12..3d009da4 100644 --- a/src/parsetree.h +++ b/src/parsetree.h @@ -2333,9 +2333,13 @@ struct TemplateType; struct ObjNameScope { ObjNameScope() - : parentScope(0), childIter(0) + : + owner(0), + parentScope(0), + childIter(0) {} + ObjectDef *owner; ObjFieldMap *objFieldMap; ObjNameScope *parentScope; @@ -2499,22 +2503,19 @@ struct LangVarRef qual(0) {} - static LangVarRef *cons( const InputLoc &loc, String name ) + static LangVarRef *cons( const InputLoc &loc, ObjNameScope *scope, QualItemVect *qual, const String &name ) { LangVarRef *l = new LangVarRef; l->loc = loc; - l->qual = new QualItemVect; + l->scope = scope; + l->qual = qual; l->name = name; return l; } - static LangVarRef *cons( const InputLoc &loc, QualItemVect *qual, String name ) + static LangVarRef *cons( const InputLoc &loc, ObjNameScope *scope, const String &name ) { - LangVarRef *l = new LangVarRef; - l->loc = loc; - l->qual = qual; - l->name = name; - return l; + return cons( loc, scope, new QualItemVect, name ); } void resolve( Compiler *pd ) const; @@ -2568,6 +2569,7 @@ struct LangVarRef VarRefLookup &lookup, CallArgVect *args ) const; InputLoc loc; + ObjNameScope *scope; QualItemVect *qual; String name; }; diff --git a/src/synthesis.cc b/src/synthesis.cc index da63d262..4b2f6c46 100644 --- a/src/synthesis.cc +++ b/src/synthesis.cc @@ -267,17 +267,6 @@ void ObjectDef::insertField( const String &name, ObjectField *value ) value->scope = scope; } -/* Recurisve find through a single object def's scope. */ -ObjectField *ObjectDef::findFieldInScope( const String &name, ObjNameScope *inScope ) -{ - ObjFieldMapEl *objDefMapEl = inScope->objFieldMap->find( name ); - if ( objDefMapEl != 0 ) - return objDefMapEl->value; - if ( inScope->parentScope != 0 ) - return findFieldInScope( name, inScope->parentScope ); - return 0; -} - ObjectField *ObjectDef::checkRedecl( const String &name ) { //cout << "looking for " << name << endl; @@ -300,15 +289,6 @@ ObjectField *ObjectDef::findFieldNum( long offset ) return field->value; } -ObjectField *ObjectDef::findField( const String &name ) -{ - //cout << "looking for " << name << endl; - ObjectField *objField = findFieldInScope( name, scope ); - if ( objField != 0 ) - return objField; - return 0; -} - ObjMethod *ObjectDef::findMethod( const String &name ) { ObjMethodMapEl *objMethodMapEl = objMethodMap->find( name ); @@ -2245,7 +2225,7 @@ void LangStmt::compileForIterBody( Compiler *pd, void LangStmt::chooseDefaultIter( Compiler *pd, LangIterCall *iterCall ) const { /* The iterator name. */ - LangVarRef *callVarRef = LangVarRef::cons( loc, "triter" ); + LangVarRef *callVarRef = LangVarRef::cons( loc, pd->curLocalFrame->scope, "triter" ); /* The parameters. */ CallArgVect *callExprVect = new CallArgVect; |