示例#1
0
        public override ILValue CreateInstance(DmdConstructorInfo ctor, ILValue[] arguments)
        {
            DbgDotNetValueResult res;

            DbgDotNetArrayDimensionInfo[] dimensionInfos;
            switch (ctor.SpecialMethodKind)
            {
            case DmdSpecialMethodKind.Array_Constructor1:
                dimensionInfos = new DbgDotNetArrayDimensionInfo[arguments.Length];
                for (int i = 0; i < dimensionInfos.Length; i++)
                {
                    dimensionInfos[i] = new DbgDotNetArrayDimensionInfo(0, (uint)ReadInt32(arguments[i]));
                }
                res = runtime.CreateArray(context, frame, ctor.ReflectedType.GetElementType(), dimensionInfos, cancellationToken);
                return(CreateILValue(res));

            case DmdSpecialMethodKind.Array_Constructor2:
                dimensionInfos = new DbgDotNetArrayDimensionInfo[arguments.Length / 2];
                for (int i = 0; i < dimensionInfos.Length; i++)
                {
                    dimensionInfos[i] = new DbgDotNetArrayDimensionInfo(ReadInt32(arguments[i * 2]), (uint)ReadInt32(arguments[i * 2 + 1]));
                }
                res = runtime.CreateArray(context, frame, ctor.ReflectedType.GetElementType(), dimensionInfos, cancellationToken);
                return(CreateILValue(res));

            default:
                res = runtime.CreateInstance(context, frame, ctor, Convert(arguments, ctor.GetMethodSignature().GetParameterTypes()), cancellationToken);
                return(CreateILValue(res));
            }
        }
示例#2
0
        bool GetArrayInfo_CorDebug(out uint elementCount, [NotNullWhen(true)] out DbgDotNetArrayDimensionInfo[]?dimensionInfos)
        {
            Debug.Assert(Type.IsArray);
            engine.VerifyCorDebugThread();
            var corValue = TryGetCorValue();

            if (corValue is null || corValue.IsNull)
            {
                elementCount   = 0;
                dimensionInfos = null;
                return(false);
            }
            using (var obj = new ArrayObjectValue(engine, corValue)) {
                if (obj.Value is null)
                {
                    elementCount   = 0;
                    dimensionInfos = null;
                    return(false);
                }
                elementCount = obj.Value.ArrayCount;
                var baseIndexes = (obj.Value.HasBaseIndicies ? obj.Value.BaseIndicies : null) ?? Array.Empty <uint>();
                var dimensions  = obj.Value.Dimensions;
                if (!(dimensions is null))
                {
                    var infos = new DbgDotNetArrayDimensionInfo[dimensions.Length];
                    for (int i = 0; i < infos.Length; i++)
                    {
                        infos[i] = new DbgDotNetArrayDimensionInfo((int)(i < baseIndexes.Length ? baseIndexes[i] : 0), dimensions[i]);
                    }
                    dimensionInfos = infos;
                    return(true);
                }
示例#3
0
        public override ILValue CreateInstance(DmdConstructorInfo ctor, ILValue[] arguments)
        {
            DbgDotNetValueResult res;

            DbgDotNetArrayDimensionInfo[] dimensionInfos;
            switch (ctor.SpecialMethodKind)
            {
            case DmdSpecialMethodKind.Array_Constructor1:
                dimensionInfos = new DbgDotNetArrayDimensionInfo[arguments.Length];
                for (int i = 0; i < dimensionInfos.Length; i++)
                {
                    dimensionInfos[i] = new DbgDotNetArrayDimensionInfo(0, (uint)ReadInt32(arguments[i]));
                }
                res = runtime.CreateArray(evalInfo, ctor.ReflectedType.GetElementType(), dimensionInfos);
                return(CreateILValue(res));

            case DmdSpecialMethodKind.Array_Constructor2:
                dimensionInfos = new DbgDotNetArrayDimensionInfo[arguments.Length / 2];
                for (int i = 0; i < dimensionInfos.Length; i++)
                {
                    dimensionInfos[i] = new DbgDotNetArrayDimensionInfo(ReadInt32(arguments[i * 2]), (uint)ReadInt32(arguments[i * 2 + 1]));
                }
                res = runtime.CreateArray(evalInfo, ctor.ReflectedType.GetElementType(), dimensionInfos);
                return(CreateILValue(res));

            default:
                res = CreateInstanceCore(ctor, arguments);
                return(CreateILValue(res));
            }
        }
示例#4
0
        bool GetArrayInfo_MonoDebug(out uint elementCount, [NotNullWhen(true)] out DbgDotNetArrayDimensionInfo[]?dimensionInfos)
        {
            Debug.Assert(Type.IsArray);
            engine.VerifyMonoDebugThread();
            var arrayMirror = value as ArrayMirror;

            if (arrayMirror is null)
            {
                elementCount   = 0;
                dimensionInfos = null;
                return(false);
            }
            elementCount = (uint)arrayMirror.Length;
            var infos = new DbgDotNetArrayDimensionInfo[arrayMirror.Rank];

            for (int i = 0; i < infos.Length; i++)
            {
                infos[i] = new DbgDotNetArrayDimensionInfo(arrayMirror.GetLowerBound(i), (uint)arrayMirror.GetLength(i));
            }
            dimensionInfos = infos;
            return(true);
        }