Bug: no line number for invokedynamic
B. Blaser
bsrbnd at gmail.com
Fri Feb 16 11:43:58 UTC 2018
On 15 February 2018 at 18:19, Vicente Romero <vicente.romero at oracle.com> wrote:
>
>
> On 02/14/2018 05:24 PM, B. Blaser wrote:
>>
>> This is also somewhat related to JDK-8019486 associated test which
>> should probably be updated as next if we want to re-enable this
>> feature to have a clean stack trace.
>
>
> right if we were introduce any change in this area the test below would
> start failing
I tried some stepping with 'jdb' on the examples present in this test
case with the patch I suggested two days ago:
- if (!msym.isDynamic()) {
+// if (!msym.isDynamic()) {
code.statBegin(tree.pos);
- }
+// }
It appeared to me smooth enough and the stack trace for the initial
example is right (line 7 instead of 6).
Are we going in this direction? Is there any open JBS issue for that?
Bernard
>
>>
>> Cheers,
>> Bernard
>
>
> Vicente
>
>
>>
>>
>> diff -r b3a833c9c6e9
>> test/langtools/tools/javac/T8019486/WrongLNTForLambdaTest.java
>> --- a/test/langtools/tools/javac/T8019486/WrongLNTForLambdaTest.java
>> Mon Feb 12 09:12:41 2018 +0100
>> +++ b/test/langtools/tools/javac/T8019486/WrongLNTForLambdaTest.java
>> Wed Feb 14 22:56:43 2018 +0100
>> @@ -107,6 +107,8 @@
>> static final int[][] deserializeExpectedLNT = {
>> // {line-number, start-pc},
>> {05, 0}, //number -> number / 1
>> + {21, 137}, //number -> number / 1
>> + {05, 142}, //number -> number / 1
>> };
>>
>> static final int[][] lambdaBridgeExpectedLNT = {
>> @@ -123,6 +125,8 @@
>> static final int[][] callExpectedLNT = {
>> // {line-number, start-pc},
>> {29, 0}, //number -> number / 1
>> + {30, 2}, //number -> number / 1
>> + {29, 7}, //number -> number / 1
>> {31, 10}, //number -> number / 1
>> };
>>
>>
>> On 14 February 2018 at 21:47, Maurizio Cimadamore
>> <maurizio.cimadamore at oracle.com> wrote:
>>>
>>> This comes from here:
>>>
>>> https://bugs.openjdk.java.net/browse/JDK-8010404
>>>
>>> Back when developing JDK 8 - we had a feeling that having the debugger
>>> stop
>>> at lambda capture sites would be confusing - and so we disabled it.
>>>
>>> I agree that in the stack trace case this decision seems to backfire a
>>> bit.
>>>
>>> Maurizio
>>>
>>>
>>>
>>> On 14/02/18 15:26, B. Blaser wrote:
>>>>
>>>> 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