示例#1
0
        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);
            }
        }
示例#2
0
        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)));
        }
示例#3
0
        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());
        }
示例#4
0
 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));
     }
 }
示例#5
0
		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");
		}
示例#6
0
		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);
		}
示例#7
0
        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();
        }
示例#8
0
		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));
		}
示例#9
0
        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));
        }
示例#11
0
        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);
        }
示例#12
0
        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);
        }
示例#13
0
        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();
        }
示例#14
0
        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);
        }
示例#15
0
        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);
        }