Inline ExpressionCodegen#pushMethodArguments, drop "skipLast" hack

This commit is contained in:
Alexander Udalov
2014-07-04 21:22:22 +04:00
parent 2bdf1a4290
commit 374d50609d
2 changed files with 34 additions and 41 deletions
@@ -34,25 +34,24 @@ public class CallBasedArgumentGenerator extends ArgumentGenerator {
private final CallGenerator callGenerator; private final CallGenerator callGenerator;
private final List<ValueParameterDescriptor> valueParameters; private final List<ValueParameterDescriptor> valueParameters;
private final List<Type> valueParameterTypes; private final List<Type> valueParameterTypes;
private final boolean skipLast;
public CallBasedArgumentGenerator( public CallBasedArgumentGenerator(
@NotNull ExpressionCodegen codegen, @NotNull ExpressionCodegen codegen,
@NotNull CallGenerator callGenerator, @NotNull CallGenerator callGenerator,
@NotNull List<ValueParameterDescriptor> valueParameters, @NotNull List<ValueParameterDescriptor> valueParameters,
@NotNull List<Type> valueParameterTypes, @NotNull List<Type> valueParameterTypes
boolean skipLast
) { ) {
this.codegen = codegen; this.codegen = codegen;
this.callGenerator = callGenerator; this.callGenerator = callGenerator;
this.valueParameters = valueParameters; this.valueParameters = valueParameters;
this.valueParameterTypes = valueParameterTypes; this.valueParameterTypes = valueParameterTypes;
this.skipLast = skipLast;
assert valueParameters.size() == valueParameterTypes.size() :
"Value parameters and their types mismatch in sizes: " + valueParameters.size() + " != " + valueParameterTypes.size();
} }
@Override @Override
protected void generateExpression(int i, @NotNull ExpressionValueArgument argument) { protected void generateExpression(int i, @NotNull ExpressionValueArgument argument) {
if (shouldSkip(i)) return;
ValueParameterDescriptor parameter = valueParameters.get(i); ValueParameterDescriptor parameter = valueParameters.get(i);
Type type = valueParameterTypes.get(i); Type type = valueParameterTypes.get(i);
ValueArgument valueArgument = argument.getValueArgument(); ValueArgument valueArgument = argument.getValueArgument();
@@ -64,7 +63,6 @@ public class CallBasedArgumentGenerator extends ArgumentGenerator {
@Override @Override
protected void generateDefault(int i, @NotNull DefaultValueArgument argument) { protected void generateDefault(int i, @NotNull DefaultValueArgument argument) {
if (shouldSkip(i)) return;
ValueParameterDescriptor parameter = valueParameters.get(i); ValueParameterDescriptor parameter = valueParameters.get(i);
Type type = valueParameterTypes.get(i); Type type = valueParameterTypes.get(i);
pushDefaultValueOnStack(type, codegen.v); pushDefaultValueOnStack(type, codegen.v);
@@ -73,14 +71,9 @@ public class CallBasedArgumentGenerator extends ArgumentGenerator {
@Override @Override
protected void generateVararg(int i, @NotNull VarargValueArgument argument) { protected void generateVararg(int i, @NotNull VarargValueArgument argument) {
if (shouldSkip(i)) return;
ValueParameterDescriptor parameter = valueParameters.get(i); ValueParameterDescriptor parameter = valueParameters.get(i);
Type type = valueParameterTypes.get(i); Type type = valueParameterTypes.get(i);
codegen.genVarargs(argument, parameter.getType()); codegen.genVarargs(argument, parameter.getType());
callGenerator.afterParameterPut(type, null, parameter); callGenerator.afterParameterPut(type, null, parameter);
} }
private boolean shouldSkip(int i) {
return skipLast && i == valueParameters.size() - 1;
}
} }
@@ -1342,8 +1342,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
assert valueArguments != null : "Failed to arrange value arguments by index: " + superConstructor; assert valueArguments != null : "Failed to arrange value arguments by index: " + superConstructor;
ArgumentGenerator argumentGenerator = ArgumentGenerator argumentGenerator =
new CallBasedArgumentGenerator(this, defaultCallGenerator, superConstructor.getValueParameters(), new CallBasedArgumentGenerator(this, defaultCallGenerator, superConstructor.getValueParameters(),
typeMapper.mapToCallableMethod(superConstructor).getValueParameterTypes(), typeMapper.mapToCallableMethod(superConstructor).getValueParameterTypes());
/* skipLast = */ false);
argumentGenerator.generate(valueArguments); argumentGenerator.generate(valueArguments);
} }
@@ -2131,9 +2130,19 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
"Tail recursive method couldn't be inlined " + descriptor; "Tail recursive method couldn't be inlined " + descriptor;
ArgumentGenerator argumentGenerator = new CallBasedArgumentGenerator(this, callGenerator, descriptor.getValueParameters(), ArgumentGenerator argumentGenerator = new CallBasedArgumentGenerator(this, callGenerator, descriptor.getValueParameters(),
callableMethod.getValueParameterTypes(), callableMethod.getValueParameterTypes());
/* skipLast = */ false);
int mask = pushMethodArguments(receiver, resolvedCall, callableMethod, callGenerator, argumentGenerator); if (!(descriptor instanceof ConstructorDescriptor)) { // otherwise already
receiver = StackValue.receiver(resolvedCall, receiver, this, callableMethod);
receiver.put(receiver.type, v);
}
callGenerator.putHiddenParams();
List<ResolvedValueArgument> valueArguments = resolvedCall.getValueArgumentsByIndex();
assert valueArguments != null : "Failed to arrange value arguments by index: " + descriptor;
int mask = argumentGenerator.generate(valueArguments);
if (tailRecursionCodegen.isTailRecursion(resolvedCall)) { if (tailRecursionCodegen.isTailRecursion(resolvedCall)) {
tailRecursionCodegen.generateTailRecursion(resolvedCall); tailRecursionCodegen.generateTailRecursion(resolvedCall);
@@ -2316,28 +2325,6 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
return false; return false;
} }
private int pushMethodArguments(
@Nullable StackValue receiver,
@NotNull ResolvedCall<?> resolvedCall,
@NotNull CallableMethod callableMethod,
@NotNull CallGenerator callGenerator,
@NotNull ArgumentGenerator argumentGenerator
) {
CallableDescriptor descriptor = resolvedCall.getResultingDescriptor();
if (!(descriptor instanceof ConstructorDescriptor)) { // otherwise already
receiver = StackValue.receiver(resolvedCall, receiver, this, callableMethod);
receiver.put(receiver.type, v);
}
callGenerator.putHiddenParams();
List<ResolvedValueArgument> valueArguments = resolvedCall.getValueArgumentsByIndex();
assert valueArguments != null : "Failed to arrange value arguments by index: " + descriptor;
return argumentGenerator.generate(valueArguments);
}
public void genVarargs(@NotNull VarargValueArgument valueArgument, @NotNull JetType outType) { public void genVarargs(@NotNull VarargValueArgument valueArgument, @NotNull JetType outType) {
Type type = asmType(outType); Type type = asmType(outType);
assert type.getSort() == Type.ARRAY; assert type.getSort() == Type.ARRAY;
@@ -3371,9 +3358,22 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
ArgumentGenerator argumentGenerator = ArgumentGenerator argumentGenerator =
new CallBasedArgumentGenerator(this, defaultCallGenerator, new CallBasedArgumentGenerator(this, defaultCallGenerator,
resolvedCall.getResultingDescriptor().getValueParameters(), resolvedCall.getResultingDescriptor().getValueParameters(),
callableMethod.getValueParameterTypes(), callableMethod.getValueParameterTypes());
/* skipLast = */ !isGetter);
pushMethodArguments(receiver, resolvedCall, callableMethod, defaultCallGenerator, argumentGenerator); receiver = StackValue.receiver(resolvedCall, receiver, this, callableMethod);
receiver.put(receiver.type, v);
List<ResolvedValueArgument> valueArguments = resolvedCall.getValueArgumentsByIndex();
assert valueArguments != null : "Failed to arrange value arguments by index: " + operationDescriptor;
if (!isGetter) {
assert valueArguments.size() >= 2 : "Setter call should have at least 2 arguments: " + operationDescriptor;
// Skip generation of the right hand side of an indexed assignment, which is the last value argument
valueArguments.remove(valueArguments.size() - 1);
}
argumentGenerator.generate(valueArguments);
} }
else { else {
gen(array, arrayType); // intrinsic method gen(array, arrayType); // intrinsic method