eclipse-jdt / eclipse-jdt/eclipse.jdt.core
Redundant capture of enclosing instance for local classes
- Dominant language
- Java
- Stars
- 237
- Forks
- 195
- Avg merge
- 1d 12h
- Merged PRs (30d)
- 47
Description
Given: (snippet from `org.eclipse.jdt.core.tests.compiler.regression.MethodParametersAttributeTest.test015()`)
```
public class InnerLocalClassTest {
void test() {
class Local { }
new Local() { };
}
}
```
we emit the anonymous class constructor as follows:
```
InnerLocalClassTest$1(InnerLocalClassTest this$0, InnerLocalClassTest this$1);
0 aload_0 [this]
1 aload_2 [this$1]
2 putfield InnerLocalClassTest$1.this$0 : InnerLocalClassTest [10]
5 aload_0 [this]
6 aload_1 [this$0]
7 invokespecial InnerLocalClassTest$1Local(InnerLocalClassTest) [12]
10 return
Line numbers:
[pc: 0, line: 4]
Method Parameters:
final synthetic this$0
final synthetic this$1;
```
This is wasteful.
Javac emits:
```
{
InnerLocalClassTest$1(InnerLocalClassTest);
descriptor: (LInnerLocalClassTest;)V
flags: (0x0000)
Code:
stack=2, locals=2, args_size=2
0: aload_1
1: dup
2: invokestatic #1 // Method java/util/Objects.requireNonNull:(Ljava/lang/Object;)Ljava/lang/Object;
5: pop
6: pop
7: aload_0
8: aload_1
9: invokespecial #7 // Method InnerLocalClassTest$1Local."":(LInnerLocalClassTest;)V
12: return
LineNumberTable:
line 4: 0
LocalVariableTable:
Start Length Slot Name Signature
0 13 0 this LInnerLocalClassTest$1;
0 13 1 this$0 LInnerLocalClassTest;
MethodParameters:
Name Flags
final mandated
}
```
Contributor guide
Assessment
This issue has not been assessed yet.