mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
Remove f_closure slot of frameobject and use f_localsplus instead.
This change eliminates an extra malloc/free when a frame with free variables is created. Any cell vars or free vars are stored in f_localsplus after the locals and before the stack. eval_code2() fills in the appropriate values after handling initialization of locals. To track the size the frame has an f_size member that tracks the total size of f_localsplus. It used to be implicitly f_nlocals + f_stacksize.
This commit is contained in:
parent
55087f0c35
commit
2b724da8d9
3 changed files with 33 additions and 28 deletions
|
@ -20,7 +20,6 @@ typedef struct _frame {
|
|||
PyObject *f_builtins; /* builtin symbol table (PyDictObject) */
|
||||
PyObject *f_globals; /* global symbol table (PyDictObject) */
|
||||
PyObject *f_locals; /* local symbol table (PyDictObject) */
|
||||
PyObject *f_closure; /* environment for free variables */
|
||||
PyObject **f_valuestack; /* points after the last local */
|
||||
PyObject *f_trace; /* Trace function */
|
||||
PyObject *f_exc_type, *f_exc_value, *f_exc_traceback;
|
||||
|
@ -31,7 +30,10 @@ typedef struct _frame {
|
|||
in this scope */
|
||||
int f_iblock; /* index in f_blockstack */
|
||||
PyTryBlock f_blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */
|
||||
int f_size; /* size of localsplus */
|
||||
int f_nlocals; /* number of locals */
|
||||
int f_ncells;
|
||||
int f_nfreevars;
|
||||
int f_stacksize; /* size of value stack */
|
||||
PyObject *f_localsplus[1]; /* locals+stack, dynamically sized */
|
||||
} PyFrameObject;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue