summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorschinz <schinz@epfl.ch>2003-07-25 14:27:34 +0000
committerschinz <schinz@epfl.ch>2003-07-25 14:27:34 +0000
commit63c9056e691a85c5228c3dc4bc77185c7c22d18e (patch)
tree01a3a780735f8b70284e1ec1bc482efbc9859e9a
parent4fdf2ee3ca88ae22997b7dc279d2143e22e80717 (diff)
downloadscala-63c9056e691a85c5228c3dc4bc77185c7c22d18e.tar.gz
scala-63c9056e691a85c5228c3dc4bc77185c7c22d18e.tar.bz2
scala-63c9056e691a85c5228c3dc4bc77185c7c22d18e.zip
- added line numbers to generated class files
-rw-r--r--sources/scalac/backend/jvm/GenJVM.java34
1 files changed, 33 insertions, 1 deletions
diff --git a/sources/scalac/backend/jvm/GenJVM.java b/sources/scalac/backend/jvm/GenJVM.java
index eebc1fec99..44079a6787 100644
--- a/sources/scalac/backend/jvm/GenJVM.java
+++ b/sources/scalac/backend/jvm/GenJVM.java
@@ -113,6 +113,8 @@ class GenJVM {
* afterwards).
*/
protected void gen(Context ctx, Tree tree) {
+ startCodeForTree(ctx, tree);
+
Symbol sym = tree.symbol();
switch (tree) {
@@ -199,6 +201,8 @@ class GenJVM {
default:
genLoad(ctx, tree, JType.VOID);
}
+
+ endCodeForTree(ctx, tree);
}
protected void gen(Context ctx, Tree[] trees) {
@@ -211,6 +215,8 @@ class GenJVM {
* stack, and make sure it is of the given expected type.
*/
protected JType genLoad(Context ctx, Tree tree, JType expectedType) {
+ startCodeForTree(ctx, tree);
+
JType generatedType = null;
Symbol sym = tree.symbol();
@@ -333,7 +339,8 @@ class GenJVM {
case AS_UVALUE :
assert args.length == 0;
gen(ctx, ((Tree.Select)fun).qualifier);
- return JType.VOID;
+ generatedType = JType.VOID;
+ break;
default:
throw Debug.abort("unknown primitive ", prim);
@@ -507,6 +514,7 @@ class GenJVM {
|| generatedType.isReferenceType()))
genWidenConversion(ctx, generatedType, expectedType);
+ endCodeForTree(ctx, tree);
return expectedType;
}
@@ -523,6 +531,7 @@ class GenJVM {
ctx.code.emitGETSTATIC(javaSymName,
MODULE_INSTANCE_FIELD_NAME,
type);
+
return type;
}
@@ -1357,6 +1366,29 @@ class GenJVM {
return maxType;
}
+ /// Line numbers
+ //////////////////////////////////////////////////////////////////////
+
+ int[] pcStack = new int[32];
+ int pcStackDepth = 0;
+ void startCodeForTree(Context ctx, Tree tree) {
+ if (pcStackDepth == pcStack.length) {
+ int[] newPCStack = new int[pcStack.length * 2];
+ System.arraycopy(pcStack, 0, newPCStack, 0, pcStack.length);
+ pcStack = newPCStack;
+ }
+ pcStack[pcStackDepth++] = (ctx.code == null ? 0 : ctx.code.getPC());
+ }
+
+ void endCodeForTree(Context ctx, Tree tree) {
+ assert pcStackDepth > 0;
+ int startPC = pcStack[--pcStackDepth];
+ if (ctx.code != null)
+ ctx.code.completeLineNumber(startPC,
+ ctx.code.getPC(),
+ Position.line(tree.pos));
+ }
+
/// Context
//////////////////////////////////////////////////////////////////////