[Python-checkins] cpython: store the current scope on the stack right away

benjamin.peterson python-checkins at python.org
Thu Jun 30 05:53:56 CEST 2011


http://hg.python.org/cpython/rev/151142c0c5b1
changeset: 71087:151142c0c5b1
parent: 71084:9aa3fcab76f0
user: Benjamin Peterson <benjamin at python.org>
date: Wed Jun 29 22:52:39 2011 -0500
summary:
 store the current scope on the stack right away
files:
 Python/symtable.c | 39 ++++++++++++++++------------------
 1 files changed, 18 insertions(+), 21 deletions(-)
diff --git a/Python/symtable.c b/Python/symtable.c
--- a/Python/symtable.c
+++ b/Python/symtable.c
@@ -899,17 +899,14 @@
 static int
 symtable_exit_block(struct symtable *st, void *ast)
 {
- Py_ssize_t end;
+ Py_ssize_t size;
 
- Py_CLEAR(st->st_cur);
- end = PyList_GET_SIZE(st->st_stack) - 1;
- if (end >= 0) {
+ st->st_cur = NULL;
+ size = PyList_GET_SIZE(st->st_stack);
+ if (size) {
 st->st_cur = (PySTEntryObject *)PyList_GET_ITEM(st->st_stack,
- end);
- if (st->st_cur == NULL)
- return 0;
- Py_INCREF(st->st_cur);
- if (PySequence_DelItem(st->st_stack, end) < 0)
+ size - 2);
+ if (PyList_SetSlice(st->st_stack, size - 1, size, NULL) < 0)
 return 0;
 }
 return 1;
@@ -919,23 +916,23 @@
 symtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block,
 void *ast, int lineno, int col_offset)
 {
- PySTEntryObject *prev = NULL;
+ PySTEntryObject *prev = NULL, *ste;
 
- if (st->st_cur) {
- prev = st->st_cur;
- if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
- return 0;
- }
- Py_DECREF(st->st_cur);
+ ste = ste_new(st, name, block, ast, lineno, col_offset);
+ if (ste == NULL)
+ return 0;
+ if (PyList_Append(st->st_stack, (PyObject *)ste) < 0) {
+ Py_DECREF(ste);
+ return 0;
 }
- st->st_cur = ste_new(st, name, block, ast, lineno, col_offset);
- if (st->st_cur == NULL)
- return 0;
+ prev = st->st_cur;
+ /* The entry is owned by the stack. Borrow it for st_cur. */
+ Py_DECREF(ste);
+ st->st_cur = ste;
 if (block == ModuleBlock)
 st->st_global = st->st_cur->ste_symbols;
 if (prev) {
- if (PyList_Append(prev->ste_children,
- (PyObject *)st->st_cur) < 0) {
+ if (PyList_Append(prev->ste_children, (PyObject *)ste) < 0) {
 return 0;
 }
 }
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /