From 35802640cb67666eb64e7aa70b6c84f55d7c6ea3 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Wed, 14 May 2014 16:07:06 +0400 Subject: [PATCH] Object transformation: store captured field before super constructor call --- .../inline/AnonymousObjectTransformer.java | 29 +++++++------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/inline/AnonymousObjectTransformer.java b/compiler/backend/src/org/jetbrains/jet/codegen/inline/AnonymousObjectTransformer.java index bda6c373035..a8acc84786d 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/inline/AnonymousObjectTransformer.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/inline/AnonymousObjectTransformer.java @@ -199,7 +199,7 @@ public class AnonymousObjectTransformer { List descTypes = new ArrayList(); Parameters constructorParams = constructorInlineBuilder.buildParameters(); - final int [] capturedIndexes = new int [constructorParams.totalSize()]; + int [] capturedIndexes = new int [constructorParams.totalSize()]; int index = 0; int size = 0; @@ -218,7 +218,7 @@ public class AnonymousObjectTransformer { } } - final List> capturedFieldsToGenerate = new ArrayList>(); + List> capturedFieldsToGenerate = new ArrayList>(); for (CapturedParamInfo capturedParamInfo : allCapturedBuilder.listCaptured()) { if (capturedParamInfo.getLambda() == null) { //not inlined capturedFieldsToGenerate.add(new Pair(capturedParamInfo.getNewFieldName(), capturedParamInfo.getType())); @@ -232,23 +232,16 @@ public class AnonymousObjectTransformer { "", constructorDescriptor, null, ArrayUtil.EMPTY_STRING_ARRAY); - MethodVisitor capturedFieldInitializer = new InstructionAdapter(InlineCodegenUtil.API, constructorVisitor) { - private boolean superCallProcessed; - @Override - public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { - super.visitMethodInsn(opcode, owner, name, desc, itf); - if (!superCallProcessed && "".equals(name)) { - superCallProcessed = true; - List fields = AsmUtil.transformCapturedParams(capturedFieldsToGenerate, newLambdaType); - int paramIndex = 0; - for (FieldInfo fieldInfo : fields) { - AsmUtil.genAssignInstanceFieldFromParam(fieldInfo, capturedIndexes[paramIndex], this); - paramIndex++; - } - } - } - }; + //initialize captured fields + List fields = AsmUtil.transformCapturedParams(capturedFieldsToGenerate, newLambdaType); + int paramIndex = 0; + InstructionAdapter capturedFieldInitializer = new InstructionAdapter(constructorVisitor); + for (FieldInfo fieldInfo : fields) { + AsmUtil.genAssignInstanceFieldFromParam(fieldInfo, capturedIndexes[paramIndex], capturedFieldInitializer); + paramIndex++; + } + //then transform constructor Parameters constructorParameters = constructorInlineBuilder.buildParameters(); RegeneratedLambdaFieldRemapper remapper =