private Value DoGetValue(LiveStackFrame frame) { Value result = null; // First try locals. LocalVariable[] locals = frame.Method.GetLocals(); LocalVariable local = locals.FirstOrDefault(l => l.Name == m_name); if (local != null) { result = frame.GetValue(local); } // Then parameters. ParameterInfoMirror parm = frame.Method.GetParameters().FirstOrDefault(p => p.Name == m_name); if (parm != null) { result = frame.GetValue(parm); } // And finally fields and properties. if (result == null) { Value thisPtr = frame.ThisPtr; result = EvalMember.Evaluate(frame.Thread, thisPtr, m_name); } if (result == null) throw new Exception("Couldn't find a local, argument, field, or property named " + m_name); return result; }
public static VariableItem GetChild(ThreadMirror thread, VariableItem parentItem, LiveStackFrame parent, int index) { VariableItem child; IList<LocalVariable> locals = parent.GetVisibleVariables(); if (index < locals.Count) { LocalVariable local = locals[index]; string name = local.Name; if (string.IsNullOrEmpty(name)) name = "$" + local.Index; // temporary variable Value v = parent.GetValue(local); child = new VariableItem(thread, name, parentItem, local, v, index); } else { FieldInfoMirror[] fields = parent.Method.DeclaringType.GetAllFields().ToArray(); Contract.Assert(fields.Length > 0); object v = null; string name = "this"; if (parent.ThisPtr is ObjectMirror) { v = new InstanceValue((ObjectMirror) parent.ThisPtr, fields); } else if (parent.ThisPtr is StructMirror) { v = new InstanceValue((StructMirror) parent.ThisPtr, fields); } else if (parent.ThisPtr == null || parent.ThisPtr.IsNull()) { v = new TypeValue(parent.Method.DeclaringType); name = "statics"; } else { Contract.Assert(false, parent.ThisPtr.TypeName() + " is bogus"); } child = new VariableItem(thread, name, parentItem, index, v, index); } return child; }