Beispiel #1
0
        public MonoClassInfo ResolveClass(TargetMemoryAccess target, bool fail)
        {
            if (resolved)
            {
                return(class_info);
            }

            if (class_info == null)
            {
                if (class_ptr.IsNull)
                {
                    return(null);
                }

                TargetAddress klass = target.ReadAddress(class_ptr);
                if (klass.IsNull)
                {
                    return(null);
                }

                class_info = File.MonoLanguage.ReadClassInfo(target, klass);
            }

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

                throw new TargetException(TargetError.ClassNotInitialized,
                                          "Class `{0}' not initialized yet.", Name);
            }

            if (class_info.HasParent)
            {
                MonoClassInfo parent_info = class_info.GetParent(target);
                parent_type           = (IMonoStructType)parent_info.Type;
                parent_type.ClassInfo = parent_info;
                if (parent_type.ResolveClass(target, fail) == null)
                {
                    return(null);
                }
            }

            resolved = true;
            return(class_info);
        }
        public MonoClassInfo ResolveClass(TargetMemoryAccess target, bool fail)
        {
            if (resolved)
            {
                return(class_info);
            }

            if (class_info == null)
            {
                int token = type.MetadataToken.ToInt32();
                class_info = file.LookupClassInfo(target, token);
            }

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

                throw new TargetException(TargetError.ClassNotInitialized,
                                          "Class `{0}' not initialized yet.", Name);
            }

            if (class_info.HasParent)
            {
                MonoClassInfo parent_info = class_info.GetParent(target);
                parent_type           = (IMonoStructType)parent_info.Type;
                parent_type.ClassInfo = parent_info;
                if (parent_type.ResolveClass(target, fail) == null)
                {
                    return(null);
                }
            }

            resolved = true;
            return(class_info);
        }
        internal override int GetElementSize(TargetMemoryAccess target)
        {
            TargetType element_type;

            if (ElementType is MonoEnumType)
            {
                element_type = ((MonoEnumType)ElementType).ClassType;
            }
            else
            {
                element_type = ElementType;
            }

            IMonoStructType stype = element_type as IMonoStructType;

            if ((stype == null) || stype.Type.IsByRef)
            {
                return(base.GetElementSize(target));
            }

            MonoClassInfo cinfo = stype.ResolveClass(target, true);

            return(cinfo.GetInstanceSize(target));
        }
Beispiel #4
0
        public MonoClassInfo ResolveClass(TargetMemoryAccess target, bool fail)
        {
            if (resolved)
                return class_info;

            if (class_info == null) {
                int token = type.MetadataToken.ToInt32 ();
                class_info = file.LookupClassInfo (target, token);
            }

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

                throw new TargetException (TargetError.ClassNotInitialized,
                               "Class `{0}' not initialized yet.", Name);
            }

            if (class_info.HasParent) {
                MonoClassInfo parent_info = class_info.GetParent (target);
                parent_type = (IMonoStructType) parent_info.Type;
                parent_type.ClassInfo = parent_info;
                if (parent_type.ResolveClass (target, fail) == null)
                    return null;
            }

            resolved = true;
            return class_info;
        }
        public MonoClassInfo ResolveClass(TargetMemoryAccess target, bool fail)
        {
            if (resolved)
                return class_info;

            if (class_info == null) {
                if (class_ptr.IsNull)
                    return null;

                TargetAddress klass = target.ReadAddress (class_ptr);
                if (klass.IsNull)
                    return null;

                class_info = File.MonoLanguage.ReadClassInfo (target, klass);
            }

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

                throw new TargetException (TargetError.ClassNotInitialized,
                               "Class `{0}' not initialized yet.", Name);
            }

            if (class_info.HasParent) {
                MonoClassInfo parent_info = class_info.GetParent (target);
                parent_type = (IMonoStructType) parent_info.Type;
                parent_type.ClassInfo = parent_info;
                if (parent_type.ResolveClass (target, fail) == null)
                    return null;
            }

            resolved = true;
            return class_info;
        }