@@ -12,6 +12,8 @@ gen_traverse(PyGenObject *gen, visitproc visit, void *arg)
1212{
1313 Py_VISIT ((PyObject * )gen -> gi_frame );
1414 Py_VISIT (gen -> gi_code );
15+ Py_VISIT (gen -> gi_name );
16+ Py_VISIT (gen -> gi_qualname );
1517 return 0 ;
1618}
1719
@@ -58,6 +60,8 @@ gen_dealloc(PyGenObject *gen)
5860 _PyObject_GC_UNTRACK (self );
5961 Py_CLEAR (gen -> gi_frame );
6062 Py_CLEAR (gen -> gi_code );
63+ Py_CLEAR (gen -> gi_name );
64+ Py_CLEAR (gen -> gi_qualname );
6165 PyObject_GC_Del (gen );
6266}
6367
@@ -418,33 +422,73 @@ static PyObject *
418422gen_repr (PyGenObject * gen )
419423{
420424 return PyUnicode_FromFormat ("<generator object %S at %p>" ,
421- ((PyCodeObject * )gen -> gi_code )-> co_name ,
422- gen );
425+ gen -> gi_qualname , gen );
423426}
424427
428+ static PyObject *
429+ gen_get_name (PyGenObject * op )
430+ {
431+ Py_INCREF (op -> gi_name );
432+ return op -> gi_name ;
433+ }
434+
435+ static int
436+ gen_set_name (PyGenObject * op , PyObject * value )
437+ {
438+ PyObject * tmp ;
439+
440+ /* Not legal to del gen.gi_name or to set it to anything
441+ * other than a string object. */
442+ if (value == NULL || !PyUnicode_Check (value )) {
443+ PyErr_SetString (PyExc_TypeError ,
444+ "__name__ must be set to a string object" );
445+ return -1 ;
446+ }
447+ tmp = op -> gi_name ;
448+ Py_INCREF (value );
449+ op -> gi_name = value ;
450+ Py_DECREF (tmp );
451+ return 0 ;
452+ }
425453
426454static PyObject *
427- gen_get_name (PyGenObject * gen )
455+ gen_get_qualname (PyGenObject * op )
428456{
429- PyObject * name = ((PyCodeObject * )gen -> gi_code )-> co_name ;
430- Py_INCREF (name );
431- return name ;
457+ Py_INCREF (op -> gi_qualname );
458+ return op -> gi_qualname ;
432459}
433460
461+ static int
462+ gen_set_qualname (PyGenObject * op , PyObject * value )
463+ {
464+ PyObject * tmp ;
434465
435- PyDoc_STRVAR (gen__name__doc__ ,
436- "Return the name of the generator's associated code object." );
466+ /* Not legal to del gen.__qualname__ or to set it to anything
467+ * other than a string object. */
468+ if (value == NULL || !PyUnicode_Check (value )) {
469+ PyErr_SetString (PyExc_TypeError ,
470+ "__qualname__ must be set to a string object" );
471+ return -1 ;
472+ }
473+ tmp = op -> gi_qualname ;
474+ Py_INCREF (value );
475+ op -> gi_qualname = value ;
476+ Py_DECREF (tmp );
477+ return 0 ;
478+ }
437479
438480static PyGetSetDef gen_getsetlist [] = {
439- {"__name__" , (getter )gen_get_name , NULL , gen__name__doc__ },
440- {NULL }
481+ {"__name__" , (getter )gen_get_name , (setter )gen_set_name ,
482+ PyDoc_STR ("name of the generator" )},
483+ {"__qualname__" , (getter )gen_get_qualname , (setter )gen_set_qualname ,
484+ PyDoc_STR ("qualified name of the generator" )},
485+ {NULL } /* Sentinel */
441486};
442487
443-
444488static PyMemberDef gen_memberlist [] = {
445- {"gi_frame" , T_OBJECT , offsetof(PyGenObject , gi_frame ), READONLY },
446- {"gi_running" , T_BOOL , offsetof(PyGenObject , gi_running ), READONLY },
447- {"gi_code" , T_OBJECT , offsetof(PyGenObject , gi_code ), READONLY },
489+ {"gi_frame" , T_OBJECT , offsetof(PyGenObject , gi_frame ), READONLY },
490+ {"gi_running" , T_BOOL , offsetof(PyGenObject , gi_running ), READONLY },
491+ {"gi_code" , T_OBJECT , offsetof(PyGenObject , gi_code ), READONLY },
448492 {NULL } /* Sentinel */
449493};
450494
@@ -510,7 +554,7 @@ PyTypeObject PyGen_Type = {
510554};
511555
512556PyObject *
513- PyGen_New (PyFrameObject * f )
557+ PyGen_NewWithQualName (PyFrameObject * f , PyObject * name , PyObject * qualname )
514558{
515559 PyGenObject * gen = PyObject_GC_New (PyGenObject , & PyGen_Type );
516560 if (gen == NULL ) {
@@ -523,10 +567,26 @@ PyGen_New(PyFrameObject *f)
523567 gen -> gi_code = (PyObject * )(f -> f_code );
524568 gen -> gi_running = 0 ;
525569 gen -> gi_weakreflist = NULL ;
570+ if (name != NULL )
571+ gen -> gi_name = name ;
572+ else
573+ gen -> gi_name = ((PyCodeObject * )gen -> gi_code )-> co_name ;
574+ Py_INCREF (gen -> gi_name );
575+ if (qualname != NULL )
576+ gen -> gi_qualname = qualname ;
577+ else
578+ gen -> gi_qualname = gen -> gi_name ;
579+ Py_INCREF (gen -> gi_qualname );
526580 _PyObject_GC_TRACK (gen );
527581 return (PyObject * )gen ;
528582}
529583
584+ PyObject *
585+ PyGen_New (PyFrameObject * f )
586+ {
587+ return PyGen_NewWithQualName (f , NULL , NULL );
588+ }
589+
530590int
531591PyGen_NeedsFinalizing (PyGenObject * gen )
532592{
0 commit comments