Пример #1
0
        public override TargetClass ForceClassInitialization(Thread thread)
        {
            if (class_info != null)
            {
                return(class_info);
            }

            thread.ThreadServant.DoTargetAccess(
                delegate(TargetMemoryAccess target) {
                class_info = ResolveClass(target, false);
                return(class_info);
            });

            if (class_info != null)
            {
                return(class_info);
            }

            TargetAddress image = file.MonoImage;

            TargetAddress klass = thread.CallMethod(
                file.MonoLanguage.MonoDebuggerInfo.LookupClass, image, 0, 0,
                Name);

            return((TargetClass)thread.ThreadServant.DoTargetAccess(
                       delegate(TargetMemoryAccess target) {
                class_info = MonoClassInfo.ReadClassInfo(
                    file.MonoLanguage, target, klass);
                return class_info;
            }));
        }
Пример #2
0
        public override TargetMethodSignature GetSignature(Thread thread)
        {
            if (signature != null)
            {
                return(signature);
            }

            if (!ContainsGenericParameters)
            {
                return(new MonoMethodSignature(return_type, parameter_types));
            }

            if (!thread.CurrentFrame.Language.IsManaged)
            {
                throw new TargetException(TargetError.InvalidContext);
            }

            TargetAddress addr = (TargetAddress)thread.ThreadServant.DoTargetAccess(
                delegate(TargetMemoryAccess target)  {
                MonoClassInfo class_info = ResolveClass(target, true);
                return(class_info.GetMethodAddress(target, token));
            });

            MonoLanguageBackend mono = klass.File.MonoLanguage;

            TargetAddress sig = thread.CallMethod(
                mono.MonoDebuggerInfo.GetMethodSignature, addr, 0);

            signature = (MonoMethodSignature)thread.ThreadServant.DoTargetAccess(
                delegate(TargetMemoryAccess target)  {
                return(mono.MetadataHelper.GetMethodSignature(mono, target, sig));
            });

            return(signature);
        }
Пример #3
0
        internal TargetObject GetStaticField(Thread thread, TargetFieldInfo field)
        {
            if (!thread.CurrentFrame.Language.IsManaged)
            {
                throw new TargetException(TargetError.InvalidContext);
            }

            TargetAddress data_address = thread.CallMethod(
                SymbolFile.MonoLanguage.MonoDebuggerInfo.ClassGetStaticFieldData,
                KlassAddress, 0);

            return((TargetObject)thread.ThreadServant.DoTargetAccess(
                       delegate(TargetMemoryAccess target) {
                return GetStaticField(target, field, data_address);
            }));
        }
Пример #4
0
        internal override TargetFundamentalObject CreateInstance(Thread thread, object obj)
        {
            string str = obj as string;

            if (str == null)
            {
                throw new ArgumentException();
            }

            if (!thread.CurrentFrame.Language.IsManaged)
            {
                throw new TargetException(TargetError.InvalidContext);
            }

            TargetAddress retval = thread.CallMethod(
                CreateString, TargetAddress.Null, 0, 0, str);
            TargetLocation location = new AbsoluteTargetLocation(retval);

            return(new MonoStringObject(this, location));
        }
Пример #5
0
        internal void RemoveMethodLoadHandler(Thread thread, int index)
        {
            if (!thread.CurrentFrame.Language.IsManaged)
                throw new TargetException (TargetError.InvalidContext);

            thread.CallMethod (info.RemoveBreakpoint, index, 0);
            method_load_handlers.Remove (index);
        }
Пример #6
0
        internal int RegisterMethodLoadHandler(Thread thread, MonoFunctionType func,
							FunctionBreakpointHandle handle)
        {
            if (method_load_handlers.Contains (handle.Index))
                return handle.Index;

            if (!thread.CurrentFrame.Language.IsManaged)
                throw new TargetException (TargetError.InvalidContext);

            TargetAddress retval = thread.CallMethod (
                info.InsertSourceBreakpoint, func.SymbolFile.MonoImage,
                func.Token, handle.Index, func.DeclaringType.BaseName);

            MethodLoadedHandler handler = handle.MethodLoaded;

            if (!retval.IsNull) {
                thread.ThreadServant.DoTargetAccess (
                    delegate (TargetMemoryAccess target)  {
                        method_from_jit_info ((TargetAccess) target,
                                      retval, handler);
                        return null;
                });
            }

            method_load_handlers.Add (handle.Index, handler);
            return handle.Index;
        }
Пример #7
0
        public override TargetObjectObject CreateBoxedObject(Thread thread, TargetObject value)
        {
            TargetAddress klass;

            if ((value is MonoClassObject)  && !value.Type.IsByRef)
                klass = ((MonoClassObject) value).KlassAddress;
            else if (value is TargetFundamentalObject) {
                MonoClassType ctype = ((MonoFundamentalType) value.Type).MonoClassType;
                MonoClassInfo info = (MonoClassInfo) thread.ThreadServant.DoTargetAccess (
                    delegate (TargetMemoryAccess target) {
                        return ctype.ResolveClass (target, true);
                    });
                klass = info.KlassAddress;
            } else
                throw new InvalidOperationException ();

            if (!thread.CurrentFrame.Language.IsManaged)
                throw new TargetException (TargetError.InvalidContext);

            TargetAddress boxed = thread.CallMethod (MonoDebuggerInfo.GetBoxedObjectMethod, klass, value);
            if (boxed.IsNull)
                return null;

            return new MonoObjectObject (builtin_types.ObjectType, new AbsoluteTargetLocation (boxed));
        }