diff options
author | Adrian Thurston <thurston@complang.org> | 2013-12-22 15:20:37 -0500 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2013-12-22 15:20:37 -0500 |
commit | 579e3b956f02915b67b4ad36d2beba764a61ddd7 (patch) | |
tree | 32f38f5cd6b9c2aec7a7ffb1f14293a3a2ae52b1 | |
parent | c4d8e657810167b3a76e03ce1306f3948da9228f (diff) | |
download | colm-579e3b956f02915b67b4ad36d2beba764a61ddd7.tar.gz |
include the LocalInfo array in FrameInfo
-rw-r--r-- | src/parsedata.h | 2 | ||||
-rw-r--r-- | src/pdabuild.cc | 28 | ||||
-rw-r--r-- | src/pdacodegen.cc | 24 | ||||
-rw-r--r-- | src/pdarun.h | 8 |
4 files changed, 61 insertions, 1 deletions
diff --git a/src/parsedata.h b/src/parsedata.h index 6ac380e2..401b3fc8 100644 --- a/src/parsedata.h +++ b/src/parsedata.h @@ -817,6 +817,8 @@ struct Compiler void generateExports(); void generateExportsImpl(); + LocalInfo *makeLocalInfo( Locals &locals ); + /* * Graphviz Generation */ diff --git a/src/pdabuild.cc b/src/pdabuild.cc index bceba299..0443ff82 100644 --- a/src/pdabuild.cc +++ b/src/pdabuild.cc @@ -1270,6 +1270,18 @@ void Compiler::insertUniqueEmptyProductions() } } +LocalInfo *Compiler::makeLocalInfo( Locals &locals ) +{ + LocalInfo *localInfo = new LocalInfo[locals.locals.length()]; + memset( localInfo, 0, sizeof(LocalInfo) * locals.locals.length() ); + + for ( Vector<LocalLoc>::Iter l = locals.locals; l.lte(); l++ ) { + localInfo[l.pos()].type = (int) l->type; + localInfo[l.pos()].offset = l->offset; + } + return localInfo; +} + void Compiler::makeRuntimeData() { long count = 0; @@ -1309,6 +1321,9 @@ void Compiler::makeRuntimeData() runtimeData->frameInfo[rootCodeBlock->frameId].iters = rootCodeBlock->iters.data(); runtimeData->frameInfo[rootCodeBlock->frameId].itersLen = rootCodeBlock->iters.length(); + runtimeData->frameInfo[rootCodeBlock->frameId].locals = makeLocalInfo( rootCodeBlock->locals ); + runtimeData->frameInfo[rootCodeBlock->frameId].localsLen = rootCodeBlock->locals.locals.length(); + runtimeData->frameInfo[rootCodeBlock->frameId].frameSize = rootLocalFrame->size(); runtimeData->frameInfo[rootCodeBlock->frameId].argSize = 0; @@ -1339,6 +1354,9 @@ void Compiler::makeRuntimeData() runtimeData->frameInfo[block->frameId].iters = block->iters.data(); runtimeData->frameInfo[block->frameId].itersLen = block->iters.length(); + runtimeData->frameInfo[block->frameId].locals = makeLocalInfo( block->locals ); + runtimeData->frameInfo[block->frameId].localsLen = block->locals.locals.length(); + runtimeData->frameInfo[block->frameId].frameSize = block->localFrame->size(); runtimeData->frameInfo[block->frameId].argSize = 0; } @@ -1381,6 +1399,9 @@ void Compiler::makeRuntimeData() runtimeData->frameInfo[block->frameId].iters = block->iters.data(); runtimeData->frameInfo[block->frameId].itersLen = block->iters.length(); + runtimeData->frameInfo[block->frameId].locals = makeLocalInfo( block->locals ); + runtimeData->frameInfo[block->frameId].localsLen = block->locals.locals.length(); + runtimeData->frameInfo[block->frameId].frameSize = block->localFrame->size(); runtimeData->frameInfo[block->frameId].argSize = 0; } @@ -1418,10 +1439,12 @@ void Compiler::makeRuntimeData() runtimeData->frameInfo[block->frameId].iters = block->iters.data(); runtimeData->frameInfo[block->frameId].itersLen = block->iters.length(); + runtimeData->frameInfo[block->frameId].locals = makeLocalInfo( block->locals ); + runtimeData->frameInfo[block->frameId].localsLen = block->locals.locals.length(); + runtimeData->frameInfo[block->frameId].frameSize = block->localFrame->size(); runtimeData->frameInfo[block->frameId].argSize = 0; } - runtimeData->lelInfo[i].objectTypeId = lel->objectDef == 0 ? 0 : lel->objectDef->id; @@ -1486,6 +1509,9 @@ void Compiler::makeRuntimeData() runtimeData->frameInfo[block->frameId].iters = block->iters.data(); runtimeData->frameInfo[block->frameId].itersLen = block->iters.length(); + runtimeData->frameInfo[block->frameId].locals = makeLocalInfo( block->locals ); + runtimeData->frameInfo[block->frameId].localsLen = block->locals.locals.length(); + runtimeData->frameInfo[block->frameId].frameSize = func->localFrame->size(); runtimeData->frameInfo[block->frameId].argSize = func->paramListSize; } diff --git a/src/pdacodegen.cc b/src/pdacodegen.cc index 8ce95216..bd8fa0a1 100644 --- a/src/pdacodegen.cc +++ b/src/pdacodegen.cc @@ -140,6 +140,22 @@ void PdaCodeGen::writeRuntimeData( RuntimeData *runtimeData, PdaTables *pdaTable } out << "\n};\n\n"; } + + if ( runtimeData->frameInfo[i].localsLen > 0 ) { + out << "static LocalInfo locals_" << i << "[] = {\n\t"; + + LocalInfo *li = runtimeData->frameInfo[i].locals; + for ( int j = 0; j < runtimeData->frameInfo[i].localsLen; j++ ) { + out << "{ " << (int)li[j].type << ", " << li[j].offset << " }"; + + if ( j < runtimeData->frameInfo[i].localsLen-1 ) { + out << ", "; + if ( (j+1) % 8 == 0 ) + out << "\n\t"; + } + } + out << "\n};\n\n"; + } } /* @@ -265,6 +281,14 @@ void PdaCodeGen::writeRuntimeData( RuntimeData *runtimeData, PdaTables *pdaTable out << runtimeData->frameInfo[i].itersLen << ", "; + /* locals. */ + if ( runtimeData->frameInfo[i].localsLen > 0 ) + out << "locals_" << i << ", "; + else + out << "0, "; + + out << runtimeData->frameInfo[i].localsLen << ", "; + out << runtimeData->frameInfo[i].argSize << ", " << runtimeData->frameInfo[i].frameSize; diff --git a/src/pdarun.h b/src/pdarun.h index ca20b6f3..11d36fc3 100644 --- a/src/pdarun.h +++ b/src/pdarun.h @@ -199,6 +199,12 @@ typedef struct _ProdInfo long copyLen; } ProdInfo; +typedef struct _LocalInfo +{ + char type; + short offset; +} LocalInfo; + typedef struct _FrameInfo { Code *codeWV; @@ -209,6 +215,8 @@ typedef struct _FrameInfo long treesLen; char *iters; long itersLen; + LocalInfo *locals; + long localsLen; long argSize; long frameSize; } FrameInfo; |