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); }
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)); } }
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); }
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); }
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); }