Skip to content

Commit a2947f3

Browse files
author
vsilaev
committed
Better handling of synthetic accessors/bridges
1 parent fb412a6 commit a2947f3

File tree

3 files changed

+42
-24
lines changed

3 files changed

+42
-24
lines changed

net.tascalate.javaflow.providers.asm3/src/main/java/org/apache/commons/javaflow/providers/asm3/MaybeContinuableClassVisitor.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,9 @@ class MaybeContinuableClassVisitor extends ClassAdapter {
4040
private String outerClassMethodName;
4141
private String outerClassMethodDesc;
4242

43-
private
44-
final Map<String, String> normal2synthetic = new HashMap<String, String>();
43+
private final Map<String, String> actual2accessor = new HashMap<String, String>();
44+
private final Map<String, String> bridge2specialization = new HashMap<String, String>();
45+
4546
final Set<String> continuableMethods = new HashSet<String>();
4647

4748
private boolean isAnnotation = false;
@@ -90,10 +91,10 @@ public MethodVisitor visitMethod(int access, final String name, final String des
9091
public void visitMethodInsn(int opcode, String owner, String targetName, String targetDesc) {
9192
if (selfclass.equals(owner)) {
9293
if (isAccessor) {
93-
normal2synthetic.put(targetName + targetDesc, name + desc);
94-
} else {
95-
// Reversed for bridge
96-
normal2synthetic.put(name + desc, targetName + targetDesc);
94+
actual2accessor.put(targetName + targetDesc, name + desc);
95+
}
96+
if (isBridge) {
97+
bridge2specialization.put(name + desc, targetName + targetDesc);
9798
}
9899
}
99100
}
@@ -125,14 +126,19 @@ public void visitEnd() {
125126

126127
@Override
127128
public void visitEnd() {
129+
for (Map.Entry<String, String> n2s : actual2accessor.entrySet() ) {
130+
if (continuableMethods.contains(n2s.getKey())) {
131+
continuableMethods.add(n2s.getValue());
132+
}
133+
}
128134
visitInheritanceChain();
129135
checkOuterClass();
130136
// Check after inheritance -- required by bridged methods (specialization of inherited)
131-
for (Map.Entry<String, String> n2s : normal2synthetic.entrySet() ) {
137+
for (Map.Entry<String, String> n2s : bridge2specialization.entrySet() ) {
132138
if (continuableMethods.contains(n2s.getKey())) {
133139
continuableMethods.add(n2s.getValue());
134140
}
135-
}
141+
}
136142
}
137143

138144
private boolean inheritanceChainVisited = false;

net.tascalate.javaflow.providers.asm4/src/main/java/org/apache/commons/javaflow/providers/asm4/MaybeContinuableClassVisitor.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,9 @@ class MaybeContinuableClassVisitor extends ClassVisitor {
3838
private String outerClassMethodName;
3939
private String outerClassMethodDesc;
4040

41-
private
42-
final Map<String, String> normal2synthetic = new HashMap<String, String>();
41+
private final Map<String, String> actual2accessor = new HashMap<String, String>();
42+
private final Map<String, String> bridge2specialization = new HashMap<String, String>();
43+
4344
final Set<String> continuableMethods = new HashSet<String>();
4445

4546
private boolean isAnnotation = false;
@@ -88,10 +89,10 @@ public MethodVisitor visitMethod(int access, final String name, final String des
8889
public void visitMethodInsn(int opcode, String owner, String targetName, String targetDesc) {
8990
if (selfclass.equals(owner)) {
9091
if (isAccessor) {
91-
normal2synthetic.put(targetName + targetDesc, name + desc);
92-
} else {
93-
// Reversed for bridge
94-
normal2synthetic.put(name + desc, targetName + targetDesc);
92+
actual2accessor.put(targetName + targetDesc, name + desc);
93+
}
94+
if (isBridge) {
95+
bridge2specialization.put(name + desc, targetName + targetDesc);
9596
}
9697
}
9798
}
@@ -123,14 +124,19 @@ public void visitEnd() {
123124

124125
@Override
125126
public void visitEnd() {
127+
for (Map.Entry<String, String> n2s : actual2accessor.entrySet() ) {
128+
if (continuableMethods.contains(n2s.getKey())) {
129+
continuableMethods.add(n2s.getValue());
130+
}
131+
}
126132
visitInheritanceChain();
127133
checkOuterClass();
128134
// Check after inheritance -- required by bridged methods (specialization of inherited)
129-
for (Map.Entry<String, String> n2s : normal2synthetic.entrySet() ) {
135+
for (Map.Entry<String, String> n2s : bridge2specialization.entrySet() ) {
130136
if (continuableMethods.contains(n2s.getKey())) {
131137
continuableMethods.add(n2s.getValue());
132138
}
133-
}
139+
}
134140
}
135141

136142
private boolean inheritanceChainVisited = false;

net.tascalate.javaflow.providers.asm5/src/main/java/org/apache/commons/javaflow/providers/asm5/MaybeContinuableClassVisitor.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,11 @@ class MaybeContinuableClassVisitor extends ClassVisitor {
3737
private String outerClassName;
3838
private String outerClassMethodName;
3939
private String outerClassMethodDesc;
40-
private Map<String, String> normal2synthetic = new HashMap<String, String>();
4140

42-
private
43-
final Set<String> desugaredLambdaBodies = new HashSet<String>();
41+
private final Map<String, String> actual2accessor = new HashMap<String, String>();
42+
private final Map<String, String> bridge2specialization = new HashMap<String, String>();
43+
private final Set<String> desugaredLambdaBodies = new HashSet<String>();
44+
4445
final Set<String> continuableMethods = new HashSet<String>();
4546

4647
private boolean isAnnotation = false;
@@ -89,10 +90,10 @@ public MethodVisitor visitMethod(int access, String name, String desc, String si
8990
public void visitMethodInsn(int opcode, String owner, String targetName, String targetDesc, boolean intf) {
9091
if (selfclass.equals(owner)) {
9192
if (isAccessor) {
92-
normal2synthetic.put(targetName + targetDesc, name + desc);
93-
} else {
94-
// Reversed for bridge
95-
normal2synthetic.put(name + desc, targetName + targetDesc);
93+
actual2accessor.put(targetName + targetDesc, name + desc);
94+
}
95+
if (isBridge) {
96+
bridge2specialization.put(name + desc, targetName + targetDesc);
9697
}
9798
}
9899
}
@@ -135,10 +136,15 @@ public void visitEnd() {
135136

136137
@Override
137138
public void visitEnd() {
139+
for (Map.Entry<String, String> n2s : actual2accessor.entrySet() ) {
140+
if (continuableMethods.contains(n2s.getKey())) {
141+
continuableMethods.add(n2s.getValue());
142+
}
143+
}
138144
visitInheritanceChain();
139145
checkOuterClass();
140146
// Check after inheritance -- required by bridged methods (specialization of inherited)
141-
for (Map.Entry<String, String> n2s : normal2synthetic.entrySet() ) {
147+
for (Map.Entry<String, String> n2s : bridge2specialization.entrySet() ) {
142148
if (continuableMethods.contains(n2s.getKey())) {
143149
continuableMethods.add(n2s.getValue());
144150
}

0 commit comments

Comments
 (0)