public IIROperand Translate(ILASTExpression expr, IRTranslator tr) { var callInfo = new InstrCallInfo("CALLVIRT") { Method = (IMethod)expr.Operand }; if (expr.Prefixes != null && expr.Prefixes[0].OpCode == OpCodes.Constrained) { callInfo.ConstrainType = (ITypeDefOrRef)expr.Prefixes[0].Operand; } tr.Instructions.Add(new IRInstruction(IROpCode.__BEGINCALL) { Annotation = callInfo }); var args = new IIROperand[expr.Arguments.Length]; for (var i = 0; i < args.Length; i++) { args[i] = tr.Translate(expr.Arguments[i]); tr.Instructions.Add(new IRInstruction(IROpCode.PUSH) { Operand1 = args[i], Annotation = callInfo }); } callInfo.Arguments = args; IIROperand retVal = null; if (expr.Type != null) { retVal = tr.Context.AllocateVRegister(expr.Type.Value); tr.Instructions.Add(new IRInstruction(IROpCode.__CALLVIRT) { Operand1 = new IRMetaTarget(callInfo.Method), Operand2 = retVal, Annotation = callInfo }); } else { tr.Instructions.Add(new IRInstruction(IROpCode.__CALLVIRT) { Operand1 = new IRMetaTarget(callInfo.Method), Annotation = callInfo }); } callInfo.ReturnValue = retVal; tr.Instructions.Add(new IRInstruction(IROpCode.__ENDCALL) { Annotation = callInfo }); return(retVal); }
public IIROperand Translate(ILASTExpression expr, IRTranslator tr) { var callInfo = new InstrCallInfo("NEWOBJ") { Method = (IMethod)expr.Operand }; tr.Instructions.Add(new IRInstruction(IROpCode.__BEGINCALL) { Annotation = callInfo }); var args = new IIROperand[expr.Arguments.Length]; for (var i = 0; i < args.Length; i++) { args[i] = tr.Translate(expr.Arguments[i]); tr.Instructions.Add(new IRInstruction(IROpCode.PUSH) { Operand1 = args[i], Annotation = callInfo }); } callInfo.Arguments = args; var retVal = tr.Context.AllocateVRegister(expr.Type.Value); tr.Instructions.Add(new IRInstruction(IROpCode.__NEWOBJ) { Operand1 = new IRMetaTarget(callInfo.Method), Operand2 = retVal, Annotation = callInfo }); callInfo.ReturnValue = retVal; tr.Instructions.Add(new IRInstruction(IROpCode.__ENDCALL) { Annotation = callInfo }); return(retVal); }