@@ -143,9 +143,9 @@ read_char(proc_handle_t *handle, uintptr_t address, char *result)
143143}
144144
145145static int
146- read_int (proc_handle_t * handle , uintptr_t address , int * result )
146+ read_sized_int (proc_handle_t * handle , uintptr_t address , void * result , size_t size )
147147{
148- int res = _Py_RemoteDebug_ReadRemoteMemory (handle , address , sizeof ( int ) , result );
148+ int res = _Py_RemoteDebug_ReadRemoteMemory (handle , address , size , result );
149149 if (res < 0 ) {
150150 return -1 ;
151151 }
@@ -367,11 +367,13 @@ parse_coro_chain(
367367 }
368368 Py_DECREF (name );
369369
370- int gi_frame_state ;
371- err = read_int (
370+ int8_t gi_frame_state ;
371+ err = read_sized_int (
372372 handle ,
373373 coro_address + offsets -> gen_object .gi_frame_state ,
374- & gi_frame_state );
374+ & gi_frame_state ,
375+ sizeof (int8_t )
376+ );
375377 if (err ) {
376378 return -1 ;
377379 }
@@ -461,7 +463,8 @@ parse_task_awaited_by(
461463 struct _Py_DebugOffsets * offsets ,
462464 struct _Py_AsyncioModuleDebugOffsets * async_offsets ,
463465 uintptr_t task_address ,
464- PyObject * awaited_by
466+ PyObject * awaited_by ,
467+ int recurse_task
465468);
466469
467470
@@ -471,7 +474,8 @@ parse_task(
471474 struct _Py_DebugOffsets * offsets ,
472475 struct _Py_AsyncioModuleDebugOffsets * async_offsets ,
473476 uintptr_t task_address ,
474- PyObject * render_to
477+ PyObject * render_to ,
478+ int recurse_task
475479) {
476480 char is_task ;
477481 int err = read_char (
@@ -502,8 +506,13 @@ parse_task(
502506 Py_DECREF (call_stack );
503507
504508 if (is_task ) {
505- PyObject * tn = parse_task_name (
506- handle , offsets , async_offsets , task_address );
509+ PyObject * tn = NULL ;
510+ if (recurse_task ) {
511+ tn = parse_task_name (
512+ handle , offsets , async_offsets , task_address );
513+ } else {
514+ tn = PyLong_FromUnsignedLong (task_address );
515+ }
507516 if (tn == NULL ) {
508517 goto err ;
509518 }
@@ -544,21 +553,23 @@ parse_task(
544553 goto err ;
545554 }
546555
547- PyObject * awaited_by = PyList_New (0 );
548- if (awaited_by == NULL ) {
549- goto err ;
550- }
551- if (PyList_Append (result , awaited_by )) {
556+ if (recurse_task ) {
557+ PyObject * awaited_by = PyList_New (0 );
558+ if (awaited_by == NULL ) {
559+ goto err ;
560+ }
561+ if (PyList_Append (result , awaited_by )) {
562+ Py_DECREF (awaited_by );
563+ goto err ;
564+ }
565+ /* we can operate on a borrowed one to simplify cleanup */
552566 Py_DECREF (awaited_by );
553- goto err ;
554- }
555- /* we can operate on a borrowed one to simplify cleanup */
556- Py_DECREF (awaited_by );
557567
558- if (parse_task_awaited_by (handle , offsets , async_offsets ,
559- task_address , awaited_by )
560- ) {
561- goto err ;
568+ if (parse_task_awaited_by (handle , offsets , async_offsets ,
569+ task_address , awaited_by , 1 )
570+ ) {
571+ goto err ;
572+ }
562573 }
563574 Py_DECREF (result );
564575
@@ -575,7 +586,8 @@ parse_tasks_in_set(
575586 struct _Py_DebugOffsets * offsets ,
576587 struct _Py_AsyncioModuleDebugOffsets * async_offsets ,
577588 uintptr_t set_addr ,
578- PyObject * awaited_by
589+ PyObject * awaited_by ,
590+ int recurse_task
579591) {
580592 uintptr_t set_obj ;
581593 if (read_py_ptr (
@@ -636,7 +648,9 @@ parse_tasks_in_set(
636648 offsets ,
637649 async_offsets ,
638650 key_addr ,
639- awaited_by )
651+ awaited_by ,
652+ recurse_task
653+ )
640654 ) {
641655 return -1 ;
642656 }
@@ -660,7 +674,8 @@ parse_task_awaited_by(
660674 struct _Py_DebugOffsets * offsets ,
661675 struct _Py_AsyncioModuleDebugOffsets * async_offsets ,
662676 uintptr_t task_address ,
663- PyObject * awaited_by
677+ PyObject * awaited_by ,
678+ int recurse_task
664679) {
665680 uintptr_t task_ab_addr ;
666681 int err = read_py_ptr (
@@ -690,7 +705,9 @@ parse_task_awaited_by(
690705 offsets ,
691706 async_offsets ,
692707 task_address + async_offsets -> asyncio_task_object .task_awaited_by ,
693- awaited_by )
708+ awaited_by ,
709+ recurse_task
710+ )
694711 ) {
695712 return -1 ;
696713 }
@@ -709,7 +726,9 @@ parse_task_awaited_by(
709726 offsets ,
710727 async_offsets ,
711728 sub_task ,
712- awaited_by )
729+ awaited_by ,
730+ recurse_task
731+ )
713732 ) {
714733 return -1 ;
715734 }
@@ -1054,23 +1073,32 @@ append_awaited_by_for_thread(
10541073 return -1 ;
10551074 }
10561075
1057- PyObject * result_item = PyTuple_New (2 );
1076+ PyObject * task_id = PyLong_FromUnsignedLong (task_addr );
1077+ if (task_id == NULL ) {
1078+ Py_DECREF (tn );
1079+ Py_DECREF (current_awaited_by );
1080+ return -1 ;
1081+ }
1082+
1083+ PyObject * result_item = PyTuple_New (3 );
10581084 if (result_item == NULL ) {
10591085 Py_DECREF (tn );
10601086 Py_DECREF (current_awaited_by );
1087+ Py_DECREF (task_id );
10611088 return -1 ;
10621089 }
10631090
1064- PyTuple_SET_ITEM (result_item , 0 , tn ); // steals ref
1065- PyTuple_SET_ITEM (result_item , 1 , current_awaited_by ); // steals ref
1091+ PyTuple_SET_ITEM (result_item , 0 , task_id ); // steals ref
1092+ PyTuple_SET_ITEM (result_item , 1 , tn ); // steals ref
1093+ PyTuple_SET_ITEM (result_item , 2 , current_awaited_by ); // steals ref
10661094 if (PyList_Append (result , result_item )) {
10671095 Py_DECREF (result_item );
10681096 return -1 ;
10691097 }
10701098 Py_DECREF (result_item );
10711099
10721100 if (parse_task_awaited_by (handle , debug_offsets , async_offsets ,
1073- task_addr , current_awaited_by ))
1101+ task_addr , current_awaited_by , 0 ))
10741102 {
10751103 return -1 ;
10761104 }
@@ -1491,7 +1519,7 @@ get_async_stack_trace(PyObject* self, PyObject* args)
14911519
14921520 if (parse_task_awaited_by (
14931521 handle , & local_debug_offsets , & local_async_debug ,
1494- running_task_addr , awaited_by )
1522+ running_task_addr , awaited_by , 1 )
14951523 ) {
14961524 goto result_err ;
14971525 }
@@ -1518,13 +1546,13 @@ static PyMethodDef methods[] = {
15181546
15191547static struct PyModuleDef module = {
15201548 .m_base = PyModuleDef_HEAD_INIT ,
1521- .m_name = "_testexternalinspection " ,
1549+ .m_name = "_remotedebuggingmodule " ,
15221550 .m_size = -1 ,
15231551 .m_methods = methods ,
15241552};
15251553
15261554PyMODINIT_FUNC
1527- PyInit__testexternalinspection (void )
1555+ PyInit__remotedebugging (void )
15281556{
15291557 PyObject * mod = PyModule_Create (& module );
15301558 if (mod == NULL ) {
0 commit comments