protected override bool HasNoChildren(DmdType type) { switch (DmdType.GetTypeCode(type)) { case TypeCode.Boolean: case TypeCode.Char: case TypeCode.SByte: case TypeCode.Byte: case TypeCode.Int16: case TypeCode.UInt16: case TypeCode.Int32: case TypeCode.UInt32: case TypeCode.Int64: case TypeCode.UInt64: case TypeCode.Single: case TypeCode.Double: case TypeCode.Decimal: case TypeCode.DateTime: case TypeCode.String: return(true); case TypeCode.Empty: case TypeCode.Object: case TypeCode.DBNull: default: return(false); } }
internal object GetDefaultValue(DmdType type) { if (!type.IsValueType) { return(null); } switch (DmdType.GetTypeCode(type)) { case TypeCode.Boolean: return(false); case TypeCode.Char: return((char)0); case TypeCode.SByte: return((sbyte)0); case TypeCode.Byte: return((byte)0); case TypeCode.Int16: return((short)0); case TypeCode.UInt16: return((ushort)0); case TypeCode.Int32: return(0); case TypeCode.UInt32: return(0U); case TypeCode.Int64: return(0L); case TypeCode.UInt64: return(0UL); case TypeCode.Single: return(0f); case TypeCode.Double: return(0d); } return(RecordValue(runtime.CreateInstanceNoConstructor(context, frame, type, cancellationToken))); }
static ILValue CreateDefaultValue(DmdType type) { switch (DmdType.GetTypeCode(type)) { case TypeCode.Boolean: case TypeCode.Char: case TypeCode.SByte: case TypeCode.Byte: case TypeCode.Int16: case TypeCode.UInt16: case TypeCode.Int32: case TypeCode.UInt32: return(new ConstantInt32ILValue(type.AppDomain, 0)); case TypeCode.Int64: case TypeCode.UInt64: return(new ConstantInt64ILValue(type.AppDomain, 0)); case TypeCode.Single: case TypeCode.Double: return(new ConstantFloatILValue(type.AppDomain, 0)); } if (type == type.AppDomain.System_IntPtr || type == type.AppDomain.System_UIntPtr) { return(IntPtr.Size == 4 ? ConstantNativeIntILValue.Create32(type.AppDomain, 0) : ConstantNativeIntILValue.Create64(type.AppDomain, 0)); } if (type.IsValueType) { return(new FakeValueType(type)); } return(new NullObjectRefILValue()); }
public static Value Unbox(ObjectMirror obj, DmdType objType) { if (!objType.IsEnum) { switch (DmdType.GetTypeCode(objType)) { case TypeCode.Boolean: case TypeCode.Char: case TypeCode.SByte: case TypeCode.Byte: case TypeCode.Int16: case TypeCode.UInt16: case TypeCode.Int32: case TypeCode.UInt32: case TypeCode.Int64: case TypeCode.UInt64: case TypeCode.Single: case TypeCode.Double: return(GetFieldValues(obj).Single()); } } if (objType.IsEnum) { var value = (PrimitiveValue)GetFieldValues(obj).Single(); return(obj.VirtualMachine.CreateEnumMirror(obj.Type, value)); } else { var values = GetFieldValues(obj).ToArray(); return(obj.VirtualMachine.CreateStructMirror(obj.Type, values)); } }
object ReadEnumValue(DmdType underlyingType) { if ((object)underlyingType != null) { var typeCode = DmdType.GetTypeCode(underlyingType); if (typeCode < TypeCode.Boolean || typeCode > TypeCode.UInt64) throw new CABlobParserException("Invalid enum underlying type"); return ReadValue(ToSerializationType(typeCode), underlyingType, out var realArgType); } throw new CABlobParserException("Couldn't resolve enum type"); }
static SerializationType ToSerializationType(DmdType type) { if ((object)type == null) return SerializationType.Undefined; if (type.IsSZArray) return SerializationType.SZArray; if (type.IsEnum) return (SerializationType)DMD.ElementType.ValueType; var typeCode = DmdType.GetTypeCode(type); if (typeCode == TypeCode.Object) return type.IsValueType ? (SerializationType)DMD.ElementType.ValueType : (SerializationType)DMD.ElementType.Class; return ToSerializationType(typeCode); }
static void InitializeValue(ref ILValue value, DmdType valueType) { if (value != null) { return; } if (!valueType.IsValueType) { value = new NullObjectRefILValue(); return; } switch (DmdType.GetTypeCode(valueType)) { case TypeCode.Boolean: value = new ConstantInt32ILValue(valueType.AppDomain, 0); return; case TypeCode.Char: value = new ConstantInt32ILValue(valueType.AppDomain, 0); return; case TypeCode.SByte: value = new ConstantInt32ILValue(valueType.AppDomain, 0); return; case TypeCode.Byte: value = new ConstantInt32ILValue(valueType.AppDomain, 0); return; case TypeCode.Int16: value = new ConstantInt32ILValue(valueType.AppDomain, 0); return; case TypeCode.UInt16: value = new ConstantInt32ILValue(valueType.AppDomain, 0); return; case TypeCode.Int32: value = new ConstantInt32ILValue(valueType.AppDomain, 0); return; case TypeCode.UInt32: value = new ConstantInt32ILValue(valueType.AppDomain, 0); return; case TypeCode.Int64: value = new ConstantInt64ILValue(valueType.AppDomain, 0); return; case TypeCode.UInt64: value = new ConstantInt64ILValue(valueType.AppDomain, 0); return; case TypeCode.Single: value = new ConstantFloatILValue(valueType.AppDomain, 0); return; case TypeCode.Double: value = new ConstantFloatILValue(valueType.AppDomain, 0); return; } if (valueType == valueType.AppDomain.System_IntPtr || valueType == valueType.AppDomain.System_UIntPtr) { value = valueType.AppDomain.Runtime.PointerSize == 4 ? ConstantNativeIntILValue.Create32(valueType.AppDomain, 0) : ConstantNativeIntILValue.Create64(valueType.AppDomain, 0); return; } throw new InvalidOperationException(); }
internal object GetDefaultValue(DmdType type) { if (!type.IsValueType) return null; switch (DmdType.GetTypeCode(type)) { case TypeCode.Boolean: return false; case TypeCode.Char: return (char)0; case TypeCode.SByte: return (sbyte)0; case TypeCode.Byte: return (byte)0; case TypeCode.Int16: return (short)0; case TypeCode.UInt16: return (ushort)0; case TypeCode.Int32: return 0; case TypeCode.UInt32: return 0U; case TypeCode.Int64: return 0L; case TypeCode.UInt64: return 0UL; case TypeCode.Single: return 0f; case TypeCode.Double: return 0d; } if (!canFuncEval) throw new InterpreterMessageException(PredefinedEvaluationErrorMessages.FuncEvalDisabled); return RecordValue(runtime.CreateInstanceNoConstructor(context, frame, type, cancellationToken)); }
static SerializationType ToSerializationType(DmdType type) { if ((object)type == null) { return(SerializationType.Undefined); } if (type.IsSZArray) { return(SerializationType.SZArray); } if (type.IsEnum) { return((SerializationType)DMD.ElementType.ValueType); } var typeCode = DmdType.GetTypeCode(type); if (typeCode == TypeCode.Object) { return(type.IsValueType ? (SerializationType)DMD.ElementType.ValueType : (SerializationType)DMD.ElementType.Class); } return(ToSerializationType(typeCode)); }
string ToFormattedInteger(DmdType type, ulong value) { switch (DmdType.GetTypeCode(type)) { case TypeCode.Boolean: return(ToFormattedByte((byte)value)); case TypeCode.Char: return(ToFormattedUInt16((char)value)); case TypeCode.SByte: return(ToFormattedSByte((sbyte)value)); case TypeCode.Byte: return(ToFormattedByte((byte)value)); case TypeCode.Int16: return(ToFormattedInt16((short)value)); case TypeCode.UInt16: return(ToFormattedUInt16((ushort)value)); case TypeCode.Int32: return(ToFormattedInt32((int)value)); case TypeCode.UInt32: return(ToFormattedUInt32((uint)value)); case TypeCode.Int64: return(ToFormattedInt64((long)value)); case TypeCode.UInt64: return(ToFormattedUInt64(value)); default: break; } if (type == type.AppDomain.System_IntPtr || type == type.AppDomain.System_UIntPtr) { if (type.AppDomain.Runtime.PointerSize == 4) { return(ToFormattedPointer32((uint)value)); } return(ToFormattedPointer64(value)); } Debug.Fail("Unknown type"); return(ToFormattedUInt64(value)); }
DbgDotNetValue TryCreateDefaultValue(DmdType type) { switch (DmdType.GetTypeCode(type)) { case TypeCode.Boolean: return(TryCreateSyntheticValue(false)); case TypeCode.Char: return(TryCreateSyntheticValue('\0')); case TypeCode.SByte: return(TryCreateSyntheticValue((sbyte)0)); case TypeCode.Byte: return(TryCreateSyntheticValue((byte)0)); case TypeCode.Int16: return(TryCreateSyntheticValue((short)0)); case TypeCode.UInt16: return(TryCreateSyntheticValue((ushort)0)); case TypeCode.Int32: return(TryCreateSyntheticValue(0)); case TypeCode.UInt32: return(TryCreateSyntheticValue(0U)); case TypeCode.Int64: return(TryCreateSyntheticValue(0L)); case TypeCode.UInt64: return(TryCreateSyntheticValue(0UL)); case TypeCode.Single: return(TryCreateSyntheticValue(0f)); case TypeCode.Double: return(TryCreateSyntheticValue(0d)); } if (type == type.AppDomain.System_IntPtr || type.IsPointer || type.IsFunctionPointer) { return(TryCreateSyntheticValue(IntPtr.Zero)); } if (type == type.AppDomain.System_UIntPtr) { return(TryCreateSyntheticValue(UIntPtr.Zero)); } return(null); }
public static Value MakePrimitiveValueIfPossible(Value value, DmdType type) { if (!type.IsValueType) { return(value); } if (type.IsEnum) { return(value); } var sm = value as StructMirror; if (sm is null) { return(value); } switch (DmdType.GetTypeCode(type)) { case TypeCode.Boolean: case TypeCode.Char: case TypeCode.SByte: case TypeCode.Byte: case TypeCode.Int16: case TypeCode.UInt16: case TypeCode.Int32: case TypeCode.UInt32: case TypeCode.Int64: case TypeCode.UInt64: case TypeCode.Single: case TypeCode.Double: if (sm.Fields.Length != 1) { throw new InvalidOperationException(); } return(sm.Fields[0]); } return(value); }
internal object GetDebuggerValue(ILValue value, DmdType targetType) { var dnValue = TryGetDotNetValue(value, canCreateValues: false); if (dnValue != null) { return(dnValue); } if (value.IsNull) { return(null); } var targetTypeCode = DmdType.GetTypeCode(targetType); switch (value.Kind) { case ILValueKind.Int32: int v32 = ((ConstantInt32ILValue)value).Value; switch (targetTypeCode) { case TypeCode.Boolean: return(v32 != 0); case TypeCode.Char: return((char)v32); case TypeCode.SByte: return((sbyte)v32); case TypeCode.Byte: return((byte)v32); case TypeCode.Int16: return((short)v32); case TypeCode.UInt16: return((ushort)v32); case TypeCode.Int32: return(v32); case TypeCode.UInt32: return((uint)v32); } break; case ILValueKind.Int64: long v64 = ((ConstantInt64ILValue)value).Value; switch (targetTypeCode) { case TypeCode.Int64: return(v64); case TypeCode.UInt64: return((ulong)v64); } break; case ILValueKind.Float: double r8 = ((ConstantFloatILValue)value).Value; switch (targetTypeCode) { case TypeCode.Single: return((float)r8); case TypeCode.Double: return(r8); } break; case ILValueKind.NativeInt: if (value is ConstantNativeIntILValue ci) { if (targetType == targetType.AppDomain.System_IntPtr) { if (PointerSize == 4) { return(new IntPtr(ci.Value32)); } return(new IntPtr(ci.Value64)); } else if (targetType == targetType.AppDomain.System_UIntPtr) { if (PointerSize == 4) { return(new UIntPtr(ci.UnsignedValue32)); } return(new UIntPtr(ci.UnsignedValue64)); } } break; case ILValueKind.Type: if (value is ConstantStringILValueImpl sv) { return(sv.Value); } break; } Debug.Fail($"Unknown value can't be converted to {targetType.FullName}: {value}"); throw new InvalidOperationException(); }
DbgDotNetValue TryGetDotNetValue(ILValue value, bool canCreateValues) { if (value is IDebuggerRuntimeILValue rtValue) { return(rtValue.GetDotNetValue()); } if (canCreateValues) { if (value.IsNull) { return(new SyntheticNullValue(value.Type ?? frame.Module.AppDomain.GetReflectionAppDomain().System_Void)); } object newValue; var type = value.Type; switch (value.Kind) { case ILValueKind.Int32: int v32 = ((ConstantInt32ILValue)value).Value; switch (DmdType.GetTypeCode(type)) { case TypeCode.Boolean: newValue = v32 != 0; break; case TypeCode.Char: newValue = (char)v32; break; case TypeCode.SByte: newValue = (sbyte)v32; break; case TypeCode.Byte: newValue = (byte)v32; break; case TypeCode.Int16: newValue = (short)v32; break; case TypeCode.UInt16: newValue = (ushort)v32; break; case TypeCode.Int32: newValue = v32; break; case TypeCode.UInt32: newValue = (uint)v32; break; default: newValue = null; break; } break; case ILValueKind.Int64: long v64 = ((ConstantInt64ILValue)value).Value; switch (DmdType.GetTypeCode(type)) { case TypeCode.Int64: newValue = v64; break; case TypeCode.UInt64: newValue = (ulong)v64; break; default: newValue = null; break; } break; case ILValueKind.Float: double r8 = ((ConstantFloatILValue)value).Value; switch (DmdType.GetTypeCode(type)) { case TypeCode.Single: newValue = (float)r8; break; case TypeCode.Double: newValue = r8; break; default: newValue = null; break; } break; case ILValueKind.NativeInt: if (value is ConstantNativeIntILValue ci) { if (type == type.AppDomain.System_IntPtr) { if (PointerSize == 4) { newValue = new IntPtr(ci.Value32); } else { newValue = new IntPtr(ci.Value64); } } else if (type == type.AppDomain.System_UIntPtr) { if (PointerSize == 4) { newValue = new UIntPtr(ci.UnsignedValue32); } else { newValue = new UIntPtr(ci.UnsignedValue64); } } else { newValue = null; } } else { newValue = null; } break; case ILValueKind.Type: if (value is ConstantStringILValueImpl sv) { newValue = sv.Value; } else { newValue = null; } break; default: newValue = null; break; } if (newValue != null) { return(RecordValue(runtime.CreateValue(context, frame, newValue, cancellationToken))); } } return(null); }
public static DbgDotNetValue TryCreateSyntheticValue(DmdType type, object constant) { switch (DmdType.GetTypeCode(type)) { case TypeCode.Boolean: if (constant is bool) { return(new SyntheticValue(type, new DbgDotNetRawValue(DbgSimpleValueType.Boolean, constant))); } break; case TypeCode.Char: if (constant is char) { return(new SyntheticValue(type, new DbgDotNetRawValue(DbgSimpleValueType.CharUtf16, constant))); } break; case TypeCode.SByte: if (constant is sbyte) { return(new SyntheticValue(type, new DbgDotNetRawValue(DbgSimpleValueType.Int8, constant))); } break; case TypeCode.Byte: if (constant is byte) { return(new SyntheticValue(type, new DbgDotNetRawValue(DbgSimpleValueType.UInt8, constant))); } break; case TypeCode.Int16: if (constant is short) { return(new SyntheticValue(type, new DbgDotNetRawValue(DbgSimpleValueType.Int16, constant))); } break; case TypeCode.UInt16: if (constant is ushort) { return(new SyntheticValue(type, new DbgDotNetRawValue(DbgSimpleValueType.UInt16, constant))); } break; case TypeCode.Int32: if (constant is int) { return(new SyntheticValue(type, new DbgDotNetRawValue(DbgSimpleValueType.Int32, constant))); } break; case TypeCode.UInt32: if (constant is uint) { return(new SyntheticValue(type, new DbgDotNetRawValue(DbgSimpleValueType.UInt32, constant))); } break; case TypeCode.Int64: if (constant is long) { return(new SyntheticValue(type, new DbgDotNetRawValue(DbgSimpleValueType.Int64, constant))); } break; case TypeCode.UInt64: if (constant is ulong) { return(new SyntheticValue(type, new DbgDotNetRawValue(DbgSimpleValueType.UInt64, constant))); } break; case TypeCode.Single: if (constant is float) { return(new SyntheticValue(type, new DbgDotNetRawValue(DbgSimpleValueType.Float32, constant))); } break; case TypeCode.Double: if (constant is double) { return(new SyntheticValue(type, new DbgDotNetRawValue(DbgSimpleValueType.Float64, constant))); } break; case TypeCode.String: if (constant is string || constant == null) { return(new SyntheticValue(type, new DbgDotNetRawValue(DbgSimpleValueType.StringUtf16, constant))); } break; default: if (type == type.AppDomain.System_IntPtr || type == type.AppDomain.System_UIntPtr) { if (type.AppDomain.Runtime.PointerSize == 4) { if (constant is int) { return(new SyntheticValue(type, new DbgDotNetRawValue(DbgSimpleValueType.Ptr32, (uint)(int)constant))); } else if (constant is uint) { return(new SyntheticValue(type, new DbgDotNetRawValue(DbgSimpleValueType.Ptr32, constant))); } } else { if (constant is long) { return(new SyntheticValue(type, new DbgDotNetRawValue(DbgSimpleValueType.Ptr64, (ulong)(long)constant))); } else if (constant is ulong) { return(new SyntheticValue(type, new DbgDotNetRawValue(DbgSimpleValueType.Ptr64, constant))); } } } else if (constant == null && !type.IsValueType) { return(new SyntheticNullValue(type)); } break; } return(null); }