VarRemapper.ParamRemapper class merged into VarRemapper

This commit is contained in:
Mikhael Bogdanov
2014-03-19 16:34:31 +04:00
parent f000d208a6
commit 75c57f9827
5 changed files with 51 additions and 56 deletions
@@ -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);
}
@@ -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);
@@ -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);
@@ -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;
}
@@ -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;