diff options
author | schinz <schinz@epfl.ch> | 2003-07-25 14:27:34 +0000 |
---|---|---|
committer | schinz <schinz@epfl.ch> | 2003-07-25 14:27:34 +0000 |
commit | 63c9056e691a85c5228c3dc4bc77185c7c22d18e (patch) | |
tree | 01a3a780735f8b70284e1ec1bc482efbc9859e9a /sources/scalac/backend | |
parent | 4fdf2ee3ca88ae22997b7dc279d2143e22e80717 (diff) | |
download | scala-63c9056e691a85c5228c3dc4bc77185c7c22d18e.tar.gz scala-63c9056e691a85c5228c3dc4bc77185c7c22d18e.tar.bz2 scala-63c9056e691a85c5228c3dc4bc77185c7c22d18e.zip |
- added line numbers to generated class files
Diffstat (limited to 'sources/scalac/backend')
-rw-r--r-- | sources/scalac/backend/jvm/GenJVM.java | 34 |
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 ////////////////////////////////////////////////////////////////////// |