private unsafe static void NewParameterizedArray(byte *parameterBuffer, uint parameterBufferSize) { LowLevelNativeFormatReader reader = new LowLevelNativeFormatReader(parameterBuffer, parameterBufferSize); ulong[] debuggerPreparedExternalReferences; BuildDebuggerPreparedExternalReferences(reader, out debuggerPreparedExternalReferences); RuntimeTypeHandle arrElmTypeHandle = TypeSystemHelper.GetConstructedRuntimeTypeHandle(reader, debuggerPreparedExternalReferences); uint rank = reader.GetUnsigned(); int[] dims = new int[rank]; int[] lowerBounds = new int[rank]; for (uint i = 0; i < rank; ++i) { dims[i] = (int)reader.GetUnsigned(); } for (uint i = 0; i < rank; ++i) { lowerBounds[i] = (int)reader.GetUnsigned(); } Array returnValue; RuntimeTypeHandle arrayTypeHandle = default(RuntimeTypeHandle); // Get an array RuntimeTypeHandle given an element's RuntimeTypeHandle and rank. // Pass false for isMdArray, and rank == -1 for SzArrays IntPtr returnValueHandlePointer = IntPtr.Zero; uint returnHandleIdentifier = 0; try { if (rank == 1 && lowerBounds[0] == 0) { // TODO : throw exception with loc message bool success = TypeLoaderEnvironment.Instance.TryGetArrayTypeForElementType(arrElmTypeHandle, false, -1, out arrayTypeHandle); Debug.Assert(success); returnValue = Internal.Runtime.Augments.RuntimeAugments.NewArray(arrayTypeHandle, dims[0]); } else { // TODO : throw exception with loc message bool success = TypeLoaderEnvironment.Instance.TryGetArrayTypeForElementType(arrElmTypeHandle, true, (int)rank, out arrayTypeHandle); Debug.Assert(success); returnValue = Internal.Runtime.Augments.RuntimeAugments.NewMultiDimArray( arrayTypeHandle, dims, lowerBounds); } GCHandle returnValueHandle = GCHandle.Alloc(returnValue); returnValueHandlePointer = GCHandle.ToIntPtr(returnValueHandle); returnHandleIdentifier = RuntimeAugments.RhpRecordDebuggeeInitiatedHandle(returnValueHandlePointer); } finally { ReturnToDebuggerWithReturn(returnHandleIdentifier, returnValueHandlePointer, false); } }
private unsafe static FuncEvalResult NewParameterizedObjectNoConstructor(ref long myFuncEvalId, byte *parameterBuffer, uint parameterBufferSize) { LowLevelNativeFormatReader reader = new LowLevelNativeFormatReader(parameterBuffer, parameterBufferSize); myFuncEvalId = s_funcEvalId = (long)reader.GetUnsignedLong(); ulong[] debuggerPreparedExternalReferences; BuildDebuggerPreparedExternalReferences(reader, out debuggerPreparedExternalReferences); RuntimeTypeHandle objectTypeHandle = TypeSystemHelper.GetConstructedRuntimeTypeHandle(reader, debuggerPreparedExternalReferences); // TODO, FuncEval, deal with Nullable objects object returnValue = RuntimeAugments.RawNewObject(objectTypeHandle); return(new FuncEvalResult(returnValue, false)); }
private unsafe static void NewParameterizedObjectNoConstructor(byte *parameterBuffer, uint parameterBufferSize) { LowLevelNativeFormatReader reader = new LowLevelNativeFormatReader(parameterBuffer, parameterBufferSize); ulong[] debuggerPreparedExternalReferences; BuildDebuggerPreparedExternalReferences(reader, out debuggerPreparedExternalReferences); RuntimeTypeHandle objectTypeHandle = TypeSystemHelper.GetConstructedRuntimeTypeHandle(reader, debuggerPreparedExternalReferences); // TODO, FuncEval, deal with Nullable objects object returnValue = RuntimeAugments.RawNewObject(objectTypeHandle); GCHandle returnValueHandle = GCHandle.Alloc(returnValue); IntPtr returnValueHandlePointer = GCHandle.ToIntPtr(returnValueHandle); uint returnHandleIdentifier = RuntimeAugments.RhpRecordDebuggeeInitiatedHandle(returnValueHandlePointer); ReturnToDebuggerWithReturn(returnHandleIdentifier, returnValueHandlePointer, false); }
private unsafe static FuncEvalResult NewParameterizedArray(ref long myFuncEvalId, byte *parameterBuffer, uint parameterBufferSize) { LowLevelNativeFormatReader reader = new LowLevelNativeFormatReader(parameterBuffer, parameterBufferSize); myFuncEvalId = s_funcEvalId = (long)reader.GetUnsignedLong(); ulong[] debuggerPreparedExternalReferences; BuildDebuggerPreparedExternalReferences(reader, out debuggerPreparedExternalReferences); RuntimeTypeHandle arrElmTypeHandle = TypeSystemHelper.GetConstructedRuntimeTypeHandle(reader, debuggerPreparedExternalReferences); uint rank = reader.GetUnsigned(); int[] dims = new int[rank]; int[] lowerBounds = new int[rank]; for (uint i = 0; i < rank; ++i) { dims[i] = (int)reader.GetUnsigned(); } for (uint i = 0; i < rank; ++i) { lowerBounds[i] = (int)reader.GetUnsigned(); } Array newArray = null; RuntimeTypeHandle arrayTypeHandle = default(RuntimeTypeHandle); Exception ex = null; try { // Get an array RuntimeTypeHandle given an element's RuntimeTypeHandle and rank. // Pass false for isMdArray, and rank == -1 for SzArrays if (rank == 1 && lowerBounds[0] == 0) { // TODO : throw exception with loc message bool success = TypeLoaderEnvironment.Instance.TryGetArrayTypeForElementType(arrElmTypeHandle, false, -1, out arrayTypeHandle); Debug.Assert(success); newArray = Internal.Runtime.Augments.RuntimeAugments.NewArray(arrayTypeHandle, dims[0]); } else { // TODO : throw exception with loc message bool success = TypeLoaderEnvironment.Instance.TryGetArrayTypeForElementType(arrElmTypeHandle, true, (int)rank, out arrayTypeHandle); Debug.Assert(success); newArray = Internal.Runtime.Augments.RuntimeAugments.NewMultiDimArray( arrayTypeHandle, dims, lowerBounds); } } catch (Exception e) { ex = e; } object returnValue; if (ex != null) { returnValue = ex; } else { returnValue = newArray; } return(new FuncEvalResult(returnValue, ex != null)); }