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 200897584a..a239dcba0c 100644 --- a/vm/ByteCodeTranslator/src/com/codename1/tools/translator/bytecodes/CustomInvoke.java +++ b/vm/ByteCodeTranslator/src/com/codename1/tools/translator/bytecodes/CustomInvoke.java @@ -159,6 +159,7 @@ public boolean appendExpression(StringBuilder b) { } StringBuilder bld = new StringBuilder(); + boolean isVirtualCall = false; if(origOpcode == Opcodes.INVOKEINTERFACE || origOpcode == Opcodes.INVOKEVIRTUAL) { b.append(" "); @@ -179,6 +180,7 @@ public boolean appendExpression(StringBuilder b) { } if (isVirtual) { bld.append("virtual_"); + isVirtualCall = true; } } else { b.append(" "); @@ -207,6 +209,9 @@ public boolean appendExpression(StringBuilder b) { bld.append("__"); ArrayList args = new ArrayList(); String returnVal = BytecodeMethod.appendMethodSignatureSuffixFromDesc(desc, bld, args); + if (isVirtualCall) { + BytecodeMethod.addVirtualMethodsInvoked(bld.substring("virtual_".length())); + } int numLiteralArgs = this.getNumLiteralArgs(); if (numLiteralArgs > 0) { b.append("/* CustomInvoke */"); 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 0d0c9d6c65..1f88c03d66 100644 --- a/vm/ByteCodeTranslator/src/com/codename1/tools/translator/bytecodes/Invoke.java +++ b/vm/ByteCodeTranslator/src/com/codename1/tools/translator/bytecodes/Invoke.java @@ -142,9 +142,10 @@ public void appendInstruction(StringBuilder b) { } StringBuilder bld = new StringBuilder(); + boolean isVirtualCall = false; if(opcode == Opcodes.INVOKEINTERFACE || opcode == Opcodes.INVOKEVIRTUAL) { b.append(" "); - + // Well, it is actually legal to call private methods with invoke virtual, and kotlin // generates such calls. But ParparVM strips out these virtual method definitions // so we need to check if the method is private, and remove the virtual invocation @@ -162,6 +163,7 @@ public void appendInstruction(StringBuilder b) { } if (isVirtual) { bld.append("virtual_"); + isVirtualCall = true; } } else { b.append(" "); @@ -195,6 +197,9 @@ public void appendInstruction(StringBuilder b) { bld.append("__"); ArrayList args = new ArrayList(); String returnVal = BytecodeMethod.appendMethodSignatureSuffixFromDesc(desc, bld, args); + if (isVirtualCall) { + BytecodeMethod.addVirtualMethodsInvoked(bld.substring("virtual_".length())); + } boolean noPop = false; if(returnVal == null) { b.append(bld);