Skip to content

Commit 05fc4d7

Browse files
authored
gh-122985: add SYMBOL_TO_SCOPE macro in symtable (#122986)
1 parent e03073f commit 05fc4d7

File tree

3 files changed

+7
-9
lines changed

3 files changed

+7
-9
lines changed

Include/internal/pycore_symtable.h

+1
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ extern PyObject* _Py_Mangle(PyObject *p, PyObject *name);
171171
*/
172172
#define SCOPE_OFFSET 12
173173
#define SCOPE_MASK (DEF_GLOBAL | DEF_LOCAL | DEF_PARAM | DEF_NONLOCAL)
174+
#define SYMBOL_TO_SCOPE(S) (((S) >> SCOPE_OFFSET) & SCOPE_MASK)
174175

175176
#define LOCAL 1
176177
#define GLOBAL_EXPLICIT 2

Python/compile.c

+4-7
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,7 @@ each key.
491491
static PyObject *
492492
dictbytype(PyObject *src, int scope_type, int flag, Py_ssize_t offset)
493493
{
494-
Py_ssize_t i = offset, scope, num_keys, key_i;
494+
Py_ssize_t i = offset, num_keys, key_i;
495495
PyObject *k, *v, *dest = PyDict_New();
496496
PyObject *sorted_keys;
497497

@@ -533,10 +533,7 @@ dictbytype(PyObject *src, int scope_type, int flag, Py_ssize_t offset)
533533
Py_DECREF(dest);
534534
return NULL;
535535
}
536-
/* XXX this should probably be a macro in symtable.h */
537-
scope = (vi >> SCOPE_OFFSET) & SCOPE_MASK;
538-
539-
if (scope == scope_type || vi & flag) {
536+
if (SYMBOL_TO_SCOPE(vi) == scope_type || vi & flag) {
540537
PyObject *item = PyLong_FromSsize_t(i);
541538
if (item == NULL) {
542539
Py_DECREF(sorted_keys);
@@ -5393,7 +5390,7 @@ push_inlined_comprehension_state(struct compiler *c, location loc,
53935390
if (symbol == -1 && PyErr_Occurred()) {
53945391
return ERROR;
53955392
}
5396-
long scope = (symbol >> SCOPE_OFFSET) & SCOPE_MASK;
5393+
long scope = SYMBOL_TO_SCOPE(symbol);
53975394
PyObject *outv = PyDict_GetItemWithError(SYMTABLE_ENTRY(c)->ste_symbols, k);
53985395
if (outv == NULL) {
53995396
if (PyErr_Occurred()) {
@@ -5405,7 +5402,7 @@ push_inlined_comprehension_state(struct compiler *c, location loc,
54055402
if (outsymbol == -1 && PyErr_Occurred()) {
54065403
return ERROR;
54075404
}
5408-
long outsc = (outsymbol >> SCOPE_OFFSET) & SCOPE_MASK;
5405+
long outsc = SYMBOL_TO_SCOPE(outsymbol);
54095406
// If a name has different scope inside than outside the comprehension,
54105407
// we need to temporarily handle it with the right scope while
54115408
// compiling the comprehension. If it's free in the comprehension

Python/symtable.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,7 @@ _PyST_GetScope(PySTEntryObject *ste, PyObject *name)
551551
if (symbol < 0) {
552552
return -1;
553553
}
554-
return (symbol >> SCOPE_OFFSET) & SCOPE_MASK;
554+
return SYMBOL_TO_SCOPE(symbol);
555555
}
556556

557557
int
@@ -809,7 +809,7 @@ inline_comprehension(PySTEntryObject *ste, PySTEntryObject *comp,
809809
assert(_PyUnicode_EqualToASCIIString(k, ".0"));
810810
continue;
811811
}
812-
int scope = (comp_flags >> SCOPE_OFFSET) & SCOPE_MASK;
812+
int scope = SYMBOL_TO_SCOPE(comp_flags);
813813
int only_flags = comp_flags & ((1 << SCOPE_OFFSET) - 1);
814814
if (scope == CELL || only_flags & DEF_COMP_CELL) {
815815
if (PySet_Add(inlined_cells, k) < 0) {

0 commit comments

Comments
 (0)