Inline ExpressionCodegen#pushMethodArguments, drop "skipLast" hack
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user