Exemple #1
0
        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
        }
Exemple #2
0
        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
        }