diff --git a/plugins/kotlin/src/main/java/org/vineflower/kotlin/KotlinChooser.java b/plugins/kotlin/src/main/java/org/vineflower/kotlin/KotlinChooser.java index e521e2a4b9..ae7c96bea8 100644 --- a/plugins/kotlin/src/main/java/org/vineflower/kotlin/KotlinChooser.java +++ b/plugins/kotlin/src/main/java/org/vineflower/kotlin/KotlinChooser.java @@ -72,12 +72,29 @@ public static void setContextVariables(StructClass cl) { try { int kIndex = anno.getParNames().indexOf("k"); - int k = (int) ((ConstExprent) anno.getParValues().get(kIndex)).getValue(); - int d1Index = anno.getParNames().indexOf("d1"); - Exprent d1 = anno.getParValues().get(d1Index); - int d2Index = anno.getParNames().indexOf("d2"); + + if (kIndex == -1) { + DecompilerContext.getLogger().writeMessage("No k attribute in class metadata for class " + cl.qualifiedName, IFernflowerLogger.Severity.WARN); + DecompilerContext.setProperty(KotlinDecompilationContext.CURRENT_TYPE, null); + return; + } + + if (d1Index == -1) { + DecompilerContext.getLogger().writeMessage("No d1 attribute in class metadata for class " + cl.qualifiedName, IFernflowerLogger.Severity.WARN); + DecompilerContext.setProperty(KotlinDecompilationContext.CURRENT_TYPE, null); + return; + } + + if (d2Index == -1) { + DecompilerContext.getLogger().writeMessage("No d2 attribute in class metadata for class " + cl.qualifiedName, IFernflowerLogger.Severity.WARN); + DecompilerContext.setProperty(KotlinDecompilationContext.CURRENT_TYPE, null); + return; + } + + int k = (int) ((ConstExprent) anno.getParValues().get(kIndex)).getValue(); + Exprent d1 = anno.getParValues().get(d1Index); Exprent d2 = anno.getParValues().get(d2Index); String[] data1 = getDataFromExpr((NewExprent) d1); diff --git a/plugins/kotlin/src/main/java/org/vineflower/kotlin/KotlinWriter.java b/plugins/kotlin/src/main/java/org/vineflower/kotlin/KotlinWriter.java index 61dad6f0fc..9b735d474c 100644 --- a/plugins/kotlin/src/main/java/org/vineflower/kotlin/KotlinWriter.java +++ b/plugins/kotlin/src/main/java/org/vineflower/kotlin/KotlinWriter.java @@ -1553,7 +1553,7 @@ public static void appendJvmAnnotations(TextBuffer buffer, int indent, StructMem buffer.append(",").appendPossibleNewline(" "); } first = false; - String name = attrib.getExcClassname(i, pool); + String name = pool.getPrimitiveConstant(i).getString(); buffer.append(name).append("::class"); } buffer.popNewlineGroup(); diff --git a/plugins/kotlin/src/main/java/org/vineflower/kotlin/expr/KConstExprent.java b/plugins/kotlin/src/main/java/org/vineflower/kotlin/expr/KConstExprent.java index 490ff2be0f..42d38585ac 100644 --- a/plugins/kotlin/src/main/java/org/vineflower/kotlin/expr/KConstExprent.java +++ b/plugins/kotlin/src/main/java/org/vineflower/kotlin/expr/KConstExprent.java @@ -18,6 +18,12 @@ public TextBuffer toJava(int indent) { TextBuffer buf = new TextBuffer(); buf.addBytecodeMapping(bytecode); + + if (getValue() == null) { + //TODO figure out why this happens here instead of elsewhere + return buf.append("Class<*>"); + } + String value = getValue().toString(); VarType type = new VarType(value, !value.startsWith("[")); buf.appendCastTypeName(type).append("::class.java"); diff --git a/plugins/kotlin/src/main/java/org/vineflower/kotlin/expr/KFunctionExprent.java b/plugins/kotlin/src/main/java/org/vineflower/kotlin/expr/KFunctionExprent.java index 0aa6baad6a..b6f8553d6e 100644 --- a/plugins/kotlin/src/main/java/org/vineflower/kotlin/expr/KFunctionExprent.java +++ b/plugins/kotlin/src/main/java/org/vineflower/kotlin/expr/KFunctionExprent.java @@ -1,11 +1,6 @@ package org.vineflower.kotlin.expr; -import org.jetbrains.java.decompiler.code.CodeConstants; -import org.jetbrains.java.decompiler.main.plugins.PluginImplementationException; -import org.jetbrains.java.decompiler.modules.decompiler.exps.ConstExprent; -import org.jetbrains.java.decompiler.modules.decompiler.exps.Exprent; -import org.jetbrains.java.decompiler.modules.decompiler.exps.FieldExprent; -import org.jetbrains.java.decompiler.modules.decompiler.exps.FunctionExprent; +import org.jetbrains.java.decompiler.modules.decompiler.exps.*; import org.jetbrains.java.decompiler.modules.decompiler.vars.CheckTypesResult; import org.jetbrains.java.decompiler.struct.gen.CodeType; import org.jetbrains.java.decompiler.struct.gen.TypeFamily; @@ -41,15 +36,14 @@ public KFunctionExprent(FunctionType funcType, List operands, BitSet by } public KFunctionExprent(FunctionExprent func) { - super(func.getFuncType(), new ArrayList<>(KUtils.replaceExprents(func.getLstOperands())), func.bytecode); + this(func, KFunctionType.NONE, func.getExprType()); + } - if (func instanceof KFunctionExprent) { - KFunctionExprent kFunc = (KFunctionExprent) func; - this.kType = kFunc.kType; - } else { - setImplicitType(func.getExprType()); - } + private KFunctionExprent(FunctionExprent func, KFunctionType kType, VarType exprType) { + super(func.getFuncType(), new ArrayList<>(KUtils.replaceExprents(func.getLstOperands())), func.bytecode); + this.kType = kType; + setImplicitType(exprType); setNeedsCast(func.doesCast()); if (getFuncType() == FunctionType.EQ) { @@ -87,7 +81,13 @@ public TextBuffer toJava(int indent) { return buf; case GET_KCLASS: Exprent operand = lstOperands.get(0); - if (operand instanceof ConstExprent) { + if (operand instanceof VarExprent) { + VarExprent varExprent = ((VarExprent) operand); + if (!varExprent.getVarType().equals(VarType.VARTYPE_CLASS)) { + throw new IllegalArgumentException("Variable accessing KClass is not a Class"); + } + return buf.append(varExprent.toJava()).append(".kotlin"); + } else if (operand instanceof ConstExprent) { ConstExprent constExprent = (ConstExprent) operand; String value = constExprent.getValue().toString(); VarType type = new VarType(value, !value.startsWith("[")); @@ -322,6 +322,6 @@ public int getPrecedence() { @Override public Exprent copy() { - return new KFunctionExprent((FunctionExprent) super.copy()); + return new KFunctionExprent((FunctionExprent) super.copy(), kType, getExprType()); } } diff --git a/plugins/kotlin/src/main/java/org/vineflower/kotlin/struct/KConstructor.java b/plugins/kotlin/src/main/java/org/vineflower/kotlin/struct/KConstructor.java index c3af6c4163..6143c53eb9 100644 --- a/plugins/kotlin/src/main/java/org/vineflower/kotlin/struct/KConstructor.java +++ b/plugins/kotlin/src/main/java/org/vineflower/kotlin/struct/KConstructor.java @@ -145,17 +145,31 @@ public boolean stringify(TextBuffer buffer, int indent) { parameter.stringify(indent + 1, buf); } - buf.appendPossibleNewline("", true).popNewlineGroup().append(") : "); + buf.appendPossibleNewline("", true).popNewlineGroup(); - Exprent firstExpr = method.getOrBuildGraph().first.exprents.get(0); - if (!(firstExpr instanceof InvocationExprent)) { - throw new IllegalStateException("First expression of constructor is not InvocationExprent"); + String methodDescriptor = method.methodStruct.getName() + method.methodStruct.getDescriptor(); + String containingClass = node.classStruct.qualifiedName; + + List exprents = method.getOrBuildGraph().first.exprents; + if (exprents.isEmpty()) { + DecompilerContext.getLogger().writeMessage("Unexpected empty constructor body in " + containingClass + " " + methodDescriptor, IFernflowerLogger.Severity.WARN); + return true; } - InvocationExprent invocation = (InvocationExprent) firstExpr; - buf.append(invocation.toJava(indent + 1), node.classStruct.qualifiedName, InterpreterUtil.makeUniqueKey(method.methodStruct.getName(), method.methodStruct.getDescriptor())); + buf.append(") "); + + Exprent firstExpr = exprents.get(0); + if (!(firstExpr instanceof InvocationExprent)) { + // no detected super / this constructor call (something isn't right) + DecompilerContext.getLogger().writeMessage("Unexpected missing super/this constructor call in " + containingClass + " " + methodDescriptor, IFernflowerLogger.Severity.WARN); + } else { + buf.append(": "); + + InvocationExprent invocation = (InvocationExprent) firstExpr; + buf.append(invocation.toJava(indent + 1), node.classStruct.qualifiedName, InterpreterUtil.makeUniqueKey(method.methodStruct.getName(), method.methodStruct.getDescriptor())); - method.getOrBuildGraph().first.exprents.remove(0); + method.getOrBuildGraph().first.exprents.remove(0); + } } if (method.getOrBuildGraph().first.exprents.isEmpty()) { diff --git a/plugins/kotlin/src/main/java/org/vineflower/kotlin/struct/KFunction.java b/plugins/kotlin/src/main/java/org/vineflower/kotlin/struct/KFunction.java index cb4a1c5737..dd481661b9 100644 --- a/plugins/kotlin/src/main/java/org/vineflower/kotlin/struct/KFunction.java +++ b/plugins/kotlin/src/main/java/org/vineflower/kotlin/struct/KFunction.java @@ -130,8 +130,8 @@ public static Map parse(ClassesProcessor.ClassNode node MethodWrapper method = null; + String lookupName = jvmData.hasName() ? resolver.resolve(jvmData.getName()) : name; if (jvmData.hasDesc()) { - String lookupName = jvmData.hasName() ? resolver.resolve(jvmData.getName()) : name; method = wrapper.getMethodWrapper(lookupName, resolver.resolve(jvmData.getDesc())); } @@ -148,7 +148,7 @@ public static Map parse(ClassesProcessor.ClassNode node int endOfParams = desc.length(); desc.append(")").append(returnType); - method = wrapper.getMethodWrapper(name, desc.toString()); + method = wrapper.getMethodWrapper(lookupName, desc.toString()); if (method == null) { throw new IllegalStateException("Couldn't find method " + name + " " + desc + " in class " + struct.qualifiedName); diff --git a/plugins/kotlin/src/main/java/org/vineflower/kotlin/struct/KProperty.java b/plugins/kotlin/src/main/java/org/vineflower/kotlin/struct/KProperty.java index 0808b07627..aed36a8be6 100644 --- a/plugins/kotlin/src/main/java/org/vineflower/kotlin/struct/KProperty.java +++ b/plugins/kotlin/src/main/java/org/vineflower/kotlin/struct/KProperty.java @@ -263,7 +263,7 @@ private static void appendVisibility(TextBuffer buf, ProtoBuf.Visibility visibil String propDesc = null; KType type = null; - if (property.hasReturnType() && property.getReturnType().hasClassName()) { + if (property.hasReturnType()) { type = KType.from(property.getReturnType(), nameResolver); propDesc = KTypes.getJavaSignature(type.kotlinType, property.getReturnType().getNullable()); } diff --git a/plugins/kotlin/src/main/java/org/vineflower/kotlin/util/KTypes.java b/plugins/kotlin/src/main/java/org/vineflower/kotlin/util/KTypes.java index 05e43a3144..8d698c3cfd 100644 --- a/plugins/kotlin/src/main/java/org/vineflower/kotlin/util/KTypes.java +++ b/plugins/kotlin/src/main/java/org/vineflower/kotlin/util/KTypes.java @@ -53,14 +53,23 @@ public final class KTypes { Map.entry("kotlin/collections/Iterable", "java/lang/Iterable") ); - public static final Map KOTLIN_TO_JAVA_UTIL = Map.of( - "kotlin/collections/MutableMap", "java/util/Map", - "kotlin/collections/MutableList", "java/util/List", - "kotlin/collections/MutableSet", "java/util/Set", - "kotlin/collections/MutableIterator", "java/util/Iterator", - "kotlin/collections/MutableMap$MutableEntry", "java/util/Map$Entry" + public static final Map KOTLIN_TO_JAVA_UTIL = Map.ofEntries( + Map.entry("kotlin/collections/MutableCollection", "java/util/Collection"), + Map.entry("kotlin/collections/MutableMap", "java/util/Map"), + Map.entry("kotlin/collections/MutableList", "java/util/List"), + Map.entry("kotlin/collections/MutableSet", "java/util/Set"), + Map.entry("kotlin/collections/MutableIterator", "java/util/Iterator"), + Map.entry("kotlin/collections/MutableListIterator", "java/util/ListIterator"), + Map.entry("kotlin/collections/MutableMap$MutableEntry", "java/util/Map$Entry"), + Map.entry("kotlin/collections/Collection", "java/util/Collection"), + Map.entry("kotlin/collections/Map", "java/util/Map"), + Map.entry("kotlin/collections/List", "java/util/List"), + Map.entry("kotlin/collections/ListIterator", "java/util/ListIterator"), + Map.entry("kotlin/collections/Set", "java/util/Set"), + Map.entry("kotlin/collections/Iterator", "java/util/Iterator"), + Map.entry("kotlin/collections/Map$Entry", "java/util/Map$Entry") ); - + private static final Map KOTLIN_PRIMITIVE_TYPES = Map.of( "kotlin/Int", "I", "kotlin/Long", "J", @@ -94,15 +103,15 @@ public static String getJavaSignature(String kotlinType, boolean isNullable) { return "L" + KOTLIN_TO_JAVA_LANG.get(kotlinType) + ";"; } else if (KOTLIN_TO_JAVA_UTIL.containsKey(kotlinType)) { return "L" + KOTLIN_TO_JAVA_UTIL.get(kotlinType) + ";"; - } else if (kotlinType.startsWith("kotlin/collections/")) { - String javaType = kotlinType.substring("kotlin/collections/".length()); - javaType = javaType.startsWith("Mutable") ? javaType.substring("Mutable".length()) : javaType; - return "Ljava/util/" + javaType + ";"; } else if (kotlinType.startsWith("kotlin/Function")) { - if (Integer.parseInt(kotlinType.substring("kotlin/Function".length())) > MAX_KOTLIN_FUNCTION_ARITY) { - return "Lkotlin/jvm/functions/FunctionN;"; + try { + if (Integer.parseInt(kotlinType.substring("kotlin/Function".length())) > MAX_KOTLIN_FUNCTION_ARITY) { + return "Lkotlin/jvm/functions/FunctionN;"; + } + return "Lkotlin/jvm/functions" + kotlinType.substring("kotlin".length()) + ";"; + } catch (NumberFormatException e) { + // Not a function type with arity } - return "Lkotlin/jvm/functions" + kotlinType.substring("kotlin".length()) + ";"; } } return "L" + kotlinType + ";"; diff --git a/plugins/kotlin/testData/results/pkg/TestContracts.dec b/plugins/kotlin/testData/results/pkg/TestContracts.dec index 26f6a6f008..4025e8953b 100644 --- a/plugins/kotlin/testData/results/pkg/TestContracts.dec +++ b/plugins/kotlin/testData/results/pkg/TestContracts.dec @@ -1,6 +1,5 @@ package pkg -import java.util.Iterator import kotlin.contracts.InvocationKind class TestContracts { @@ -61,7 +60,7 @@ class TestContracts { var var3: java.lang.Iterable = (new IntRange(0, i)) as java.lang.Iterable; var var4: Int = 0; - var var5: Iterator = var3.iterator(); + var var5: java.util.Iterator = var3.iterator(); while (var5.hasNext()) { var var6: Int = (var5 as IntIterator).nextInt(); @@ -74,155 +73,155 @@ class TestContracts { class 'pkg/TestContracts' { method 'testSimpleContract (Ljava/lang/Integer;)I' { - 1 11 - 2 11 - 9 12 - a 12 - b 12 - c 12 - d 12 - 11 12 - 12 14 - 13 14 - 14 14 - 15 14 - 16 14 + 1 10 + 2 10 + 9 11 + a 11 + b 11 + c 11 + d 11 + 11 11 + 12 13 + 13 13 + 14 13 + 15 13 + 16 13 } method 'testBooleanContract (ZZ)Ljava/lang/Boolean;' { - 1 25 - 2 25 - 5 25 - 6 25 - 9 25 - d 25 - e 25 - 11 25 - 12 25 - 1a 25 - 1d 25 + 1 24 + 2 24 + 5 24 + 6 24 + 9 24 + d 24 + e 24 + 11 24 + 12 24 + 1a 24 + 1d 24 } method 'testTypeContract (Ljava/lang/Object;)I' { - 1 33 - 5 33 - c 34 - d 34 - e 34 - f 34 - 10 34 - 14 34 - 15 36 - 16 36 - 17 36 - 18 36 - 19 36 - 1a 36 - 1b 36 - 1c 36 + 1 32 + 5 32 + c 33 + d 33 + e 33 + f 33 + 10 33 + 14 33 + 15 35 + 16 35 + 17 35 + 18 35 + 19 35 + 1a 35 + 1b 35 + 1c 35 } method 'testFunctionalContract (Lkotlin/jvm/functions/Function0;)I' { - 7 45 - 8 45 - 9 45 - a 45 - b 45 - c 45 - d 45 - e 45 - f 45 - 10 45 - 11 45 - 12 45 - 13 45 + 7 44 + 8 44 + 9 44 + a 44 + b 44 + c 44 + d 44 + e 44 + f 44 + 10 44 + 11 44 + 12 44 + 13 44 } method 'testFunctionalContract2 (Lkotlin/jvm/functions/Function0;Z)I' { - 7 53 - 8 53 - b 53 - c 53 - d 53 - e 53 - f 53 - 10 53 - 11 53 - 12 53 - 13 53 - 14 53 - 15 53 - 16 53 - 1a 53 - 1b 53 + 7 52 + 8 52 + b 52 + c 52 + d 52 + e 52 + f 52 + 10 52 + 11 52 + 12 52 + 13 52 + 14 52 + 15 52 + 16 52 + 1a 52 + 1b 52 } method 'testFunctionalContract3 (Lkotlin/jvm/functions/Function0;I)I' { - b 61 - c 61 - 10 61 - 11 61 - 12 61 - 13 61 - 14 62 - 15 62 - 16 62 - 17 63 - 18 63 - 19 63 - 1a 63 - 1b 63 - 1c 63 - 1d 63 - 1e 63 - 1f 65 - 20 65 - 21 65 - 22 65 - 23 65 - 24 65 - 25 65 - 29 66 - 2a 66 - 2b 66 - 2c 66 - 2d 66 - 2e 66 - 2f 66 - 30 66 - 31 66 - 32 66 - 3e 67 - 3f 67 - 40 67 - 41 67 - 42 67 - 43 67 - 44 67 - 45 67 - 46 67 - 47 67 - 48 67 - 49 67 - 4e 67 - 4f 67 - 51 67 - 52 67 - 56 70 - 57 70 - 58 70 + b 60 + c 60 + 10 60 + 11 60 + 12 60 + 13 60 + 14 61 + 15 61 + 16 61 + 17 62 + 18 62 + 19 62 + 1a 62 + 1b 62 + 1c 62 + 1d 62 + 1e 62 + 1f 64 + 20 64 + 21 64 + 22 64 + 23 64 + 24 64 + 25 64 + 29 65 + 2a 65 + 2b 65 + 2c 65 + 2d 65 + 2e 65 + 2f 65 + 30 65 + 31 65 + 32 65 + 3e 66 + 3f 66 + 40 66 + 41 66 + 42 66 + 43 66 + 44 66 + 45 66 + 46 66 + 47 66 + 48 66 + 49 66 + 4e 66 + 4f 66 + 51 66 + 52 66 + 56 69 + 57 69 + 58 69 } } Lines mapping: -13 <-> 12 -14 <-> 15 -24 <-> 26 -31 <-> 34 -32 <-> 37 -39 <-> 46 -46 <-> 54 -53 <-> 71 +13 <-> 11 +14 <-> 14 +24 <-> 25 +31 <-> 33 +32 <-> 36 +39 <-> 45 +46 <-> 53 +53 <-> 70 Not mapped: 10 18 diff --git a/plugins/kotlin/testData/results/pkg/TestNonInlineLambda.dec b/plugins/kotlin/testData/results/pkg/TestNonInlineLambda.dec index 2cb91f1ab6..5854635b22 100644 --- a/plugins/kotlin/testData/results/pkg/TestNonInlineLambda.dec +++ b/plugins/kotlin/testData/results/pkg/TestNonInlineLambda.dec @@ -1,6 +1,5 @@ package pkg -import java.util.Iterator import kotlin.jvm.internal.Ref.IntRef import kotlin.jvm.internal.Ref.ObjectRef @@ -22,7 +21,7 @@ open class TestNonInlineLambda { }// 18 public fun testCaptureIntIterationValue(x: Iterable) { - var var2: Iterator = x.iterator();// 21 + var var2: java.util.Iterator = x.iterator();// 21 while (var2.hasNext()) { this.execute(new ((var2.next() as java.lang.Number).intValue()));// 22 @@ -124,479 +123,479 @@ open class TestNonInlineLambda { class 'pkg/TestNonInlineLambda' { method 'testCaptureInt (I)V' { - 0 16 - 2 16 - 7 16 - b 16 - c 16 - d 16 - e 16 - f 16 - 10 16 - 11 17 + 0 15 + 2 15 + 7 15 + b 15 + c 15 + d 15 + e 15 + f 15 + 10 15 + 11 16 } method 'testCaptureObject (Ljava/lang/String;)V' { - 6 20 - 8 20 - d 20 - 11 20 - 12 20 - 13 20 - 14 20 - 15 20 - 16 20 - 17 21 + 6 19 + 8 19 + d 19 + 11 19 + 12 19 + 13 19 + 14 19 + 15 19 + 16 19 + 17 20 } method 'testCaptureIntIterationValue (Ljava/lang/Iterable;)V' { - 6 24 - 7 24 - 8 24 - 9 24 - a 24 - b 24 - c 24 - d 26 - e 26 - f 26 - 10 26 - 11 26 - 12 26 - 16 27 - 17 27 - 18 27 - 19 27 - 1a 27 - 1b 27 - 1c 27 - 1d 27 - 1e 27 - 1f 27 - 20 27 - 21 27 - 23 27 - 28 27 - 2c 27 - 2d 27 - 2e 27 - 2f 27 - 30 27 - 31 27 - 35 29 + 6 23 + 7 23 + 8 23 + 9 23 + a 23 + b 23 + c 23 + d 25 + e 25 + f 25 + 10 25 + 11 25 + 12 25 + 16 26 + 17 26 + 18 26 + 19 26 + 1a 26 + 1b 26 + 1c 26 + 1d 26 + 1e 26 + 1f 26 + 20 26 + 21 26 + 23 26 + 28 26 + 2c 26 + 2d 26 + 2e 26 + 2f 26 + 30 26 + 31 26 + 35 28 } method 'testCaptureObjectIterationValue (Ljava/lang/Iterable;)V' { - 6 32 - 7 32 - 8 32 - 9 32 - a 32 - b 32 - c 32 - 16 32 - 17 32 - 18 32 - 19 32 - 1a 32 - 1b 32 - 1c 32 - 1d 32 - 1e 32 - 1f 32 - 20 33 - 25 33 - 29 33 - 2a 33 - 2b 33 - 2c 33 - 2d 33 - 2e 33 - 32 35 + 6 31 + 7 31 + 8 31 + 9 31 + a 31 + b 31 + c 31 + 16 31 + 17 31 + 18 31 + 19 31 + 1a 31 + 1b 31 + 1c 31 + 1d 31 + 1e 31 + 1f 31 + 20 32 + 25 32 + 29 32 + 2a 32 + 2b 32 + 2c 32 + 2d 32 + 2e 32 + 32 34 } method 'testCaptureMutableInt (I)V' { - 7 38 - 8 39 - 9 39 - a 39 - b 39 - c 39 - d 40 - 12 40 - 16 40 - 17 40 - 18 40 - 19 40 - 1a 40 - 1b 40 - 1c 41 - 1d 41 - 1e 41 - 1f 41 - 20 41 - 24 41 - 28 42 - 2d 42 - 31 42 - 32 42 - 33 42 - 34 42 - 35 42 - 36 42 - 37 43 - 3c 43 - 3d 43 - 3e 43 - 40 43 - 41 43 - 42 43 - 43 44 - 48 44 - 4c 44 - 4d 44 - 4e 44 - 4f 44 - 50 44 - 51 44 - 52 45 - 53 45 - 54 45 - 55 45 - 56 45 - 57 45 - 58 46 - 5d 46 - 61 46 - 62 46 - 63 46 - 64 46 - 65 46 - 66 46 - 67 47 - 6c 47 - 6e 47 - 6f 47 - 70 47 - 71 48 - 76 48 - 7a 48 - 7b 48 - 7c 48 - 7d 48 - 7e 48 - 7f 48 - 80 49 + 7 37 + 8 38 + 9 38 + a 38 + b 38 + c 38 + d 39 + 12 39 + 16 39 + 17 39 + 18 39 + 19 39 + 1a 39 + 1b 39 + 1c 40 + 1d 40 + 1e 40 + 1f 40 + 20 40 + 24 40 + 28 41 + 2d 41 + 31 41 + 32 41 + 33 41 + 34 41 + 35 41 + 36 41 + 37 42 + 3c 42 + 3d 42 + 3e 42 + 40 42 + 41 42 + 42 42 + 43 43 + 48 43 + 4c 43 + 4d 43 + 4e 43 + 4f 43 + 50 43 + 51 43 + 52 44 + 53 44 + 54 44 + 55 44 + 56 44 + 57 44 + 58 45 + 5d 45 + 61 45 + 62 45 + 63 45 + 64 45 + 65 45 + 66 45 + 67 46 + 6c 46 + 6e 46 + 6f 46 + 70 46 + 71 47 + 76 47 + 7a 47 + 7b 47 + 7c 47 + 7d 47 + 7e 47 + 7f 47 + 80 48 } method 'testCaptureMutableObject (Ljava/lang/String;)V' { - d 52 - e 53 - f 53 - 10 53 - 11 53 - 12 53 - 13 54 - 18 54 - 1c 54 - 1d 54 - 1e 54 - 1f 54 - 20 54 - 21 54 - 22 55 - 23 55 - 24 55 - 25 55 - 26 55 - 27 55 - 28 55 - 29 55 - 2a 55 - 2b 55 - 2c 55 - 2d 55 - 2e 55 - 2f 56 - 34 56 - 38 56 - 39 56 - 3a 56 - 3b 56 - 3c 56 - 3d 56 - 3e 57 - 3f 57 - 40 57 - 41 57 - 42 57 - 43 57 - 44 57 - 45 57 - 46 57 - 47 57 - 48 57 - 49 57 - 4a 57 - 4b 57 - 4c 57 - 4d 57 - 4e 57 - 4f 57 - 50 57 - 51 57 - 52 57 - 53 58 - 58 58 - 5c 58 - 5d 58 - 5e 58 - 5f 58 - 60 58 - 61 58 - 62 59 - 63 59 - 64 59 - 65 59 - 66 59 - 67 59 - 68 60 - 6d 60 - 71 60 - 72 60 - 73 60 - 74 60 - 75 60 - 76 60 - 77 61 - 78 61 - 79 61 - 7a 61 - 7b 61 - 7c 61 - 7d 61 - 7e 61 - 7f 61 - 80 61 - 81 61 - 82 61 - 83 61 - 84 61 - 85 62 - 8a 62 - 8e 62 - 8f 62 - 90 62 - 91 62 - 92 62 - 93 62 - 94 63 + d 51 + e 52 + f 52 + 10 52 + 11 52 + 12 52 + 13 53 + 18 53 + 1c 53 + 1d 53 + 1e 53 + 1f 53 + 20 53 + 21 53 + 22 54 + 23 54 + 24 54 + 25 54 + 26 54 + 27 54 + 28 54 + 29 54 + 2a 54 + 2b 54 + 2c 54 + 2d 54 + 2e 54 + 2f 55 + 34 55 + 38 55 + 39 55 + 3a 55 + 3b 55 + 3c 55 + 3d 55 + 3e 56 + 3f 56 + 40 56 + 41 56 + 42 56 + 43 56 + 44 56 + 45 56 + 46 56 + 47 56 + 48 56 + 49 56 + 4a 56 + 4b 56 + 4c 56 + 4d 56 + 4e 56 + 4f 56 + 50 56 + 51 56 + 52 56 + 53 57 + 58 57 + 5c 57 + 5d 57 + 5e 57 + 5f 57 + 60 57 + 61 57 + 62 58 + 63 58 + 64 58 + 65 58 + 66 58 + 67 58 + 68 59 + 6d 59 + 71 59 + 72 59 + 73 59 + 74 59 + 75 59 + 76 59 + 77 60 + 78 60 + 79 60 + 7a 60 + 7b 60 + 7c 60 + 7d 60 + 7e 60 + 7f 60 + 80 60 + 81 60 + 82 60 + 83 60 + 84 60 + 85 61 + 8a 61 + 8e 61 + 8f 61 + 90 61 + 91 61 + 92 61 + 93 61 + 94 62 } method 'testCaptureAndMutateInt (I)V' { - 7 66 - 8 67 - d 67 - 11 67 - 12 67 - 13 67 - 14 67 - 15 67 - 16 67 - 17 68 - 18 68 - 19 68 - 1a 68 - 1b 68 - 1c 68 - 1d 68 - 1e 69 - 23 69 - 27 69 - 28 69 - 29 69 - 2a 69 - 2b 69 - 2c 69 - 2d 70 + 7 65 + 8 66 + d 66 + 11 66 + 12 66 + 13 66 + 14 66 + 15 66 + 16 66 + 17 67 + 18 67 + 19 67 + 1a 67 + 1b 67 + 1c 67 + 1d 67 + 1e 68 + 23 68 + 27 68 + 28 68 + 29 68 + 2a 68 + 2b 68 + 2c 68 + 2d 69 } method 'testCaptureAndMutateString (Ljava/lang/String;)V' { - d 73 - e 74 - f 74 - 10 74 - 11 74 - 12 74 - 13 74 - 14 75 - 19 75 - 1d 75 - 1e 75 - 1f 75 - 20 75 - 21 75 - 22 75 - 23 76 - 24 76 - 25 76 - 26 76 - 27 76 - 28 76 - 29 76 - 2a 76 - 2b 76 - 2c 76 - 2d 77 - 32 77 - 36 77 - 37 77 - 38 77 - 39 77 - 3a 77 - 3b 77 - 3c 78 + d 72 + e 73 + f 73 + 10 73 + 11 73 + 12 73 + 13 73 + 14 74 + 19 74 + 1d 74 + 1e 74 + 1f 74 + 20 74 + 21 74 + 22 74 + 23 75 + 24 75 + 25 75 + 26 75 + 27 75 + 28 75 + 29 75 + 2a 75 + 2b 75 + 2c 75 + 2d 76 + 32 76 + 36 76 + 37 76 + 38 76 + 39 76 + 3a 76 + 3b 76 + 3c 77 } method 'testCapturePublicMutableIntField ()V' { - 0 81 - 5 81 - 9 81 - a 81 - b 81 - c 81 - d 81 - e 81 - f 82 + 0 80 + 5 80 + 9 80 + a 80 + b 80 + c 80 + d 80 + e 80 + f 81 } method 'testCapturePublicMutableStringField ()V' { - 0 85 - 5 85 - 9 85 - a 85 - b 85 - c 85 - d 85 - e 85 - f 86 + 0 84 + 5 84 + 9 84 + a 84 + b 84 + c 84 + d 84 + e 84 + f 85 } method 'testCapturePrivateMutableIntField ()V' { - 0 89 - 5 89 - 9 89 - a 89 - b 89 - c 89 - d 89 - e 89 - f 90 + 0 88 + 5 88 + 9 88 + a 88 + b 88 + c 88 + d 88 + e 88 + f 89 } method 'testCapturePrivateMutableStringField ()V' { - 0 93 - 5 93 - 9 93 - a 93 - b 93 - c 93 - d 93 - e 93 - f 94 + 0 92 + 5 92 + 9 92 + a 92 + b 92 + c 92 + d 92 + e 92 + f 93 } method 'execute (Lkotlin/jvm/functions/Function0;)V' { - 6 97 + 6 96 } method 'access$getPrivateIntField$p (Lpkg/TestNonInlineLambda;)I' { - 0 102 - 1 102 - 2 102 - 3 102 - 4 102 + 0 101 + 1 101 + 2 101 + 3 101 + 4 101 } method 'access$setPrivateIntField$p (Lpkg/TestNonInlineLambda;I)V' { - 0 108 - 1 108 - 2 108 - 3 108 - 4 108 - 5 109 + 0 107 + 1 107 + 2 107 + 3 107 + 4 107 + 5 108 } method 'access$setPrivateStringField$p (Lpkg/TestNonInlineLambda;Ljava/lang/String;)V' { - 0 114 - 1 114 - 2 114 - 3 114 - 4 114 - 5 115 + 0 113 + 1 113 + 2 113 + 3 113 + 4 113 + 5 114 } method 'access$getPrivateStringField$p (Lpkg/TestNonInlineLambda;)Ljava/lang/String;' { - 0 120 - 1 120 - 2 120 - 3 120 - 4 120 + 0 119 + 1 119 + 2 119 + 3 119 + 4 119 } } Lines mapping: -3 <-> 121 -7 <-> 17 -8 <-> 17 -11 <-> 18 -14 <-> 21 -15 <-> 21 -18 <-> 22 -21 <-> 25 -22 <-> 28 -26 <-> 30 -29 <-> 33 -30 <-> 34 -34 <-> 36 -37 <-> 39 -38 <-> 41 -41 <-> 42 -42 <-> 43 -45 <-> 44 -46 <-> 45 -49 <-> 46 -50 <-> 47 -53 <-> 48 -54 <-> 49 -57 <-> 50 -60 <-> 53 -61 <-> 55 -64 <-> 56 -65 <-> 57 -68 <-> 58 -69 <-> 59 -72 <-> 60 -73 <-> 61 -76 <-> 62 -77 <-> 63 -80 <-> 64 -83 <-> 67 -84 <-> 68 -89 <-> 69 -90 <-> 70 -95 <-> 71 -98 <-> 74 -99 <-> 76 -105 <-> 77 -106 <-> 78 -112 <-> 79 -117 <-> 82 -118 <-> 83 -123 <-> 86 -124 <-> 87 -129 <-> 90 -130 <-> 91 -135 <-> 94 -136 <-> 95 -141 <-> 98 +3 <-> 120 +7 <-> 16 +8 <-> 16 +11 <-> 17 +14 <-> 20 +15 <-> 20 +18 <-> 21 +21 <-> 24 +22 <-> 27 +26 <-> 29 +29 <-> 32 +30 <-> 33 +34 <-> 35 +37 <-> 38 +38 <-> 40 +41 <-> 41 +42 <-> 42 +45 <-> 43 +46 <-> 44 +49 <-> 45 +50 <-> 46 +53 <-> 47 +54 <-> 48 +57 <-> 49 +60 <-> 52 +61 <-> 54 +64 <-> 55 +65 <-> 56 +68 <-> 57 +69 <-> 58 +72 <-> 59 +73 <-> 60 +76 <-> 61 +77 <-> 62 +80 <-> 63 +83 <-> 66 +84 <-> 67 +89 <-> 68 +90 <-> 69 +95 <-> 70 +98 <-> 73 +99 <-> 75 +105 <-> 76 +106 <-> 77 +112 <-> 78 +117 <-> 81 +118 <-> 82 +123 <-> 85 +124 <-> 86 +129 <-> 89 +130 <-> 90 +135 <-> 93 +136 <-> 94 +141 <-> 97