Skip to content

gh-122985: add SYMBOL_TO_SCOPE macro in symtable #122986

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Include/internal/pycore_symtable.h
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ extern PyObject* _Py_Mangle(PyObject *p, PyObject *name);
*/
#define SCOPE_OFFSET 12
#define SCOPE_MASK (DEF_GLOBAL | DEF_LOCAL | DEF_PARAM | DEF_NONLOCAL)
#define SYMBOL_TO_SCOPE(S) (((S) >> SCOPE_OFFSET) & SCOPE_MASK)

#define LOCAL 1
#define GLOBAL_EXPLICIT 2
Expand Down
11 changes: 4 additions & 7 deletions Python/compile.c
Original file line number Diff line number Diff line change
Expand Up @@ -491,7 +491,7 @@ each key.
static PyObject *
dictbytype(PyObject *src, int scope_type, int flag, Py_ssize_t offset)
{
Py_ssize_t i = offset, scope, num_keys, key_i;
Py_ssize_t i = offset, num_keys, key_i;
PyObject *k, *v, *dest = PyDict_New();
PyObject *sorted_keys;

Expand Down Expand Up @@ -533,10 +533,7 @@ dictbytype(PyObject *src, int scope_type, int flag, Py_ssize_t offset)
Py_DECREF(dest);
return NULL;
}
/* XXX this should probably be a macro in symtable.h */
scope = (vi >> SCOPE_OFFSET) & SCOPE_MASK;

if (scope == scope_type || vi & flag) {
if (SYMBOL_TO_SCOPE(vi) == scope_type || vi & flag) {
PyObject *item = PyLong_FromSsize_t(i);
if (item == NULL) {
Py_DECREF(sorted_keys);
Expand Down Expand Up @@ -5393,7 +5390,7 @@ push_inlined_comprehension_state(struct compiler *c, location loc,
if (symbol == -1 && PyErr_Occurred()) {
return ERROR;
}
long scope = (symbol >> SCOPE_OFFSET) & SCOPE_MASK;
long scope = SYMBOL_TO_SCOPE(symbol);
PyObject *outv = PyDict_GetItemWithError(SYMTABLE_ENTRY(c)->ste_symbols, k);
if (outv == NULL) {
if (PyErr_Occurred()) {
Expand All @@ -5405,7 +5402,7 @@ push_inlined_comprehension_state(struct compiler *c, location loc,
if (outsymbol == -1 && PyErr_Occurred()) {
return ERROR;
}
long outsc = (outsymbol >> SCOPE_OFFSET) & SCOPE_MASK;
long outsc = SYMBOL_TO_SCOPE(outsymbol);
// If a name has different scope inside than outside the comprehension,
// we need to temporarily handle it with the right scope while
// compiling the comprehension. If it's free in the comprehension
Expand Down
4 changes: 2 additions & 2 deletions Python/symtable.c
Original file line number Diff line number Diff line change
Expand Up @@ -551,7 +551,7 @@ _PyST_GetScope(PySTEntryObject *ste, PyObject *name)
if (symbol < 0) {
return -1;
}
return (symbol >> SCOPE_OFFSET) & SCOPE_MASK;
return SYMBOL_TO_SCOPE(symbol);
}

int
Expand Down Expand Up @@ -809,7 +809,7 @@ inline_comprehension(PySTEntryObject *ste, PySTEntryObject *comp,
assert(_PyUnicode_EqualToASCIIString(k, ".0"));
continue;
}
int scope = (comp_flags >> SCOPE_OFFSET) & SCOPE_MASK;
int scope = SYMBOL_TO_SCOPE(comp_flags);
int only_flags = comp_flags & ((1 << SCOPE_OFFSET) - 1);
if (scope == CELL || only_flags & DEF_COMP_CELL) {
if (PySet_Add(inlined_cells, k) < 0) {
Expand Down
Loading