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