summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2015-01-11 12:54:56 -0500
committerAdrian Thurston <thurston@complang.org>2015-01-11 12:54:56 -0500
commit06946c9d62b62ce612d4cdf4eb9c65570cb81445 (patch)
tree46cc1415a01b317a3c5a46d80349c459f221754b /src
parenta5ad06e3fbbda39cbd894906e93a775c511f1f05 (diff)
downloadcolm-06946c9d62b62ce612d4cdf4eb9c65570cb81445.tar.gz
set the argv_el id when creating the structs
Diffstat (limited to 'src')
-rw-r--r--src/bytecode.c7
-rw-r--r--src/compiler.h2
-rw-r--r--src/declare.cc8
-rw-r--r--src/parser.cc8
-rw-r--r--src/pdabuild.cc1
-rw-r--r--src/pdacodegen.cc1
-rw-r--r--src/program.h1
7 files changed, 20 insertions, 8 deletions
diff --git a/src/bytecode.c b/src/bytecode.c
index 992754e4..c307d903 100644
--- a/src/bytecode.c
+++ b/src/bytecode.c
@@ -460,9 +460,10 @@ static List *construct_argv( Program *prg, int argc, const char **argv )
Tree *arg = constructString( prg, head );
treeUpref( arg );
- Struct *s = colm_struct_new_size( prg, 16 );
- colm_struct_set_field( s, Tree*, 0, arg );
- ListEl *listEl = colm_struct_get_addr( s, ListEl*, 1 );
+ Struct *strct = colm_struct_new_size( prg, 16 );
+ strct->id = prg->rtd->argvElId;
+ colm_struct_set_field( strct, Tree*, 0, arg );
+ ListEl *listEl = colm_struct_get_addr( strct, ListEl*, 1 );
colm_list_append( list, listEl );
}
diff --git a/src/compiler.h b/src/compiler.h
index a4ee828f..e346eb40 100644
--- a/src/compiler.h
+++ b/src/compiler.h
@@ -874,6 +874,8 @@ struct Compiler
ObjectDef *globalObjectDef;
ObjectField *arg0;
ObjectField *argv;
+ StructDef *argvEl;
+ StructEl *argvElSel;
StructDef *stream;
StructEl *streamSel;
diff --git a/src/declare.cc b/src/declare.cc
index f0850a6a..dcc4b467 100644
--- a/src/declare.cc
+++ b/src/declare.cc
@@ -343,8 +343,12 @@ void Namespace::declare( Compiler *pd )
}
}
- for ( StructDefList::Iter s = structDefList; s.lte(); s++ )
- declareStruct( pd, this, s->name, s );
+ for ( StructDefList::Iter s = structDefList; s.lte(); s++ ) {
+ StructEl *sel = declareStruct( pd, this, s->name, s );
+ if ( s == pd->argvEl )
+ pd->argvElSel = sel;
+
+ }
for ( TokenDefListNs::Iter tokenDef = tokenDefList; tokenDef.lte(); tokenDef++ ) {
/* Literals already taken care of. */
diff --git a/src/parser.cc b/src/parser.cc
index 9457dfe4..bd3f021e 100644
--- a/src/parser.cc
+++ b/src/parser.cc
@@ -61,6 +61,8 @@ void BaseParser::argvDecl()
ObjectField::StructFieldType, typeRef, name );
structVarDef( objField->loc, objField );
+ pd->argvEl = objField->context;
+
/* Now the list element. */
listElDef( "el" );
@@ -922,9 +924,9 @@ void BaseParser::structVarDef( const InputLoc &loc, ObjectField *objField )
if ( curStruct() == 0 )
error(loc) << "internal error: no context stack items found" << endp;
- StructDef *context = curStruct();
- objField->context = context;
- object = context->objectDef;
+ StructDef *structDef = curStruct();
+ objField->context = structDef;
+ object = structDef->objectDef;
if ( object->rootScope->checkRedecl( objField->name ) != 0 )
error(objField->loc) << "object field renamed" << endp;
diff --git a/src/pdabuild.cc b/src/pdabuild.cc
index 86691712..d030717c 100644
--- a/src/pdabuild.cc
+++ b/src/pdabuild.cc
@@ -1642,6 +1642,7 @@ void Compiler::makeRuntimeData()
runtimeData->eofId = 0; //eofLangEl->id;
runtimeData->noTokenId = noTokenLangEl->id;
runtimeData->globalId = globalSel->id;
+ runtimeData->argvElId = argvElSel->id;
runtimeData->fsmExecute = &internalFsmExecute;
runtimeData->sendNamedLangEl = &internalSendNamedLangEl;
diff --git a/src/pdacodegen.cc b/src/pdacodegen.cc
index a2fe0a4a..d84b01b5 100644
--- a/src/pdacodegen.cc
+++ b/src/pdacodegen.cc
@@ -480,6 +480,7 @@ void PdaCodeGen::writeRuntimeData( RuntimeData *runtimeData, PdaTables *pdaTable
" " << runtimeData->eofId << ",\n"
" " << runtimeData->noTokenId << ",\n"
" " << runtimeData->globalId << ",\n"
+ " " << runtimeData->argvElId << ",\n"
" &fsmExecute,\n"
" &sendNamedLangEl,\n"
" &initBindings,\n"
diff --git a/src/program.h b/src/program.h
index 0d915d42..293cf985 100644
--- a/src/program.h
+++ b/src/program.h
@@ -75,6 +75,7 @@ typedef struct colm_sections
long eofId;
long noTokenId;
long globalId;
+ long argvElId;
void (*fsmExecute)( struct _FsmRun *fsmRun, struct _StreamImpl *inputStream );
void (*sendNamedLangEl)( struct colm_program *prg, Tree **tree, struct _PdaRun *pdaRun,