コード例 #1
0
        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));
        }
コード例 #2
0
        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();
        }