Пример #1
0
        public override void Create()
        {
            //foreach (var v in value)v.Create();

            if (funcName.ILValue == "CAST")
            {
                foreach (var v in value)
                {
                    v.Create();
                }
                switch (returnType.ILValue)
                {
                case "float32": ILGen.AddInstruct(Instruction.conv_r4); return;

                case "float64": ILGen.AddInstruct(Instruction.conv_r8); return;
                }
            }

            else if (funcName.ILValue == "COND")
            {
                var b = value[0] as BoolTree;


                b.left.Create();

                b.right.Create();
                var c1 = ILGen.ILNumber + 1;
                var c2 = ILGen.ILNumber + 2;
                ILGen.AddPreserved(c1);
                ILGen.AddPreserved(c2);


                switch (b.Op.ToString())
                {
                case ">":
                    ILGen.AddInstruct(Instruction.bgt_s, ILGen.GetILNumber(c1)); break;

                case "<":
                    ILGen.AddInstruct(Instruction.blt_s, ILGen.GetILNumber(c1)); break;

                case "<=":
                    ILGen.AddInstruct(Instruction.ble_s, ILGen.GetILNumber(c1));
                    break;

                case ">=":
                    ILGen.AddInstruct(Instruction.bge_s, ILGen.GetILNumber(c1));
                    break;

                case "==":
                    ILGen.AddInstruct(Instruction.beq_s, ILGen.GetILNumber(c1));
                    break;

                case "!=":
                    ILGen.AddInstruct(Instruction.bne_s, ILGen.GetILNumber(c1));
                    break;
                }

                value[2].Create();
                ILGen.AddInstruct(Instruction.br_s, ILGen.GetILNumber(c2));
                ILGen.UsePreserverd(c1);
                value[1].Create();
                ILGen.UsePreserverd(c2);
                ILGen.AddInstruct(Instruction.nop);
            }
            else
            {
                foreach (var v in value)
                {
                    v.Create();
                }
                var paramtypes = "";
                foreach (var a in arguments)
                {
                    paramtypes += a.ILValue + ",";
                }
                paramtypes = paramtypes.Remove(paramtypes.LastIndexOf(",", StringComparison.Ordinal), 1);
                ILGen.AddInstruct(Instruction.call,
                                  returnType.ILValue + " " + (isSystemFunction ? "[mscorlib]" : "") + funcName.ILValue + "(" +
                                  paramtypes + ")");
            }
        }