private void callMethod(Node downNode, AnnotatedMethod method, PointerToNode ptrUpNode, Node upNode, Value[] args) { if (method.SourceMethod.IsDefined(typeof(InlineAttribute), false) && ! (upNode is NewObject)) { MethodBodyBlock mbbDown = this.holder.AnnotatedHolder[method]; SpecState state = new SpecState(mbbDown.Variables.Count); int varCount = 0; int argCount = 0; foreach (Variable varDown in mbbDown.Variables.ParameterMapper) { state.Pool[varDown] = new Location(varDown.Type); Variable varUp = this.mbbUp.Variables.CreateVar(varDown.Type, VariableKind.Local); this.varsHash[new PointerToLocationValue(state.Pool[varDown])] = varUp; if (Annotation.GetValueBTType(method.ParamVals[varCount++].Val) == BTType.Static) { state.Pool[varDown].Val = args[argCount]; state.Stack.Push(args[argCount++]); } else { Node upNext = new StoreVar(varUp); Node upPrevNext = ptrUpNode.Node; ptrUpNode.Node = upNext; upNext.Next = upPrevNext; } } while (ptrUpNode.Node != null) ptrUpNode = new PointerToNode(ptrUpNode.Node); foreach (Variable varDown in mbbDown.Variables) if (! state.Pool.ContainsVar(varDown)) { state.Pool[varDown] = new Location(varDown.Type); Variable varUp = this.mbbUp.Variables.CreateVar(varDown.Type, VariableKind.Local); this.varsHash[new PointerToLocationValue(state.Pool[varDown])] = varUp; ptrUpNode = SpecializingVisitor.initVariable(varUp, ptrUpNode); } int depth = state.Stack.Count + 1; GraphProcessor graphProc = new GraphProcessor(); SpecializingVisitor visitor = new SpecializingVisitor(graphProc, this.holder, this.mbbUp, state, this.varsHash); visitor.AddTask(mbbDown.Next, ptrUpNode); graphProc.Process(); foreach (Data newData in visitor.exitData) { state.Recall(newData.MemoSpecState, newData.ObjectHashtable); if (state.Stack.Count == depth) this.state.Stack.Push(state.Stack.Pop()); this.AddTask(downNode.Next, newData.PointerToNode); } } else { ObjectHashtable objHash = new ObjectHashtable(); MemoState memoArgs = new MemoState(args, objHash); PointerValue[] ptrs = this.varsHash.GetPointers(objHash); for (int i = 0; i < ptrs.Length; i++) ptrUpNode = new PointerToNode(ptrUpNode.Node = new LoadVarAddr(this.varsHash[ptrs[i]])); ptrUpNode = new PointerToNode(ptrUpNode.Node = upNode); ResidualMethod callMethod = new ResidualMethod(method, memoArgs, args, ptrs); Specialization.SetResidualMethod(upNode, callMethod); this.holder.SpecializeMethod(callMethod); this.AddTask(downNode.Next, ptrUpNode); } }
public abstract void SetReferencedValue(Value val);
private static Node liftValue(Value val) { if (val is StructValue) return new LoadConst((val as StructValue).Obj); else if (val is NullValue) return new LoadConst(null); else if (val is ObjectReferenceValue && val.Type == typeof(string)) return new LoadConst((val as ObjectReferenceValue).Obj); else throw new IncorrectBTAnnotationException(); }
public override void SetReferencedValue(Value val) { Type t = obj.GetType(); StructValue structVal = val.FromStack(t) as StructValue; if (structVal.IsPrimitive) DataModelUtils.StoreToBox(obj,(int)(StructValue.getTypeIndex(t)),structVal.Obj); else { FieldInfo[] fields = obj.GetType().GetFields((BindingFlags) (BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) ); foreach (FieldInfo field in fields) field.SetValue(obj,field.GetValue(structVal.Obj)); } }
public override void SetReferencedValue(Value val) { object obj = ptr.GetReferencedObject(); val = val.FromStack(field.FieldType); object valObj = null; if (val is StructValue) valObj = (val as StructValue).Obj; else if (val is ObjectReferenceValue) valObj = (val as ObjectReferenceValue).Obj; else if (val is NullValue) valObj = null; field.SetValue(obj,valObj); ptr.SetReferencedValue(new StructValue(obj as ValueType)); }
public override void SetReferencedValue(Value val) { loc.Val = val; }
public override void SetReferencedValue(Value val) { val = val.FromStack(type); object valObj = null; if (val is StructValue) valObj = (val as StructValue).Obj; else if (val is ObjectReferenceValue) valObj = (val as ObjectReferenceValue).Obj; else if (val is NullValue) valObj = null; arr.SetValue(valObj,index); }
public static BTType GetValueBTType(Value val) { return (val as BTValue).BTType; }