Write proper start label for inlined constructor parameters (start label was shifted by additional captured parameters injection)
This commit is contained in:
+16
-1
@@ -285,6 +285,8 @@ public class AnonymousObjectTransformer extends ObjectTransformer<AnonymousObjec
|
|||||||
"<init>", constructorDescriptor,
|
"<init>", constructorDescriptor,
|
||||||
null, ArrayUtil.EMPTY_STRING_ARRAY);
|
null, ArrayUtil.EMPTY_STRING_ARRAY);
|
||||||
|
|
||||||
|
final Label newBodyStartLabel = new Label();
|
||||||
|
constructorVisitor.visitLabel(newBodyStartLabel);
|
||||||
//initialize captured fields
|
//initialize captured fields
|
||||||
List<NewJavaField> newFieldsWithSkipped = TransformationUtilsKt.getNewFieldsToGenerate(allCapturedBuilder.listCaptured());
|
List<NewJavaField> newFieldsWithSkipped = TransformationUtilsKt.getNewFieldsToGenerate(allCapturedBuilder.listCaptured());
|
||||||
List<FieldInfo> fieldInfoWithSkipped = TransformationUtilsKt.transformToFieldInfo(
|
List<FieldInfo> fieldInfoWithSkipped = TransformationUtilsKt.transformToFieldInfo(
|
||||||
@@ -318,7 +320,20 @@ public class AnonymousObjectTransformer extends ObjectTransformer<AnonymousObjec
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inlineMethodAndUpdateGlobalResult(parentRemapper, capturedFieldInitializer, constructor, constructorInlineBuilder, true);
|
MethodNode intermediateMethodNode = new MethodNode(AsmUtil.NO_FLAG_PACKAGE_PRIVATE, "<init>", constructorDescriptor, null, ArrayUtil.EMPTY_STRING_ARRAY);
|
||||||
|
inlineMethodAndUpdateGlobalResult(parentRemapper, intermediateMethodNode, constructor, constructorInlineBuilder, true);
|
||||||
|
|
||||||
|
AbstractInsnNode first = intermediateMethodNode.instructions.getFirst();
|
||||||
|
final Label oldStartLabel = first instanceof LabelNode ? ((LabelNode) first).getLabel() : null;
|
||||||
|
intermediateMethodNode.accept(new MethodBodyVisitor(capturedFieldInitializer) {
|
||||||
|
@Override
|
||||||
|
public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) {
|
||||||
|
if (oldStartLabel == start) {
|
||||||
|
start = newBodyStartLabel;//patch for jack&jill
|
||||||
|
}
|
||||||
|
super.visitLocalVariable(name, desc, signature, start, end, index);
|
||||||
|
}
|
||||||
|
});
|
||||||
constructorVisitor.visitEnd();
|
constructorVisitor.visitEnd();
|
||||||
AsmUtil.genClosureFields(TransformationUtilsKt.toNameTypePair(TransformationUtilsKt.filterSkipped(newFieldsWithSkipped)), classBuilder);
|
AsmUtil.genClosureFields(TransformationUtilsKt.toNameTypePair(TransformationUtilsKt.filterSkipped(newFieldsWithSkipped)), classBuilder);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
public inline fun <T> Iterable(crossinline iterator: () -> Iterator<T>): Iterable<T> = object : Iterable<T> {
|
||||||
|
override fun iterator(): Iterator<T> = iterator()
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun IntArray.asIterable(): Iterable<Int> {
|
||||||
|
return Iterable { this.iterator() }
|
||||||
|
}
|
||||||
|
/*Threre are two constuctors so we should be sure that we check required one by checking 'receiver$0$inlined' assign*/
|
||||||
|
// 1 <init>\(\[I\)V\s+L0\s+ALOAD 0\s+ALOAD 1\s+PUTFIELD InlinedConstuctorKt\$asIterable\$\$inlined\$Iterable\$1\.receiver\$0\$inlined : \[I
|
||||||
|
// 1 LOCALVARIABLE this LInlinedConstuctorKt\$asIterable\$\$inlined\$Iterable\$1; L0 L2 0
|
||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
open class A(val z: String) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun test(crossinline s: () -> String) {
|
||||||
|
object : A("123") {
|
||||||
|
val x = s();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
var z = "123";
|
||||||
|
test { z }
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Threre are two constuctors so we should be sure that we check LOCALVARIABLEs from same method*/
|
||||||
|
// 1 LOCALVARIABLE this LInlinedConstuctorWithSuperCallParamsKt\$main\$\$inlined\$test\$1; L0 L7 0\s+LOCALVARIABLE \$super_call_param\$1 Ljava/lang/String; L0 L7 1
|
||||||
Reference in New Issue
Block a user