diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/inline/InlineCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/inline/InlineCodegen.java index 8d65f3f5071..0e15161406a 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/inline/InlineCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/inline/InlineCodegen.java @@ -215,7 +215,7 @@ public class InlineCodegen implements ParentCodegenAware, CallGenerator { MethodInliner inliner = new MethodInliner(node, parameters, info, new FieldRemapper(null, null, parameters), isSameModule, "Method inlining " + call.getCallElement().getText()); //with captured - VarRemapper.ParamRemapper remapper = new VarRemapper.ParamRemapper(parameters, initialFrameSize); + VarRemapper remapper = new VarRemapper(parameters, initialFrameSize); return inliner.doInline(codegen.v, remapper); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/inline/LambdaTransformer.java b/compiler/backend/src/org/jetbrains/jet/codegen/inline/LambdaTransformer.java index e7259e8d13b..0c622879c75 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/inline/LambdaTransformer.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/inline/LambdaTransformer.java @@ -132,7 +132,7 @@ public class LambdaTransformer { MethodInliner inliner = new MethodInliner(invoke, parameters, inliningContext.subInline(inliningContext.nameGenerator.subGenerator("lambda")), remapper, isSameModule, "Transformer for " + invocation.getOwnerInternalName()); - InlineResult result = inliner.doInline(invokeVisitor, new VarRemapper.ParamRemapper(parameters, 0), false); + InlineResult result = inliner.doInline(invokeVisitor, new VarRemapper(parameters, 0), false); invokeVisitor.visitMaxs(-1, -1); generateConstructorAndFields(classBuilder, builder, invocation); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/inline/MethodInliner.java b/compiler/backend/src/org/jetbrains/jet/codegen/inline/MethodInliner.java index 122e9b548d0..9eb3d896036 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/inline/MethodInliner.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/inline/MethodInliner.java @@ -72,13 +72,13 @@ public class MethodInliner { } - public InlineResult doInline(MethodVisitor adapter, VarRemapper.ParamRemapper remapper) { + public InlineResult doInline(MethodVisitor adapter, VarRemapper remapper) { return doInline(adapter, remapper, true); } public InlineResult doInline( MethodVisitor adapter, - VarRemapper.ParamRemapper remapper, + VarRemapper remapper, boolean remapReturn ) { //analyze body @@ -170,7 +170,7 @@ public class MethodInliner { newCapturedRemapper, true /*cause all calls in same module as lambda*/, "Lambda inlining " + info.getLambdaClassType().getInternalName()); - VarRemapper.ParamRemapper remapper = new VarRemapper.ParamRemapper(lambdaParameters, valueParamShift); + VarRemapper remapper = new VarRemapper(lambdaParameters, valueParamShift); InlineResult lambdaResult = inliner.doInline(this.mv, remapper);//TODO add skipped this and receiver result.addAllClassesToRemove(lambdaResult); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/inline/RemapVisitor.java b/compiler/backend/src/org/jetbrains/jet/codegen/inline/RemapVisitor.java index 0577bd5e29c..ddb3531fdec 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/inline/RemapVisitor.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/inline/RemapVisitor.java @@ -31,18 +31,19 @@ public class RemapVisitor extends InstructionAdapter { private final VarRemapper remapper; private final boolean remapReturn; - private FieldRemapper nodeRemapper; + + private final FieldRemapper nodeRemapper; protected RemapVisitor( MethodVisitor mv, Label end, - VarRemapper.ParamRemapper remapper, + VarRemapper varRemapper, boolean remapReturn, FieldRemapper nodeRemapper ) { super(InlineCodegenUtil.API, mv); this.end = end; - this.remapper = remapper; + this.remapper = varRemapper; this.remapReturn = remapReturn; this.nodeRemapper = nodeRemapper; } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/inline/VarRemapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/inline/VarRemapper.java index d18acac60a7..2430e91307b 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/inline/VarRemapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/inline/VarRemapper.java @@ -24,61 +24,57 @@ import org.jetbrains.asm4.commons.InstructionAdapter; import org.jetbrains.jet.codegen.StackValue; import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants; -public abstract class VarRemapper { +public class VarRemapper { - public static class ParamRemapper extends VarRemapper { + private final int allParamsSize; + private final Parameters params; + private final int actualParamsSize; - private final int allParamsSize; - private final Parameters params; - private final int actualParamsSize; + private final StackValue [] remapValues; - private final StackValue [] remapValues; + private final int additionalShift; - private final int additionalShift; + public VarRemapper(Parameters params, int additionalShift) { + this.additionalShift = additionalShift; + this.allParamsSize = params.totalSize(); + this.params = params; - public ParamRemapper(Parameters params, int additionalShift) { - this.additionalShift = additionalShift; - this.allParamsSize = params.totalSize(); - this.params = params; + int realSize = 0; + remapValues = new StackValue [params.totalSize()]; - int realSize = 0; - remapValues = new StackValue [params.totalSize()]; - - int index = 0; - for (ParameterInfo info : params) { - if (!info.isSkippedOrRemapped()) { - remapValues[index] = StackValue.local(realSize, AsmTypeConstants.OBJECT_TYPE); - realSize += info.getType().getSize(); - } else { - remapValues[index] = info.isRemapped() ? info.getRemapValue() : null; - } - index++; - } - - actualParamsSize = realSize; - } - - @Override - public RemapInfo doRemap(int index) { - int remappedIndex; - - if (index < allParamsSize) { - ParameterInfo info = params.get(index); - StackValue remapped = remapValues[index]; - if (info.isSkipped || remapped == null) { - throw new RuntimeException("Trying to access skipped parameter: " + info.type + " at " +index); - } - if (info.isRemapped()) { - return new RemapInfo(remapped, info); - } else { - remappedIndex = ((StackValue.Local)remapped).index; - } + int index = 0; + for (ParameterInfo info : params) { + if (!info.isSkippedOrRemapped()) { + remapValues[index] = StackValue.local(realSize, AsmTypeConstants.OBJECT_TYPE); + realSize += info.getType().getSize(); } else { - remappedIndex = actualParamsSize - params.totalSize() + index; //captured params not used directly in this inlined method, they used in closure + remapValues[index] = info.isRemapped() ? info.getRemapValue() : null; } - - return new RemapInfo(StackValue.local(remappedIndex + additionalShift, AsmTypeConstants.OBJECT_TYPE), null); + index++; } + + actualParamsSize = realSize; + } + + public RemapInfo doRemap(int index) { + int remappedIndex; + + if (index < allParamsSize) { + ParameterInfo info = params.get(index); + StackValue remapped = remapValues[index]; + if (info.isSkipped || remapped == null) { + throw new RuntimeException("Trying to access skipped parameter: " + info.type + " at " +index); + } + if (info.isRemapped()) { + return new RemapInfo(remapped, info); + } else { + remappedIndex = ((StackValue.Local)remapped).index; + } + } else { + remappedIndex = actualParamsSize - params.totalSize() + index; //captured params not used directly in this inlined method, they used in closure + } + + return new RemapInfo(StackValue.local(remappedIndex + additionalShift, AsmTypeConstants.OBJECT_TYPE), null); } public RemapInfo remap(int index) { @@ -108,8 +104,6 @@ public abstract class VarRemapper { } } - abstract public RemapInfo doRemap(int index); - public static class RemapInfo { public final StackValue value;