private unsafe static void ReturnToDebugger(uint returnHandleIdentifier, IntPtr returnValueHandlePointer) { // Signal to the debugger the func eval completes FuncEvalCompleteCommand *funcEvalCompleteCommand = stackalloc FuncEvalCompleteCommand[1]; funcEvalCompleteCommand->commandCode = 0; funcEvalCompleteCommand->returnHandleIdentifier = returnHandleIdentifier; funcEvalCompleteCommand->returnAddress = (long)returnValueHandlePointer; IntPtr funcEvalCompleteCommandPointer = new IntPtr(funcEvalCompleteCommand); RuntimeAugments.RhpSendCustomEventToDebugger(funcEvalCompleteCommandPointer, Unsafe.SizeOf <FuncEvalCompleteCommand>()); // debugger magic will make sure this function never returns, instead control will be transferred back to the point where the FuncEval begins }
private static void HighLevelDebugFuncEvalHelperWithVariables(ref TypesAndValues param, ref LocalVariableSet arguments) { for (int i = 0; i < param.parameterValues.Length; i++) { arguments.SetVar <int>(i + 1, param.parameterValues[i]); } // Obtain the target method address from the runtime IntPtr targetAddress = RuntimeAugments.RhpGetFuncEvalTargetAddress(); LocalVariableType[] returnAndArgumentTypes = new LocalVariableType[param.types.Length]; for (int i = 0; i < returnAndArgumentTypes.Length; i++) { returnAndArgumentTypes[i] = new LocalVariableType(param.types[i], false, false); } // Hard coding static here DynamicCallSignature dynamicCallSignature = new DynamicCallSignature(Internal.Runtime.CallConverter.CallingConvention.ManagedStatic, returnAndArgumentTypes, returnAndArgumentTypes.Length); // Invoke the target method Internal.Runtime.CallInterceptor.CallInterceptor.MakeDynamicCall(targetAddress, dynamicCallSignature, arguments); unsafe { // Box the return IntPtr input = arguments.GetAddressOfVarData(0); object returnValue = RuntimeAugments.RhBoxAny(input, (IntPtr)param.types[0].ToEETypePtr()); GCHandle returnValueHandle = GCHandle.Alloc(returnValue); IntPtr returnValueHandlePointer = GCHandle.ToIntPtr(returnValueHandle); uint returnHandleIdentifier = RuntimeAugments.RhpRecordDebuggeeInitiatedHandle(returnValueHandlePointer); // Signal to the debugger the func eval completes FuncEvalCompleteCommand *funcEvalCompleteCommand = stackalloc FuncEvalCompleteCommand[1]; funcEvalCompleteCommand->commandCode = 0; funcEvalCompleteCommand->returnHandleIdentifier = returnHandleIdentifier; funcEvalCompleteCommand->returnAddress = (long)returnValueHandlePointer; IntPtr funcEvalCompleteCommandPointer = new IntPtr(funcEvalCompleteCommand); RuntimeAugments.RhpSendCustomEventToDebugger(funcEvalCompleteCommandPointer, Unsafe.SizeOf <FuncEvalCompleteCommand>()); } // debugger magic will make sure this function never returns, instead control will be transferred back to the point where the FuncEval begins }