Пример #1
0
        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);
            }
        }
Пример #2
0
 public abstract void SetReferencedValue(Value val);
Пример #3
0
 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();
 }
Пример #4
0
        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));
            }
        }
Пример #5
0
        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));
        }
Пример #6
0
 public override void SetReferencedValue(Value val)
 {
     loc.Val = val;
 }
Пример #7
0
        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);
        }
Пример #8
0
 public static BTType GetValueBTType(Value val)
 {
     return (val as BTValue).BTType;
 }