summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2013-12-31 11:43:20 -0500
committerAdrian Thurston <thurston@complang.org>2013-12-31 11:43:20 -0500
commit415c21f86d1d0b7ff49932b4b61251870e7400fb (patch)
treeb2bb76e45525bf496084e78be1ae1d3e8d2133a1 /src
parentfc1d502d70df74114c8edff5c7ce808895f156f9 (diff)
downloadcolm-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.cc8
-rw-r--r--src/loadcolm.cc10
-rw-r--r--src/loadinit.cc9
-rw-r--r--src/lookup.cc20
-rw-r--r--src/parser.cc13
-rw-r--r--src/parsetree.h20
-rw-r--r--src/synthesis.cc22
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;