Skip to content

Commit c18a383

Browse files
authored
Fix concrete invoke dependency resolution when method context is null (#4750)
* Fix concrete invoke dependency resolution when method context is unavailable * Fix concrete invoke resolution regression without method context
1 parent d9ae900 commit c18a383

2 files changed

Lines changed: 19 additions & 13 deletions

File tree

vm/ByteCodeTranslator/src/com/codename1/tools/translator/bytecodes/CustomInvoke.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ public void addDependencies(List<String> dependencyList) {
9494
String dependencyOwner = owner;
9595
if (origOpcode == Opcodes.INVOKEVIRTUAL) {
9696
ByteCodeClass bc = Parser.getClassObject(owner.replace('/', '_').replace('$', '_'));
97-
String resolvedConcreteOwner = resolveConcreteInvokeOwner(bc);
97+
String resolvedConcreteOwner = resolveConcreteInvokeOwner(bc, true);
9898
if (resolvedConcreteOwner != null) {
9999
dependencyOwner = resolvedConcreteOwner;
100100
}
@@ -150,13 +150,16 @@ private String findActualOwner(ByteCodeClass bc) {
150150
return findActualOwner(bc.getBaseClassObject());
151151
}
152152

153-
private String resolveConcreteInvokeOwner(ByteCodeClass ownerClass) {
154-
if (ownerClass == null || ownerClass.getConcreteClass() == null || getMethod() == null) {
153+
private String resolveConcreteInvokeOwner(ByteCodeClass ownerClass, boolean allowMissingMethodContext) {
154+
if (ownerClass == null || ownerClass.getConcreteClass() == null) {
155+
return null;
156+
}
157+
String currentClass = getMethod() != null ? getMethod().getClsName() : null;
158+
if (currentClass == null && !allowMissingMethodContext) {
155159
return null;
156160
}
157-
String currentClass = getMethod().getClsName();
158161
String ownerName = ownerClass.getClsName();
159-
if (ownerName.equals(currentClass) || currentClass.startsWith(ownerName + "_")) {
162+
if (currentClass != null && (ownerName.equals(currentClass) || currentClass.startsWith(ownerName + "_"))) {
160163
return null;
161164
}
162165
ByteCodeClass concreteClass = Parser.getClassObject(ownerClass.getConcreteClass().replace('/', '_').replace('$', '_'));
@@ -209,7 +212,7 @@ public boolean appendExpression(StringBuilder b) {
209212
if (bc.isMethodPrivate(name, desc)) {
210213
isVirtual = false;
211214
} else {
212-
String resolvedConcreteOwner = resolveConcreteInvokeOwner(bc);
215+
String resolvedConcreteOwner = resolveConcreteInvokeOwner(bc, false);
213216
if (resolvedConcreteOwner != null) {
214217
invokeOwner = resolvedConcreteOwner;
215218
isVirtual = false;
@@ -320,7 +323,7 @@ public void appendInstruction(StringBuilder b) {
320323
if (bc.isMethodPrivate(name, desc)) {
321324
isVirtual = false;
322325
} else {
323-
String resolvedConcreteOwner = resolveConcreteInvokeOwner(bc);
326+
String resolvedConcreteOwner = resolveConcreteInvokeOwner(bc, false);
324327
if (resolvedConcreteOwner != null) {
325328
invokeOwner = resolvedConcreteOwner;
326329
isVirtual = false;

vm/ByteCodeTranslator/src/com/codename1/tools/translator/bytecodes/Invoke.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public void addDependencies(List<String> dependencyList) {
9292
String dependencyOwner = owner;
9393
if (opcode == Opcodes.INVOKEVIRTUAL) {
9494
ByteCodeClass bc = Parser.getClassObject(owner.replace('/', '_').replace('$', '_'));
95-
String resolvedConcreteOwner = resolveConcreteInvokeOwner(bc);
95+
String resolvedConcreteOwner = resolveConcreteInvokeOwner(bc, true);
9696
if (resolvedConcreteOwner != null) {
9797
dependencyOwner = resolvedConcreteOwner;
9898
}
@@ -148,13 +148,16 @@ private String findActualOwner(ByteCodeClass bc) {
148148
return findActualOwner(bc.getBaseClassObject());
149149
}
150150

151-
private String resolveConcreteInvokeOwner(ByteCodeClass ownerClass) {
152-
if (ownerClass == null || ownerClass.getConcreteClass() == null || getMethod() == null) {
151+
private String resolveConcreteInvokeOwner(ByteCodeClass ownerClass, boolean allowMissingMethodContext) {
152+
if (ownerClass == null || ownerClass.getConcreteClass() == null) {
153+
return null;
154+
}
155+
String currentClass = getMethod() != null ? getMethod().getClsName() : null;
156+
if (currentClass == null && !allowMissingMethodContext) {
153157
return null;
154158
}
155-
String currentClass = getMethod().getClsName();
156159
String ownerName = ownerClass.getClsName();
157-
if (ownerName.equals(currentClass) || currentClass.startsWith(ownerName + "_")) {
160+
if (currentClass != null && (ownerName.equals(currentClass) || currentClass.startsWith(ownerName + "_"))) {
158161
return null;
159162
}
160163
ByteCodeClass concreteClass = Parser.getClassObject(ownerClass.getConcreteClass().replace('/', '_').replace('$', '_'));
@@ -194,7 +197,7 @@ public void appendInstruction(StringBuilder b) {
194197
if (bc.isMethodPrivate(name, desc)) {
195198
isVirtual = false;
196199
} else {
197-
String resolvedConcreteOwner = resolveConcreteInvokeOwner(bc);
200+
String resolvedConcreteOwner = resolveConcreteInvokeOwner(bc, false);
198201
if (resolvedConcreteOwner != null) {
199202
invokeOwner = resolvedConcreteOwner;
200203
isVirtual = false;

0 commit comments

Comments
 (0)