summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/parsedata.h2
-rw-r--r--src/pdabuild.cc28
-rw-r--r--src/pdacodegen.cc24
-rw-r--r--src/pdarun.h8
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;