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 + ")"); } }