Beispiel #1
0
        public static int GetFieldOffset(_FieldInfo fieldInfo)
        {
            var offset = (int)fieldInfo.Offset;

            if (IsReferenceType(fieldInfo.DeclaringType))
            {
                offset += ObjectUtils.FieldDataOffset;
            }

            return(offset);
        }
Beispiel #2
0
        _ComponentInfo GetComponentInfo(Type type, object component)
        {
            _ComponentInfo componentInfo = new _ComponentInfo();

            componentInfo.name = type.Name;

            var fieldInfos = type.GetFields(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

            foreach (var fieldInfo in fieldInfos)
            {
                try
                {
                    var        value = fieldInfo.GetValue(component);
                    _FieldInfo fi    = new _FieldInfo();
                    fi.name  = fieldInfo.Name;
                    fi.type  = fieldInfo.FieldType.Name;
                    fi.value = (value != null) ? value.ToString() : "null";
                    componentInfo.fieldInfos.Add(fi);
                }
                catch { }
            }

            var propertyInfos = type.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

            foreach (var property in propertyInfos)
            {
                // Query for deprecated value will yield exception
                try
                {
                    var        value = property.GetValue(component, null);
                    _FieldInfo fi    = new _FieldInfo();
                    fi.name  = property.Name;
                    fi.type  = property.PropertyType.Name;
                    fi.value = (value != null) ? value.ToString() : "null";
                    componentInfo.fieldInfos.Add(fi);
                }
                catch { }
            }

            return(componentInfo);
        }
Beispiel #3
0
        private static void InvalidateOutAndError()
        {
            var type = typeof(Console);

            _FieldInfo output = type.GetField("_out",
                                              BindingFlags.Static | BindingFlags.NonPublic);

            _FieldInfo error = type.GetField("_error",
                                             BindingFlags.Static | BindingFlags.NonPublic);

            _MethodInfo initializeStdOutError = type.GetMethod("InitializeStdOutError",
                                                               BindingFlags.Static | BindingFlags.NonPublic);

            Debug.Assert(output != null);
            Debug.Assert(error != null);
            Debug.Assert(initializeStdOutError != null);

            output.SetValue(null, null);
            error.SetValue(null, null);
            initializeStdOutError.Invoke(null, new object[] { true });
        }
Beispiel #4
0
        public static void DoExecute(XSharp.Assembler.Assembler Assembler, _MethodInfo aMethod, Type aDeclaringType, _FieldInfo aField, bool aDerefValue, bool aDebugEnabled, Type aTypeOnStack)
        {
            XS.Comment("Field: " + aField.Id);
            int xExtraOffset = 0;
            var xType        = aMethod.MethodBase.DeclaringType;

            bool xNeedsGC = aDeclaringType.IsClass && !aDeclaringType.IsValueType;

            if (xNeedsGC)
            {
                xExtraOffset = 12;
            }

            var xActualOffset = aField.Offset + xExtraOffset;
            var xSize         = aField.Size;

            if ((!aTypeOnStack.IsPointer) &&
                (aDeclaringType.IsClass))
            {
                DoNullReferenceCheck(Assembler, aDebugEnabled, 4);
                XS.Add(ESP, 4);
            }
            else
            {
                DoNullReferenceCheck(Assembler, aDebugEnabled, 0);
            }

            if (aDerefValue && aField.IsExternalValue)
            {
                XS.Set(ESP, EAX, destinationIsIndirect: true);
            }
            else
            {
                XS.Pop(EAX);
                XS.Add(EAX, (uint)(xActualOffset));
                XS.Push(EAX);
            }
        }
 public FieldInfoAbstaction([NotNull] _FieldInfo f)
 {
     _F = f;
 }
Beispiel #6
0
        public static void DoExecute(XSharp.Assembler.Assembler Assembler, _MethodInfo aMethod, Type aDeclaringType, _FieldInfo aField, bool aDerefValue, bool aDebugEnabled, Type aTypeOnStack)
        {
            XS.Comment("Field: " + aField.Id);
            int xExtraOffset = 0;

            bool xNeedsGC = aDeclaringType.IsClass && !aDeclaringType.IsValueType;

            if (xNeedsGC)
            {
                xExtraOffset = 12;
            }

            if ((!aTypeOnStack.IsPointer) && (aDeclaringType.IsClass))
            {
                DoNullReferenceCheck(Assembler, aDebugEnabled, 4);
                XS.Add(ESP, 4);
            }
            else
            {
                DoNullReferenceCheck(Assembler, aDebugEnabled, 0);
            }

            if (aDerefValue && aField.IsExternalValue)
            {
                XS.Set(ESP, EAX, destinationIsIndirect: true);
            }
            else
            {
                XS.Pop(EAX);
                if (aDeclaringType.Name == "RawArrayData" && aField.Field.Name == "Data")
                {
                    // if we accidently load 64bit assemblies, we get an incorrect extra 4 bytes of offset, so we just hardcode the offset
                    XS.Add(EAX, (uint)(4 + xExtraOffset));
                }
                else
                {
                    XS.Add(EAX, (uint)(aField.Offset + xExtraOffset));
                }
                XS.Push(EAX);
            }
        }