public static int GetFieldOffset(_FieldInfo fieldInfo) { var offset = (int)fieldInfo.Offset; if (IsReferenceType(fieldInfo.DeclaringType)) { offset += ObjectUtils.FieldDataOffset; } return(offset); }
_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); }
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 }); }
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; }
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); } }