public static Variable CreateTemp(Type type, Instruction defineInstr) { var var = new Variable { Name = "t" + (_tempVarId++), SymType = SymbolType.ST_TEMP, ValType = type, DefineInstruction = defineInstr }; return var; }
private Variable ComputeTempVar(Expression exp, OpCode code, Variable[] sources) { Instruction inst; if (_indexedInsts.TryGetValue(exp, out inst)) return inst.Destinations[0]; inst = new Instruction(code); _indexedInsts.Add(exp, inst); _insts.Add(inst); foreach (var s in sources) inst.Sources.Add(s); var d = Variable.CreateTemp(exp.Type, inst); inst.Destinations.Add(d); return d; }
public static Variable CreateLocal(string name, Type type, Instruction defineInstr) { var var = new Variable { Name = name, SymType = SymbolType.ST_LOCAL, ValType = type, DefineInstruction = defineInstr }; return var; }
public static Variable CreateConstant(Type type, object value) { var var = new Variable { Name = "c" + (_constVarId++), SymType = SymbolType.ST_CONSTANT, ValType = type, ConstantValue = value }; return var; }
public static Variable CreateParam(string name, Type type) { var var = new Variable { Name = name, SymType = SymbolType.ST_PARAMETER, ValType = type }; return var; }
private Variable VisitMemberBinding(Variable host, MemberBinding node) { switch (node.BindingType) { case MemberBindingType.Assignment: return VisitMemberAssignment(host, (MemberAssignment)node); case MemberBindingType.MemberBinding: return VisitMemberMemberBinding(host, (MemberMemberBinding)node); case MemberBindingType.ListBinding: return VisitMemberListBinding(host, (MemberListBinding)node); default: throw new ArgumentException("Error.UnhandledBindingType(node.BindingType);"); } //throw Error.UnhandledBindingType(node.BindingType); //throw new System.ArgumentException("Error.UnhandledBindingType(node.BindingType);"); }
private Variable VisitMemberMemberBinding(Variable host, MemberMemberBinding binding) { throw new NotSupportedException(); //this.Out(binding.Member.Name); //this.Out(" = {"); //int num = 0; //int count = binding.Bindings.Count; //while (num < count) //{ // if (num > 0) // { // this.Out(", "); // } // this.VisitMemberBinding(binding.Bindings[num]); // num++; //} //this.Out("}"); }
private Variable VisitMemberAssignment(Variable host, MemberAssignment assignment) { var inst = CreateNonIndexedInstruction(OpCode.MemberWrite); var val = Visit(assignment.Expression); inst.Destinations.Add(host); inst.Destinations.Add(Variable.CreateConstant(typeof(string), assignment.Member.Name)); inst.Sources.Add(val); return val; }