diff options
author | Adrian Thurston <thurston@complang.org> | 2015-01-11 12:54:56 -0500 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2015-01-11 12:54:56 -0500 |
commit | 06946c9d62b62ce612d4cdf4eb9c65570cb81445 (patch) | |
tree | 46cc1415a01b317a3c5a46d80349c459f221754b /src | |
parent | a5ad06e3fbbda39cbd894906e93a775c511f1f05 (diff) | |
download | colm-06946c9d62b62ce612d4cdf4eb9c65570cb81445.tar.gz |
set the argv_el id when creating the structs
Diffstat (limited to 'src')
-rw-r--r-- | src/bytecode.c | 7 | ||||
-rw-r--r-- | src/compiler.h | 2 | ||||
-rw-r--r-- | src/declare.cc | 8 | ||||
-rw-r--r-- | src/parser.cc | 8 | ||||
-rw-r--r-- | src/pdabuild.cc | 1 | ||||
-rw-r--r-- | src/pdacodegen.cc | 1 | ||||
-rw-r--r-- | src/program.h | 1 |
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, |