Minor cleanup in ExpressionCodegen#pushMethodArguments

This commit is contained in:
Alexander Udalov
2014-06-27 22:42:55 +04:00
parent fc89424295
commit f425adfb71
2 changed files with 24 additions and 25 deletions
@@ -2341,47 +2341,44 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
} }
List<ValueParameterDescriptor> valueParameters = fd.getValueParameters(); List<ValueParameterDescriptor> valueParameters = fd.getValueParameters();
if (valueParameters.size() != valueArguments.size()) { int n = valueParameters.size();
throw new IllegalStateException("Parameters and arguments size mismatch: " + valueParameters.size() + " != " + valueArguments.size()); if (n != valueArguments.size()) {
throw new IllegalStateException("Parameters and arguments size mismatch: " + n + " != " + valueArguments.size());
} }
int mask = 0; int mask = 0;
for (Iterator<ValueParameterDescriptor> iterator = valueParameters.iterator(); iterator.hasNext(); ) { for (int i = 0; i < n; i++) {
ValueParameterDescriptor valueParameter = iterator.next(); if (skipLast && i == n - 1) break;
if (skipLast && !iterator.hasNext()) {
continue;
}
ResolvedValueArgument resolvedValueArgument = valueArguments.get(valueParameter.getIndex()); ValueParameterDescriptor valueParameter = valueParameters.get(i);
Type parameterType = valueParameterTypes.get(valueParameter.getIndex()); ResolvedValueArgument argument = valueArguments.get(i);
if (resolvedValueArgument instanceof ExpressionValueArgument) { Type parameterType = valueParameterTypes.get(i);
ValueArgument valueArgument = ((ExpressionValueArgument) resolvedValueArgument).getValueArgument(); if (argument instanceof ExpressionValueArgument) {
ValueArgument valueArgument = ((ExpressionValueArgument) argument).getValueArgument();
assert valueArgument != null; assert valueArgument != null;
JetExpression argumentExpression = valueArgument.getArgumentExpression(); JetExpression argumentExpression = valueArgument.getArgumentExpression();
assert argumentExpression != null : valueArgument.asElement().getText(); assert argumentExpression != null : valueArgument.asElement().getText();
callGenerator.genValueAndPut(valueParameter, argumentExpression, parameterType); callGenerator.genValueAndPut(valueParameter, argumentExpression, parameterType);
} else if (resolvedValueArgument instanceof DefaultValueArgument) { }
else if (argument instanceof DefaultValueArgument) {
pushDefaultValueOnStack(parameterType, v); pushDefaultValueOnStack(parameterType, v);
mask |= (1 << valueParameter.getIndex()); mask |= 1 << i;
callGenerator.afterParameterPut(parameterType, null, valueParameter); callGenerator.afterParameterPut(parameterType, null, valueParameter);
} }
else if (resolvedValueArgument instanceof VarargValueArgument) { else if (argument instanceof VarargValueArgument) {
VarargValueArgument valueArgument = (VarargValueArgument) resolvedValueArgument; genVarargs((VarargValueArgument) argument, valueParameter.getType());
genVarargs(valueParameter, valueArgument);
callGenerator.afterParameterPut(parameterType, null, valueParameter); callGenerator.afterParameterPut(parameterType, null, valueParameter);
} }
else { else {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException("Unsupported value argument: " + argument);
} }
} }
return mask; return mask;
} }
public void genVarargs(ValueParameterDescriptor valueParameterDescriptor, VarargValueArgument valueArgument) { public void genVarargs(@NotNull VarargValueArgument valueArgument, @NotNull JetType outType) {
JetType outType = valueParameterDescriptor.getType();
Type type = asmType(outType); Type type = asmType(outType);
assert type.getSort() == Type.ARRAY; assert type.getSort() == Type.ARRAY;
Type elementType = correctElementType(type); Type elementType = correctElementType(type);
@@ -24,7 +24,6 @@ import org.jetbrains.jet.codegen.StackValue;
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
import org.jetbrains.jet.lang.psi.JetElement; import org.jetbrains.jet.lang.psi.JetElement;
import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.resolve.bindingContextUtil.BindingContextUtilPackage;
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedValueArgument; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedValueArgument;
import org.jetbrains.jet.lang.resolve.calls.model.VarargValueArgument; import org.jetbrains.jet.lang.resolve.calls.model.VarargValueArgument;
@@ -34,6 +33,8 @@ import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import static org.jetbrains.jet.lang.resolve.bindingContextUtil.BindingContextUtilPackage.getResolvedCallWithAssert;
public class JavaClassArray extends IntrinsicMethod { public class JavaClassArray extends IntrinsicMethod {
@NotNull @NotNull
@Override @Override
@@ -45,9 +46,10 @@ public class JavaClassArray extends IntrinsicMethod {
@Nullable List<JetExpression> arguments, @Nullable List<JetExpression> arguments,
StackValue receiver StackValue receiver
) { ) {
ResolvedCall<?> call = BindingContextUtilPackage.getResolvedCallWithAssert((JetElement) element, codegen.getBindingContext()); assert element != null : "Element should not be null";
Map.Entry<ValueParameterDescriptor, ResolvedValueArgument> next = call.getValueArguments().entrySet().iterator().next(); ResolvedCall<?> resolvedCall = getResolvedCallWithAssert((JetElement) element, codegen.getBindingContext());
codegen.genVarargs(next.getKey(), (VarargValueArgument) next.getValue()); Map.Entry<ValueParameterDescriptor, ResolvedValueArgument> argument = resolvedCall.getValueArguments().entrySet().iterator().next();
codegen.genVarargs((VarargValueArgument) argument.getValue(), argument.getKey().getType());
return returnType; return returnType;
} }
} }