Skip to content

Commit

Permalink
pythongh-120029: export DEF_TYPE_PARAM compiler flag (python#120028)
Browse files Browse the repository at this point in the history
  • Loading branch information
picnixz authored Jun 4, 2024
1 parent e69d068 commit ff1857d
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 5 deletions.
4 changes: 4 additions & 0 deletions Doc/library/symtable.rst
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,10 @@ Examining Symbol Tables

Return ``True`` if the symbol is a parameter.

.. method:: is_type_parameter()

Return ``True`` if the symbol is a type parameter.

.. method:: is_global()

Return ``True`` if the symbol is global.
Expand Down
17 changes: 13 additions & 4 deletions Lib/symtable.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
"""Interface to the compiler's internal symbol tables"""

import _symtable
from _symtable import (USE, DEF_GLOBAL, DEF_NONLOCAL, DEF_LOCAL, DEF_PARAM,
DEF_IMPORT, DEF_BOUND, DEF_ANNOT, SCOPE_OFF, SCOPE_MASK, FREE,
LOCAL, GLOBAL_IMPLICIT, GLOBAL_EXPLICIT, CELL)
from _symtable import (
USE,
DEF_GLOBAL, DEF_NONLOCAL, DEF_LOCAL,
DEF_PARAM, DEF_TYPE_PARAM, DEF_IMPORT, DEF_BOUND, DEF_ANNOT,
SCOPE_OFF, SCOPE_MASK,
FREE, LOCAL, GLOBAL_IMPLICIT, GLOBAL_EXPLICIT, CELL
)

import weakref

Expand Down Expand Up @@ -253,13 +257,18 @@ def is_referenced(self):
"""Return *True* if the symbol is used in
its block.
"""
return bool(self.__flags & _symtable.USE)
return bool(self.__flags & USE)

def is_parameter(self):
"""Return *True* if the symbol is a parameter.
"""
return bool(self.__flags & DEF_PARAM)

def is_type_parameter(self):
"""Return *True* if the symbol is a type parameter.
"""
return bool(self.__flags & DEF_TYPE_PARAM)

def is_global(self):
"""Return *True* if the symbol is global.
"""
Expand Down
2 changes: 2 additions & 0 deletions Lib/test/test_symtable.py
Original file line number Diff line number Diff line change
Expand Up @@ -299,6 +299,8 @@ def test_symbol_repr(self):
"<symbol 'x': FREE, USE>")
self.assertEqual(repr(self.other_internal.lookup("some_var")),
"<symbol 'some_var': FREE, USE|DEF_NONLOCAL|DEF_LOCAL>")
self.assertEqual(repr(self.GenericMine.lookup("T")),
"<symbol 'T': LOCAL, DEF_LOCAL|DEF_TYPE_PARAM>")

def test_symtable_entry_repr(self):
expected = f"<symtable entry top({self.top.get_id()}), line {self.top.get_lineno()}>"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Expose :meth:`symtable.Symbol.is_type_parameter` in the :mod:`symtable`
module. Patch by Bénédikt Tran.
4 changes: 3 additions & 1 deletion Modules/symtablemodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ symtable_init_constants(PyObject *m)
if (PyModule_AddIntMacro(m, DEF_NONLOCAL) < 0) return -1;
if (PyModule_AddIntMacro(m, DEF_LOCAL) < 0) return -1;
if (PyModule_AddIntMacro(m, DEF_PARAM) < 0) return -1;
if (PyModule_AddIntMacro(m, DEF_TYPE_PARAM) < 0) return -1;
if (PyModule_AddIntMacro(m, DEF_FREE) < 0) return -1;
if (PyModule_AddIntMacro(m, DEF_FREE_CLASS) < 0) return -1;
if (PyModule_AddIntMacro(m, DEF_IMPORT) < 0) return -1;
Expand All @@ -83,7 +84,8 @@ symtable_init_constants(PyObject *m)

if (PyModule_AddIntConstant(m, "TYPE_FUNCTION", FunctionBlock) < 0)
return -1;
if (PyModule_AddIntConstant(m, "TYPE_CLASS", ClassBlock) < 0) return -1;
if (PyModule_AddIntConstant(m, "TYPE_CLASS", ClassBlock) < 0)
return -1;
if (PyModule_AddIntConstant(m, "TYPE_MODULE", ModuleBlock) < 0)
return -1;
if (PyModule_AddIntConstant(m, "TYPE_ANNOTATION", AnnotationBlock) < 0)
Expand Down

0 comments on commit ff1857d

Please sign in to comment.