Bug: no line number for invokedynamic
B. Blaser
bsrbnd at gmail.com
Wed Feb 14 15:26:46 UTC 2018
The line number is deliberately not emitted for dynamic callsites (but
I don't know why?), see below.
I hope this helps,
Bernard
diff -r b3a833c9c6e9
src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/Gen.java
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/Gen.java
Mon Feb 12 09:12:41 2018 +0100
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/Gen.java
Wed Feb 14 16:14:17 2018 +0100
@@ -1649,9 +1649,9 @@
MethodSymbol msym = (MethodSymbol)TreeInfo.symbol(tree.meth);
genArgs(tree.args,
msym.externalType(types).getParameterTypes());
- if (!msym.isDynamic()) {
+// if (!msym.isDynamic()) {
code.statBegin(tree.pos);
- }
+// }
result = m.invoke();
}
On 14 February 2018 at 09:16, Vladimir Parfinenko
<vparfinenko at excelsior-usa.com> wrote:
> Hi all,
>
> I think I have found a minor bug. There is no line number information
> for invokedynamic instructions generated for method handle or lambda
> function.
>
> The problem can be reproduced using the example below and running it
> like this:
>
> $ javac Test.java
> $ rm A.class
> $ java Test
> Exception in thread "main" java.lang.NoClassDefFoundError: A
> at Test.main(Test.java:6)
> Caused by: java.lang.ClassNotFoundException: A
> ...
>
> The correct line number for this stack trace element would be 7.
>
> The line number table is missing an entry for invokedynamic:
>
> Code:
> stack=2, locals=2, args_size=1
> 0: invokestatic #2 // Method fortyTwo:()I
> 3: invokedynamic #3, 0 // InvokeDynamic
> #0:apply:()Ljava/util/function/Function;
> 8: invokestatic #4 // Method
> foo:(ILjava/util/function/Function;)Ljava/lang/Object;
> 11: astore_1
> 12: return
> LineNumberTable:
> line 6: 0
> line 5: 8
> line 9: 12
>
>
> Regards,
> Vladimir Parfinenko
>
>
>
> -- Test.java
>
> // line 1
> public class Test {
> public static void main(String[] args) {
> Object res =
> foo(
> fortyTwo(), // line 6
> A::sqr // line 7
> );
> }
>
> public static Object foo(int x, java.util.function.Function<Integer,
> Integer> f) {
> return null;
> }
>
> public static int fortyTwo() {
> return 42;
> }
> }
>
> class A {
> public static int sqr(int x) {
> return x * x;
> }
> }
>
>
More information about the compiler-dev
mailing list