Пример #1
0
        protected override void VisitCallMethod(CallMethod node, object data)
        {
            ParameterValues paramVals =
                state.Stack.Perform_CallMethod(node.Method,node.IsVirtCall);

            if (node.IsVirtCall)
                paramVals.ChooseVirtualMethod();

            Exception exc = null;
            Value retVal = null;

            if (holder.ContainsMethodBody(paramVals.Method))
                retVal = InterpretMethod(holder,holder[paramVals.Method],paramVals,out exc,indent+"    ");
            else
                retVal = paramVals.Invoke(out exc);

            if (exc == null)
            {
                if (retVal != null)
                    state.Stack.Push(retVal);
                AddTask(node.Next);
            }
            else
                HandleException(node,exc);
        }
Пример #2
0
 public override Node Clone()
 {
     CallMethod newNode = new CallMethod(method.Method,isVirtCall,isTailCall);
     newNode.Options.CopyFrom(Options);
     return(newNode); //Andrew: MBB!
 }
Пример #3
0
 protected internal virtual void VisitCallMethod(CallMethod node, object data)
 {
     throw new NodeNotSupportedException(node);
 }
Пример #4
0
 protected internal override void VisitCallMethod(CallMethod node, object data)
 {
     StackTypes stack = data as StackTypes;
     Verifier.ProcessCallOrNewobj(node.MethodWithParams, stack, false);
     AddTask(node.Next,stack);
     if(node.IsTailCall && !IsRet(node.Next))
         throw new VerifierException();
 }
Пример #5
0
        protected override void VisitNewObject(NewObject downNode, object o)
        {
            PointerToNode ptrUpNode = (o as Data).PointerToNode;
            AnnotatedMethod method = Annotation.GetAnnotatedMethod(downNode);

            Node upNode;
            ArrayList list = new ArrayList();
            for (int i = method.ParamVals.Count - 1; i > 0; i--)
                if (Annotation.GetValueBTType(method.ParamVals[i].Val) == BTType.Static)
                    list.Add(this.state.Stack.Pop());
            if (Annotation.GetValueBTType(method.ParamVals[0].Val) == BTType.Static)
            {
                Type objtype = downNode.Constructor.DeclaringType;
                ObjectReferenceValue obj = new ObjectReferenceValue(FormatterServices.GetUninitializedObject(objtype));
                FieldInfo[] fldInfos = ReflectionUtils.GetAllFields(objtype);
                BTType[] btTypes = Annotation.GetObjectFieldBTTypes(downNode);
                for (int i = 0; i < fldInfos.Length; i++)
                    if (btTypes[i] == BTType.Dynamic)
                    {
                        Variable varUp = this.mbbUp.Variables.CreateVar(fldInfos[i].FieldType, VariableKind.Local);
                        this.varsHash[new PointerToObjectFieldValue(obj.Obj, fldInfos[i])] = varUp;
                        ptrUpNode = SpecializingVisitor.initVariable(varUp, ptrUpNode);
                    }
                list.Add(obj);
                this.state.Stack.Push(obj);
                upNode = new CallMethod(downNode.Constructor, false, false);
            }
            else
                upNode = new NewObject(downNode.Constructor);
            list.Reverse();
            Value[] args = list.ToArray(typeof(Value)) as Value[];

            this.callMethod(downNode, method, ptrUpNode, upNode, args);
        }
Пример #6
0
        protected override void VisitCallMethod(CallMethod downNode, object o)
        {
            PointerToNode ptrUpNode = (o as Data).PointerToNode;
            bool isVirtCall = downNode.IsVirtCall && downNode.Method.IsVirtual;

            AnnotatedMethod aMethod;
            if (isVirtCall)
                aMethod = Annotation.GetAnyAnnotatedMethod(downNode);
            else
                aMethod = Annotation.GetAnnotatedMethod(downNode);

            ArrayList list = new ArrayList();
            for (int i = aMethod.ParamVals.Count - 1; i >= 0; i--)
                if (Annotation.GetValueBTType(aMethod.ParamVals[i].Val) == BTType.Static)
                    list.Add(this.state.Stack.Pop());
            list.Reverse();
            Value[] args = list.ToArray(typeof(Value)) as Value[];

            MethodBase sMethod;
            if (isVirtCall)
                sMethod = (aMethod = Annotation.GetAnnotatedMethod(downNode, args[0].Type)).SourceMethod;
            else
                sMethod = aMethod.SourceMethod;

            this.callMethod(downNode, aMethod, ptrUpNode, new CallMethod(sMethod, false, downNode.IsTailCall), args);
        }
Пример #7
0
        protected override void VisitCallMethod(CallMethod upNode, object o)
        {
            State state = o as State;
            ParameterValues paramVals = state.Stack.Perform_CallMethod(upNode.Method, upNode.IsVirtCall);
            AnnotatingVisitor.patchUpParamVals(paramVals);
            Type retType = Annotation.GetReturnType(paramVals.Method);
            ReferenceBTValue ret = AnnotatingVisitor.getReturnValue(upNode);
            if (ret == null)
            {
                ret = ReferenceBTValue.NewReferenceBTValue(retType, BTType.Static);
                AnnotatingVisitor.setReturnValue(upNode, ret);
            }

            this.callMethod(upNode, paramVals, ret, upNode.IsVirtCall && upNode.Method.IsVirtual);
            if (ret != null)
            {
                ret.Creators[this].AddCreator(upNode);
                state.Stack.Push(ret.ToStack(retType));
            }
        }
Пример #8
0
 protected override void VisitCallMethod(CallMethod upNode, object o)
 {
     DepthContainer cnt = o as DepthContainer;
     cnt.Depth += ParameterValues.GetParametersNumber(upNode.Method) - (Annotation.GetReturnType(upNode.Method) != typeof(void) ? 1 : 0);
 }
Пример #9
0
            protected internal override void VisitCallMethod(CallMethod node, object data)
            {
                if(HasPseudoParameter(node))
                    generator.Emit(OpCodes.Ldnull);

                OpCode code = node.IsVirtCall ?  OpCodes.Callvirt : OpCodes.Call;
                if(node.Method is MethodInfo)
                    generator.Emit(code,node.Method as MethodInfo);
                else
                    generator.Emit(code,node.Method as ConstructorInfo);
                AddTask(node.Next,null);
            }