public ActionResult Body(string person1, string person2, string animal, string exclamation, string personal, string verb, string noun) { BodyVariable myBodyVariable = new BodyVariable(); myBodyVariable.Person1 = person1; myBodyVariable.Person2 = person2; myBodyVariable.Animal = animal; myBodyVariable.Exclamation = exclamation; myBodyVariable.Personal = personal; myBodyVariable.Verb = verb; myBodyVariable.Noun = noun; return(View(myBodyVariable)); }
public override void Stage2RoutineBody() { var integer = Context.TypeSystem.Integer; var str = Context.TypeSystem.String; // add { var method = IntrinsicAdd; var ip = method.NativeMethod.Body.GetILProcessor(); var result = new BodyVariable(integer); method.NativeMethod.Body.InitLocals = true; // var result; // value type used by ref result.LoadA(ip); // lhs.value ip.Emit(OpCodes.Ldarg_0); ip.Emit(OpCodes.Ldfld, integer.ValueField); // rhs.value ip.Emit(OpCodes.Ldarg_1); ip.Emit(OpCodes.Ldfld, integer.ValueField); // lhs.value + rhs.value ip.Emit(OpCodes.Add); // result = new SLang$Integer(...) ip.Emit(OpCodes.Call, integer.Ctor); // return result result.Load(ip); ip.Emit(OpCodes.Ret); } // sub { var method = IntrinsicSub; var ip = method.NativeMethod.Body.GetILProcessor(); var result = new BodyVariable(integer); method.NativeMethod.Body.InitLocals = true; // var result; // value type used by ref result.LoadA(ip); // lhs.value ip.Emit(OpCodes.Ldarg_0); ip.Emit(OpCodes.Ldfld, integer.ValueField); // rhs.value ip.Emit(OpCodes.Ldarg_1); ip.Emit(OpCodes.Ldfld, integer.ValueField); // lhs.value - rhs.value ip.Emit(OpCodes.Sub); // result = new SLang$Integer(...) ip.Emit(OpCodes.Call, integer.Ctor); // return result result.Load(ip); ip.Emit(OpCodes.Ret); } // neg { var method = IntrinsicNeg; var ip = method.NativeMethod.Body.GetILProcessor(); var v = new BodyVariable(integer); method.NativeMethod.Body.InitLocals = true; // var result; // value type used by ref v.LoadA(ip); // self.value ip.Emit(OpCodes.Ldarg_0); ip.Emit(OpCodes.Ldfld, integer.ValueField); // -self.value ip.Emit(OpCodes.Neg); // result = new SLang$Integer(...) ip.Emit(OpCodes.Call, integer.Ctor); // return result v.Load(ip); ip.Emit(OpCodes.Ret); } // not { var method = IntrinsicNot; var ip = method.NativeMethod.Body.GetILProcessor(); var arg = new ArgumentVariable(integer, 0); // prepare argument arg.Load(ip); integer.Unboxed(ip); // prepare zero ip.Emit(OpCodes.Ldc_I4_0); // result = (arg == 0); ip.Emit(OpCodes.Ceq); var result = integer.Boxed(ip); // return result; result.Load(ip); ip.Emit(OpCodes.Ret); } // less than { var method = IntrinsicLessThan; var ip = method.NativeMethod.Body.GetILProcessor(); var lhs = new ArgumentVariable(integer, 0); var rhs = new ArgumentVariable(integer, 1); // prepare lhs lhs.Load(ip); integer.Unboxed(ip); // prepare rhs rhs.Load(ip); integer.Unboxed(ip); // result = lhs < rhs; ip.Emit(OpCodes.Clt); var result = integer.Boxed(ip); // return result; result.Load(ip); ip.Emit(OpCodes.Ret); } // greater than { var method = IntrinsicGreaterThan; var ip = method.NativeMethod.Body.GetILProcessor(); var lhs = new ArgumentVariable(integer, 0); var rhs = new ArgumentVariable(integer, 1); // prepare lhs lhs.Load(ip); integer.Unboxed(ip); // prepare rhs rhs.Load(ip); integer.Unboxed(ip); // result = lhs > rhs; ip.Emit(OpCodes.Cgt); var result = integer.Boxed(ip); // return result; result.Load(ip); ip.Emit(OpCodes.Ret); } // equal { var method = IntrinsicEqual; var ip = method.NativeMethod.Body.GetILProcessor(); var lhs = new ArgumentVariable(integer, 0); var rhs = new ArgumentVariable(integer, 1); // prepare lhs lhs.Load(ip); integer.Unboxed(ip); // prepare rhs rhs.Load(ip); integer.Unboxed(ip); // result = (lhs == rhs); ip.Emit(OpCodes.Ceq); var result = integer.Boxed(ip); // return result; result.Load(ip); ip.Emit(OpCodes.Ret); } // StandardIO$put$Integer { // direct proxy to void Console.Write(Int32) var method = StandardIO_put_Integer; var ip = method.NativeMethod.Body.GetILProcessor(); var writeForeign = consoleNativeType.Methods.Single( m => m.Name == nameof(Console.Write) && m.Parameters.Count == 1 && m.Parameters[0].ParameterType.Name == Context.TypeSystem.Integer.WrappedNativeType.Name); var writeImported = Context.NativeModule.ImportReference(writeForeign); // unbox argument new ArgumentVariable(integer, 0).Load(ip); integer.Unboxed(ip); // call method ip.Emit(OpCodes.Call, writeImported); // return nothing ip.Emit(OpCodes.Ret); } // StandardIO$put$String { // direct proxy to void Console.Write(String) var method = StandardIO_put_String; var ip = method.NativeMethod.Body.GetILProcessor(); var writeForeign = consoleNativeType.Methods.Single( m => m.Name == nameof(Console.Write) && m.Parameters.Count == 1 && m.Parameters[0].ParameterType.Name == Context.TypeSystem.String.WrappedNativeType.Name); var writeImported = Context.NativeModule.ImportReference(writeForeign); // unbox argument new ArgumentVariable(str, 0).Load(ip); str.Unboxed(ip); // call method ip.Emit(OpCodes.Call, writeImported); // return nothing ip.Emit(OpCodes.Ret); } base.Stage2RoutineBody(); }