예제 #1
0
        ILProperty ResolveNameExpression(NameExpression exp, uint dwTimeout)
        {
            ILProperty res = null;

            if (frame.Properties.TryGetValue(exp.Content, out res))
            {
                return(res);
            }
            uint threadHash;

            frame.Thread.GetThreadId(out threadHash);

            if (exp.IsRoot)
            {
                var info = frame.Engine.DebuggedProcess.ResolveVariable(null, exp.Content, (int)threadHash, dwTimeout);
                if (info == null)
                {
                    info          = new VariableInfo();
                    info.Name     = exp.Content;
                    info.Value    = "null";
                    info.TypeName = "null";
                }
                res = new AD7.ILProperty(frame.Engine, frame.Thread, info);
            }
            else
            {
                var info = VariableInfo.FromObject(null);
                info.Type = VariableTypes.FieldReference;
                info.Name = exp.Content;
                res       = new ILProperty(frame.Engine, frame.Thread, info);
            }
            return(res);
        }
예제 #2
0
        IProperty ResolveNameExpression(IStackFrame frame, NameExpression exp, uint dwTimeout)
        {
            IProperty res = frame.GetPropertyByName(exp.Content);

            if (res != null)
            {
                return(res);
            }
            if (exp.IsRoot)
            {
                var info = ResolveVariable(null, exp.Content, frame.ThreadID, frame.Index, dwTimeout);
                if (info == null)
                {
                    info          = new VariableInfo();
                    info.Name     = exp.Content;
                    info.Value    = "null";
                    info.TypeName = "null";
                }
                return(CreateProperty(frame, info));
            }
            else
            {
                var info = VariableInfo.FromObject(null);
                info.Type = VariableTypes.FieldReference;
                info.Name = exp.Content;
                return(CreateProperty(frame, info));
            }
        }
예제 #3
0
        ILProperty ResolveMemberAccessExpression(MemberAcessExpression exp, uint dwTimeout)
        {
            ILProperty body   = Resolve(exp.Body, dwTimeout);
            string     member = exp.Member;
            ILProperty prop;

            if (body != null)
            {
                if (!body.Children.TryGetValue(member, out prop))
                {
                    VariableReference reference = body.GetVariableReference();
                    if (reference != null)
                    {
                        uint threadHash;
                        frame.Thread.GetThreadId(out threadHash);

                        if (reference.Type < VariableTypes.Error)
                        {
                            if (exp.IsRoot)
                            {
                                var info = frame.Engine.DebuggedProcess.ResolveVariable(reference, member, (int)threadHash, dwTimeout);
                                prop                  = new AD7.ILProperty(frame.Engine, frame.Thread, info);
                                prop.Parent           = body;
                                body.Children[member] = prop;
                            }
                            else
                            {
                                var info = VariableInfo.FromObject(null);
                                info.Type   = VariableTypes.FieldReference;
                                info.Name   = member;
                                prop        = new ILProperty(frame.Engine, frame.Thread, info);
                                prop.Parent = body;
                            }
                        }
                        else if (reference.Type == VariableTypes.NotFound)
                        {
                            if (exp.IsRoot)
                            {
                                var info = frame.Engine.DebuggedProcess.ResolveVariable(null, reference.Name + "." + member, (int)threadHash, dwTimeout);
                                prop = new AD7.ILProperty(frame.Engine, frame.Thread, info);
                            }
                            else
                            {
                                var info = VariableInfo.FromObject(null);
                                info.Type = VariableTypes.FieldReference;
                                info.Name = reference.Name + "." + member;
                                prop      = new ILProperty(frame.Engine, frame.Thread, info);
                            }
                        }
                    }
                }
            }
            else
            {
                prop = new ILProperty(frame.Engine, frame.Thread, VariableInfo.NullReferenceExeption);
            }
            return(prop);
        }
예제 #4
0
        IProperty ResolveMemberAccessExpression(IStackFrame frame, MemberAcessExpression exp, uint dwTimeout)
        {
            IProperty body   = Resolve(frame, exp.Body, dwTimeout);
            string    member = exp.Member;
            IProperty prop   = null;

            if (body != null)
            {
                VariableReference reference = body.GetVariableReference();
                if (reference != null)
                {
                    if (reference.Type < VariableTypes.Error)
                    {
                        if (exp.IsRoot)
                        {
                            var info = ResolveVariable(reference, member, frame.ThreadID, frame.Index, dwTimeout);
                            prop        = CreateProperty(frame, info);
                            prop.Parent = body;
                        }
                        else
                        {
                            var info = VariableInfo.FromObject(null);
                            info.Type   = VariableTypes.FieldReference;
                            info.Name   = member;
                            prop        = CreateProperty(frame, info);
                            prop.Parent = body;
                        }
                    }
                    else if (reference.Type == VariableTypes.NotFound)
                    {
                        if (exp.IsRoot)
                        {
                            var info = ResolveVariable(null, reference.Name + "." + member, frame.ThreadID, frame.Index, dwTimeout);
                            prop = CreateProperty(frame, info);
                        }
                        else
                        {
                            var info = VariableInfo.FromObject(null);
                            info.Type = VariableTypes.FieldReference;
                            info.Name = reference.Name + "." + member;
                            prop      = CreateProperty(frame, info);
                        }
                    }
                }
            }
            else
            {
                prop = CreateProperty(frame, VariableInfo.NullReferenceExeption);
            }
            return(prop);
        }
예제 #5
0
        IProperty ResolveIndexAccessExpression(IStackFrame frame, IndexAccessExpression exp, uint dwTimeout)
        {
            IProperty body = Resolve(frame, exp.Body, dwTimeout);
            IProperty prop = null;

            if (body != null)
            {
                VariableReference reference = body.GetVariableReference();
                if (reference != null)
                {
                    uint threadHash;

                    if (reference.Type < VariableTypes.Error)
                    {
                        var idxExp            = exp.Index;
                        VariableReference idx = null;
                        if (idxExp is NameExpression)
                        {
                            int idxInt;
                            var content = ((NameExpression)idxExp).Content;
                            if (content == "true")
                            {
                                idx = VariableReference.True;
                            }
                            else if (content == "false")
                            {
                                idx = VariableReference.False;
                            }
                            else if (content == "null")
                            {
                                idx = VariableReference.Null;
                            }
                            else if (int.TryParse(content, out idxInt))
                            {
                                idx = VariableReference.GetInteger(idxInt);
                            }
                            else
                            {
                                var info = ResolveNameExpression(frame, (NameExpression)idxExp, dwTimeout);
                                idx = info.GetVariableReference();
                            }
                        }
                        else if (idxExp is StringLiteralExpression)
                        {
                            idx = VariableReference.GetString(((StringLiteralExpression)idxExp).Content);
                        }
                        else
                        {
                            var info = Resolve(frame, idxExp, dwTimeout);
                            idx = info.GetVariableReference();
                        }
                        if (idx != null && idx.Type < VariableTypes.Error)
                        {
                            if (exp.IsRoot)
                            {
                                var info = ResolveIndexAccess(reference, idx, frame.ThreadID, frame.Index, dwTimeout);
                                prop            = CreateProperty(frame, info);
                                prop.Parent     = body;
                                prop.Parameters = new VariableReference[] { idx };
                            }
                            else
                            {
                                var info = VariableInfo.FromObject(null);
                                info.Type       = VariableTypes.IndexAccess;
                                prop            = CreateProperty(frame, info);
                                prop.Parent     = body;
                                prop.Parameters = new VariableReference[] { idx };
                            }
                        }
                    }
                }
            }
            else
            {
                prop = CreateProperty(frame, VariableInfo.NullReferenceExeption);
            }
            return(prop);
        }