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)); } }
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); }
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)); } }
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); }