diff --git a/vm/ByteCodeTranslator/src/com/codename1/tools/translator/bytecodes/CustomInvoke.java b/vm/ByteCodeTranslator/src/com/codename1/tools/translator/bytecodes/CustomInvoke.java index 2f3f74d296..39c95edb08 100644 --- a/vm/ByteCodeTranslator/src/com/codename1/tools/translator/bytecodes/CustomInvoke.java +++ b/vm/ByteCodeTranslator/src/com/codename1/tools/translator/bytecodes/CustomInvoke.java @@ -94,7 +94,7 @@ public void addDependencies(List dependencyList) { String dependencyOwner = owner; if (origOpcode == Opcodes.INVOKEVIRTUAL) { ByteCodeClass bc = Parser.getClassObject(owner.replace('/', '_').replace('$', '_')); - String resolvedConcreteOwner = resolveConcreteInvokeOwner(bc); + String resolvedConcreteOwner = resolveConcreteInvokeOwner(bc, true); if (resolvedConcreteOwner != null) { dependencyOwner = resolvedConcreteOwner; } @@ -150,13 +150,16 @@ private String findActualOwner(ByteCodeClass bc) { return findActualOwner(bc.getBaseClassObject()); } - private String resolveConcreteInvokeOwner(ByteCodeClass ownerClass) { - if (ownerClass == null || ownerClass.getConcreteClass() == null || getMethod() == null) { + private String resolveConcreteInvokeOwner(ByteCodeClass ownerClass, boolean allowMissingMethodContext) { + if (ownerClass == null || ownerClass.getConcreteClass() == null) { + return null; + } + String currentClass = getMethod() != null ? getMethod().getClsName() : null; + if (currentClass == null && !allowMissingMethodContext) { return null; } - String currentClass = getMethod().getClsName(); String ownerName = ownerClass.getClsName(); - if (ownerName.equals(currentClass) || currentClass.startsWith(ownerName + "_")) { + if (currentClass != null && (ownerName.equals(currentClass) || currentClass.startsWith(ownerName + "_"))) { return null; } ByteCodeClass concreteClass = Parser.getClassObject(ownerClass.getConcreteClass().replace('/', '_').replace('$', '_')); @@ -209,7 +212,7 @@ public boolean appendExpression(StringBuilder b) { if (bc.isMethodPrivate(name, desc)) { isVirtual = false; } else { - String resolvedConcreteOwner = resolveConcreteInvokeOwner(bc); + String resolvedConcreteOwner = resolveConcreteInvokeOwner(bc, false); if (resolvedConcreteOwner != null) { invokeOwner = resolvedConcreteOwner; isVirtual = false; @@ -320,7 +323,7 @@ public void appendInstruction(StringBuilder b) { if (bc.isMethodPrivate(name, desc)) { isVirtual = false; } else { - String resolvedConcreteOwner = resolveConcreteInvokeOwner(bc); + String resolvedConcreteOwner = resolveConcreteInvokeOwner(bc, false); if (resolvedConcreteOwner != null) { invokeOwner = resolvedConcreteOwner; isVirtual = false; diff --git a/vm/ByteCodeTranslator/src/com/codename1/tools/translator/bytecodes/Invoke.java b/vm/ByteCodeTranslator/src/com/codename1/tools/translator/bytecodes/Invoke.java index d3d8dcf251..3309a7cc4b 100644 --- a/vm/ByteCodeTranslator/src/com/codename1/tools/translator/bytecodes/Invoke.java +++ b/vm/ByteCodeTranslator/src/com/codename1/tools/translator/bytecodes/Invoke.java @@ -92,7 +92,7 @@ public void addDependencies(List dependencyList) { String dependencyOwner = owner; if (opcode == Opcodes.INVOKEVIRTUAL) { ByteCodeClass bc = Parser.getClassObject(owner.replace('/', '_').replace('$', '_')); - String resolvedConcreteOwner = resolveConcreteInvokeOwner(bc); + String resolvedConcreteOwner = resolveConcreteInvokeOwner(bc, true); if (resolvedConcreteOwner != null) { dependencyOwner = resolvedConcreteOwner; } @@ -148,13 +148,16 @@ private String findActualOwner(ByteCodeClass bc) { return findActualOwner(bc.getBaseClassObject()); } - private String resolveConcreteInvokeOwner(ByteCodeClass ownerClass) { - if (ownerClass == null || ownerClass.getConcreteClass() == null || getMethod() == null) { + private String resolveConcreteInvokeOwner(ByteCodeClass ownerClass, boolean allowMissingMethodContext) { + if (ownerClass == null || ownerClass.getConcreteClass() == null) { + return null; + } + String currentClass = getMethod() != null ? getMethod().getClsName() : null; + if (currentClass == null && !allowMissingMethodContext) { return null; } - String currentClass = getMethod().getClsName(); String ownerName = ownerClass.getClsName(); - if (ownerName.equals(currentClass) || currentClass.startsWith(ownerName + "_")) { + if (currentClass != null && (ownerName.equals(currentClass) || currentClass.startsWith(ownerName + "_"))) { return null; } ByteCodeClass concreteClass = Parser.getClassObject(ownerClass.getConcreteClass().replace('/', '_').replace('$', '_')); @@ -194,7 +197,7 @@ public void appendInstruction(StringBuilder b) { if (bc.isMethodPrivate(name, desc)) { isVirtual = false; } else { - String resolvedConcreteOwner = resolveConcreteInvokeOwner(bc); + String resolvedConcreteOwner = resolveConcreteInvokeOwner(bc, false); if (resolvedConcreteOwner != null) { invokeOwner = resolvedConcreteOwner; isVirtual = false;