void CreateDebugeeStream()
        {
            Console.WriteLine ("Creating Debuggee-side memory stream");

            Mono.Debugger.StackFrame frame = thread.CurrentFrame;

            streamType = frame.Language.LookupType (frame, "System.IO.MemoryStream") as ITargetStructType;
            if (streamType == null)
                throw new Exception ("couldn't find type `System.IO.MemoryStream'");

            ITargetMethodInfo method = null;
            foreach (ITargetMethodInfo m in streamType.Constructors) {
                if (m.FullName == ".ctor()") {
                    method = m;
                    break;
                }
            }

            if (method == null)
                throw new Exception ("couldn't find applicable constructor for memory stream");

            ITargetFunctionObject ctor = streamType.GetConstructor (frame, method.Index);
            ITargetObject[] args = new ITargetObject[0];

            debugeeStream = ctor.Type.InvokeStatic (frame, args, false) as ITargetStructObject;
            if (debugeeStream == null)
                throw new Exception ("unable to create instance of memory stream");

            Console.WriteLine ("succeeded in creating debuggee-side memory stream");
        }
        public static ITargetMethodInfo OverloadResolve(EvaluationContext context,
								 ILanguage language,
								 ITargetStructType stype,
								 Expression[] types,
								 ArrayList candidates)
        {
            // We do a very simple overload resolution here
            ITargetType[] argtypes = new ITargetType [types.Length];
            for (int i = 0; i < types.Length; i++)
                argtypes [i] = types [i].EvaluateType (context);

            // Ok, no we need to find an exact match.
            ITargetMethodInfo match = null;
            foreach (ITargetMethodInfo method in candidates) {
                bool ok = true;
                for (int i = 0; i < types.Length; i++) {
                    if (method.Type.ParameterTypes [i].TypeHandle != argtypes [i].TypeHandle) {
                        ok = false;
                        break;
                    }
                }

                if (!ok)
                    continue;

                // We need to find exactly one match
                if (match != null)
                    return null;

                match = method;
            }

            return match;
        }
        // Create the debuggee-side object that we'll communicate with
        void CreateVisualizerObjectSource(string sourceType)
        {
            Console.WriteLine ("Creating Debuggee-side object (of type {0})", sourceType);

            Mono.Debugger.StackFrame frame = thread.CurrentFrame;

            // shouldn't be hardcoded - it comes from the attribute
            objectSourceType = frame.Language.LookupType (frame, sourceType) as ITargetStructType;
            if (objectSourceType == null)
                throw new Exception ("couldn't find type for object source");

            ITargetMethodInfo method = null;
            foreach (ITargetMethodInfo m in objectSourceType.Constructors) {
                if (m.FullName == ".ctor()") {
                    method = m;
                    break;
                }
            }

            if (method == null)
                throw new Exception ("couldn't find applicable constructor for object source");

            ITargetFunctionObject ctor = objectSourceType.GetConstructor (frame, method.Index);
            ITargetObject[] args = new ITargetObject[0];

            objectSource = ctor.Type.InvokeStatic (frame, args, false) as ITargetStructObject;
            if (objectSource == null)
                throw new Exception ("unable to create instance of object source");

            Console.WriteLine ("succeeded in creating debuggee-side object source");
        }
 protected ITargetObject GetStaticProperty(ITargetStructType stype, StackFrame frame, ITargetPropertyInfo property)
 {
     try {
         return stype.GetStaticProperty (frame, property.Index);
     } catch (Mono.Debugger.TargetInvocationException ex) {
         throw new EvaluationException ("Can't get property {0}: {1}", Name, ex.Message);
     }
 }
        public MethodGroupExpression(ITargetStructType stype, string name,
					      ITargetStructObject instance,
					      ILanguage language, ArrayList methods)
        {
            this.stype = stype;
            this.instance = instance;
            this.language = language;
            this.name = name;
            this.methods = methods;
            resolved = true;
        }
 protected ITargetObject GetStaticField(ITargetStructType stype, StackFrame frame, ITargetFieldInfo field)
 {
     try {
         return stype.GetStaticField (frame, field.Index);
     } catch (Mono.Debugger.TargetInvocationException ex) {
         throw new EvaluationException ("Can't get field {0}: {1}", Name, ex.Message);
     }
 }
 protected ITargetObject GetStaticMember(ITargetStructType stype, StackFrame frame, ITargetMemberInfo member)
 {
     if (member is ITargetPropertyInfo)
         return GetStaticProperty (stype, frame, (ITargetPropertyInfo) member);
     else if (member is ITargetEventInfo)
         return GetStaticEvent (stype, frame, (ITargetEventInfo) member);
     else
         return GetStaticField (stype, frame, (ITargetFieldInfo) member);
 }
 protected ITargetObject GetStaticEvent(ITargetStructType stype, StackFrame frame, ITargetEventInfo ev)
 {
     try {
         return stype.GetStaticEvent (frame, ev.Index);
     } catch (Mono.Debugger.TargetInvocationException ex) {
         throw new EvaluationException ("Can't get event {0}: {1}", Name, ex.Message);
     }
 }
        public static Expression FindMember(ITargetStructType stype, StackFrame frame,
						     ITargetStructObject instance, bool allow_instance,
						     string name)
        {
            ITargetMemberInfo member = FindMember (stype, (instance == null) && !allow_instance, name);
            if (member != null) {
                if (instance != null)
                    return new StructAccessExpression (frame, instance, name);
                else
                    return new StructAccessExpression (frame, stype, name);
            }

            ArrayList methods = new ArrayList ();

            again:
            if (name == ".ctor") {
                foreach (ITargetMethodInfo method in stype.Constructors) {
                    methods.Add (method);
                }
            }
            else if (name == ".cctor") {
                foreach (ITargetMethodInfo method in stype.StaticConstructors) {
                    methods.Add (method);
                }
            }
            else {
                if ((instance != null) || allow_instance) {
                    foreach (ITargetMethodInfo method in stype.Methods) {
                        if (method.Name != name)
                            continue;

                        methods.Add (method);
                    }
                }

                foreach (ITargetMethodInfo method in stype.StaticMethods) {
                    if (method.Name != name)
                        continue;

                    methods.Add (method);
                }
            }

            if (methods.Count > 0)
                return new MethodGroupExpression (
                    stype, name, instance, frame.Language, methods);

            ITargetClassType ctype = stype as ITargetClassType;
            if ((ctype != null) && ctype.HasParent) {
                stype = ctype.ParentType;
                goto again;
            }

            return null;
        }
        public static ITargetMemberInfo FindMember(ITargetStructType stype, bool is_static, string name)
        {
            if (!is_static) {
                foreach (ITargetFieldInfo field in stype.Fields)
                    if (field.Name == name)
                        return field;

                foreach (ITargetPropertyInfo property in stype.Properties)
                    if (property.Name == name)
                        return property;

                foreach (ITargetEventInfo ev in stype.Events)
                    if (ev.Name == name)
                        return ev;
            }

            foreach (ITargetFieldInfo field in stype.StaticFields)
                if (field.Name == name)
                    return field;

            foreach (ITargetPropertyInfo property in stype.StaticProperties)
                if (property.Name == name)
                    return property;

            foreach (ITargetEventInfo ev in stype.StaticEvents)
                if (ev.Name == name)
                    return ev;

            return null;
        }
        protected StructAccessExpression(StackFrame frame,
						  ITargetStructObject instance,
						  string identifier)
        {
            this.Frame = frame;
            this.Type = instance.Type;
            this.Instance = instance;
            this.Identifier = identifier;
            this.IsStatic = false;
            resolved = true;
        }
        protected StructAccessExpression(StackFrame frame, ITargetStructType type,
						  string identifier)
        {
            this.Frame = frame;
            this.Type = type;
            this.Identifier = identifier;
            this.IsStatic = true;
            resolved = true;
        }