VarRemapper.ParamRemapper class merged into VarRemapper
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user