Don't use ExpressionCodegen's internals in MonitorInstruction

This commit is contained in:
Alexander Udalov
2014-06-27 23:17:55 +04:00
parent f425adfb71
commit d95cb82f36
2 changed files with 19 additions and 9 deletions
@@ -2309,7 +2309,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
return false; return false;
} }
public int pushMethodArgumentsWithCallReceiver( private int pushMethodArgumentsWithCallReceiver(
@Nullable StackValue receiver, @Nullable StackValue receiver,
@NotNull ResolvedCall<?> resolvedCall, @NotNull ResolvedCall<?> resolvedCall,
@NotNull CallableMethod callableMethod, @NotNull CallableMethod callableMethod,
@@ -2328,7 +2328,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
return pushMethodArgumentsWithoutCallReceiver(resolvedCall, callableMethod.getValueParameterTypes(), skipLast, callGenerator); return pushMethodArgumentsWithoutCallReceiver(resolvedCall, callableMethod.getValueParameterTypes(), skipLast, callGenerator);
} }
public int pushMethodArgumentsWithoutCallReceiver( private int pushMethodArgumentsWithoutCallReceiver(
@NotNull ResolvedCall<?> resolvedCall, @NotNull ResolvedCall<?> resolvedCall,
List<Type> valueParameterTypes, List<Type> valueParameterTypes,
boolean skipLast, boolean skipLast,
@@ -23,11 +23,14 @@ import org.jetbrains.jet.codegen.ExpressionCodegen;
import org.jetbrains.jet.codegen.StackValue; import org.jetbrains.jet.codegen.StackValue;
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.psi.ValueArgument;
import org.jetbrains.jet.lang.resolve.calls.model.ExpressionValueArgument;
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedValueArgument;
import org.jetbrains.org.objectweb.asm.Opcodes; import org.jetbrains.org.objectweb.asm.Opcodes;
import org.jetbrains.org.objectweb.asm.Type; import org.jetbrains.org.objectweb.asm.Type;
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter; import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter;
import java.util.Arrays;
import java.util.List; import java.util.List;
import static org.jetbrains.jet.lang.resolve.bindingContextUtil.BindingContextUtilPackage.getResolvedCallWithAssert; import static org.jetbrains.jet.lang.resolve.bindingContextUtil.BindingContextUtilPackage.getResolvedCallWithAssert;
@@ -56,12 +59,19 @@ public class MonitorInstruction extends IntrinsicMethod {
) { ) {
assert element != null : "Element should not be null"; assert element != null : "Element should not be null";
codegen.pushMethodArgumentsWithoutCallReceiver( ResolvedCall<?> resolvedCall = getResolvedCallWithAssert((JetElement) element, codegen.getBindingContext());
getResolvedCallWithAssert((JetElement) element, codegen.getBindingContext()),
Arrays.asList(OBJECT_TYPE), List<ResolvedValueArgument> resolvedArguments = resolvedCall.getValueArgumentsByIndex();
false, assert resolvedArguments != null && resolvedArguments.size() == 1 :
codegen.defaultCallGenerator "Monitor instruction (" + opcode + ") should have exactly 1 argument: " + resolvedArguments;
);
ResolvedValueArgument argument = resolvedArguments.get(0);
assert argument instanceof ExpressionValueArgument :
"Monitor instruction (" + opcode + ") should have expression value argument: " + argument;
ValueArgument valueArgument = ((ExpressionValueArgument) argument).getValueArgument();
assert valueArgument != null : "Unresolved value argument: " + argument;
codegen.gen(valueArgument.getArgumentExpression(), OBJECT_TYPE);
v.visitInsn(opcode); v.visitInsn(opcode);
return Type.VOID_TYPE; return Type.VOID_TYPE;