Don't use ExpressionCodegen's internals in MonitorInstruction
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user