@@ -377,7 +377,6 @@ static PyGetSetDef frame_getsetlist[] = {
377377 a meaning:
378378 ob_type == &Frametype
379379 f_back next item on free list, or NULL
380- f_nlocals number of locals
381380 f_stacksize size of value stack
382381 ob_size size of localsplus
383382 Note that the value and block stacks are preserved -- this can save
@@ -458,7 +457,7 @@ frame_traverse(PyFrameObject *f, visitproc visit, void *arg)
458457 Py_VISIT (f -> f_exc_traceback );
459458
460459 /* locals */
461- slots = f -> f_nlocals + f -> f_ncells + f -> f_nfreevars ;
460+ slots = f -> f_code -> co_nlocals + PyTuple_GET_SIZE ( f -> f_code -> co_cellvars ) + PyTuple_GET_SIZE ( f -> f_code -> co_freevars ) ;
462461 fastlocals = f -> f_localsplus ;
463462 for (i = slots ; -- i >= 0 ; ++ fastlocals )
464463 Py_VISIT (* fastlocals );
@@ -491,7 +490,7 @@ frame_clear(PyFrameObject *f)
491490 Py_CLEAR (f -> f_trace );
492491
493492 /* locals */
494- slots = f -> f_nlocals + f -> f_ncells + f -> f_nfreevars ;
493+ slots = f -> f_code -> co_nlocals + PyTuple_GET_SIZE ( f -> f_code -> co_cellvars ) + PyTuple_GET_SIZE ( f -> f_code -> co_freevars ) ;
495494 fastlocals = f -> f_localsplus ;
496495 for (i = slots ; -- i >= 0 ; ++ fastlocals )
497496 Py_CLEAR (* fastlocals );
@@ -760,7 +759,9 @@ PyFrame_FastToLocals(PyFrameObject *f)
760759 PyObject * locals , * map ;
761760 PyObject * * fast ;
762761 PyObject * error_type , * error_value , * error_traceback ;
762+ PyCodeObject * co ;
763763 Py_ssize_t j ;
764+ int ncells , nfreevars ;
764765 if (f == NULL )
765766 return ;
766767 locals = f -> f_locals ;
@@ -771,27 +772,24 @@ PyFrame_FastToLocals(PyFrameObject *f)
771772 return ;
772773 }
773774 }
774- map = f -> f_code -> co_varnames ;
775+ co = f -> f_code ;
776+ map = co -> co_varnames ;
775777 if (!PyTuple_Check (map ))
776778 return ;
777779 PyErr_Fetch (& error_type , & error_value , & error_traceback );
778780 fast = f -> f_localsplus ;
779781 j = PyTuple_GET_SIZE (map );
780- if (j > f -> f_nlocals )
781- j = f -> f_nlocals ;
782- if (f -> f_nlocals )
782+ if (j > co -> co_nlocals )
783+ j = co -> co_nlocals ;
784+ if (co -> co_nlocals )
783785 map_to_dict (map , j , locals , fast , 0 );
784- if (f -> f_ncells || f -> f_nfreevars ) {
785- if (!(PyTuple_Check (f -> f_code -> co_cellvars )
786- && PyTuple_Check (f -> f_code -> co_freevars ))) {
787- return ;
788- }
789- map_to_dict (f -> f_code -> co_cellvars ,
790- PyTuple_GET_SIZE (f -> f_code -> co_cellvars ),
791- locals , fast + f -> f_nlocals , 1 );
792- map_to_dict (f -> f_code -> co_freevars ,
793- PyTuple_GET_SIZE (f -> f_code -> co_freevars ),
794- locals , fast + f -> f_nlocals + f -> f_ncells , 1 );
786+ ncells = PyTuple_GET_SIZE (co -> co_cellvars );
787+ nfreevars = PyTuple_GET_SIZE (co -> co_freevars );
788+ if (ncells || nfreevars ) {
789+ map_to_dict (co -> co_cellvars , ncells ,
790+ locals , fast + co -> co_nlocals , 1 );
791+ map_to_dict (co -> co_freevars , nfreevars ,
792+ locals , fast + co -> co_nlocals + ncells , 1 );
795793 }
796794 PyErr_Restore (error_type , error_value , error_traceback );
797795}
@@ -803,33 +801,33 @@ PyFrame_LocalsToFast(PyFrameObject *f, int clear)
803801 PyObject * locals , * map ;
804802 PyObject * * fast ;
805803 PyObject * error_type , * error_value , * error_traceback ;
804+ PyCodeObject * co ;
806805 Py_ssize_t j ;
806+ int ncells , nfreevars ;
807807 if (f == NULL )
808808 return ;
809809 locals = f -> f_locals ;
810- map = f -> f_code -> co_varnames ;
810+ co = f -> f_code ;
811+ map = co -> co_varnames ;
811812 if (locals == NULL )
812813 return ;
813814 if (!PyTuple_Check (map ))
814815 return ;
815816 PyErr_Fetch (& error_type , & error_value , & error_traceback );
816817 fast = f -> f_localsplus ;
817818 j = PyTuple_GET_SIZE (map );
818- if (j > f -> f_nlocals )
819- j = f -> f_nlocals ;
820- if (f -> f_nlocals )
821- dict_to_map (f -> f_code -> co_varnames , j , locals , fast , 0 , clear );
822- if (f -> f_ncells || f -> f_nfreevars ) {
823- if (!(PyTuple_Check (f -> f_code -> co_cellvars )
824- && PyTuple_Check (f -> f_code -> co_freevars )))
825- return ;
826- dict_to_map (f -> f_code -> co_cellvars ,
827- PyTuple_GET_SIZE (f -> f_code -> co_cellvars ),
828- locals , fast + f -> f_nlocals , 1 , clear );
829- dict_to_map (f -> f_code -> co_freevars ,
830- PyTuple_GET_SIZE (f -> f_code -> co_freevars ),
831- locals , fast + f -> f_nlocals + f -> f_ncells , 1 ,
832- clear );
819+ if (j > co -> co_nlocals )
820+ j = co -> co_nlocals ;
821+ if (co -> co_nlocals )
822+ dict_to_map (co -> co_varnames , j , locals , fast , 0 , clear );
823+ ncells = PyTuple_GET_SIZE (co -> co_cellvars );
824+ nfreevars = PyTuple_GET_SIZE (co -> co_freevars );
825+ if (ncells || nfreevars ) {
826+ dict_to_map (co -> co_cellvars , ncells ,
827+ locals , fast + co -> co_nlocals , 1 , clear );
828+ dict_to_map (co -> co_freevars , nfreevars ,
829+ locals , fast + co -> co_nlocals + ncells , 1 ,
830+ clear );
833831 }
834832 PyErr_Restore (error_type , error_value , error_traceback );
835833}
0 commit comments