@@ -152,6 +152,7 @@ PyCode_New(int argcount, int kwonlyargcount,
152152 co -> co_lnotab = lnotab ;
153153 co -> co_zombieframe = NULL ;
154154 co -> co_weakreflist = NULL ;
155+ co -> co_extra = NULL ;
155156 return co ;
156157}
157158
@@ -361,6 +362,20 @@ code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
361362static void
362363code_dealloc (PyCodeObject * co )
363364{
365+ if (co -> co_extra != NULL ) {
366+ PyThreadState * tstate = PyThreadState_Get ();
367+
368+ for (Py_ssize_t i = 0 ; i < co -> co_extra -> ce_size ; i ++ ) {
369+ freefunc free_extra = tstate -> co_extra_freefuncs [i ];
370+
371+ if (free_extra != NULL ) {
372+ free_extra (co -> co_extra -> ce_extras [i ]);
373+ }
374+ }
375+
376+ PyMem_FREE (co -> co_extra );
377+ }
378+
364379 Py_XDECREF (co -> co_code );
365380 Py_XDECREF (co -> co_consts );
366381 Py_XDECREF (co -> co_names );
@@ -752,3 +767,79 @@ _PyCode_CheckLineNumber(PyCodeObject* co, int lasti, PyAddrPair *bounds)
752767
753768 return line ;
754769}
770+
771+
772+ int
773+ _PyCode_GetExtra (PyObject * code , Py_ssize_t index , void * * extra )
774+ {
775+ PyCodeObject * o ;
776+
777+ assert (* extra == NULL );
778+
779+ if (!PyCode_Check (code )) {
780+ PyErr_BadInternalCall ();
781+ return 1 ;
782+ }
783+
784+ o = (PyCodeObject * ) code ;
785+
786+ if (o -> co_extra == NULL || o -> co_extra -> ce_size <= index ) {
787+ return 0 ;
788+ }
789+
790+ * extra = o -> co_extra -> ce_extras [index ];
791+ return 0 ;
792+ }
793+
794+
795+ int
796+ _PyCode_SetExtra (PyObject * code , Py_ssize_t index , void * extra )
797+ {
798+ PyCodeObject * o ;
799+ PyThreadState * tstate = PyThreadState_Get ();
800+
801+ if (!PyCode_Check (code ) || index < 0 ||
802+ index >= tstate -> co_extra_user_count ) {
803+ PyErr_BadInternalCall ();
804+ return 1 ;
805+ }
806+
807+ o = (PyCodeObject * ) code ;
808+
809+ if (o -> co_extra == NULL ) {
810+ o -> co_extra = (_PyCodeObjectExtra * ) PyMem_Malloc (
811+ sizeof (_PyCodeObjectExtra ));
812+ if (o -> co_extra == NULL ) {
813+ return 1 ;
814+ }
815+
816+ o -> co_extra -> ce_extras = PyMem_Malloc (
817+ tstate -> co_extra_user_count * sizeof (void * ));
818+ if (o -> co_extra -> ce_extras == NULL ) {
819+ return 1 ;
820+ }
821+
822+ o -> co_extra -> ce_size = tstate -> co_extra_user_count ;
823+
824+ for (Py_ssize_t i = 0 ; i < o -> co_extra -> ce_size ; i ++ ) {
825+ o -> co_extra -> ce_extras [i ] = NULL ;
826+ }
827+ }
828+ else if (o -> co_extra -> ce_size <= index ) {
829+ o -> co_extra -> ce_extras = PyMem_Realloc (
830+ o -> co_extra -> ce_extras , tstate -> co_extra_user_count * sizeof (void * ));
831+
832+ if (o -> co_extra -> ce_extras == NULL ) {
833+ return 1 ;
834+ }
835+
836+ o -> co_extra -> ce_size = tstate -> co_extra_user_count ;
837+
838+ for (Py_ssize_t i = o -> co_extra -> ce_size ; i < o -> co_extra -> ce_size ; i ++ ) {
839+ o -> co_extra -> ce_extras [i ] = NULL ;
840+ }
841+ }
842+
843+ o -> co_extra -> ce_extras [index ] = extra ;
844+ return 0 ;
845+ }
0 commit comments