Skip to content

Commit

Permalink
bpo-43690: stable_abi.py no longer parses macros (GH-25136)
Browse files Browse the repository at this point in the history
The stable_abi.py script no longer parse macros. Macro targets can be
static inline functions which are not part of the stable ABI, only
part of the limited C API.

Run "make regen-limited-abi" to exclude PyType_HasFeature from
Doc/data/stable_abi.dat.
  • Loading branch information
vstinner committed Apr 1, 2021
1 parent baf10da commit 61092a9
Show file tree
Hide file tree
Showing 2 changed files with 1 addition and 33 deletions.
1 change: 0 additions & 1 deletion Doc/data/stable_abi.dat
Expand Up @@ -616,7 +616,6 @@ PyType_GetFlags
PyType_GetModule
PyType_GetModuleState
PyType_GetSlot
PyType_HasFeature
PyType_IsSubtype
PyType_Modified
PyType_Ready
Expand Down
33 changes: 1 addition & 32 deletions Tools/scripts/stable_abi.py
Expand Up @@ -112,11 +112,10 @@ def generate_limited_api_symbols(args):
stable_data, stable_exported_data, stable_functions = get_limited_api_definitions(
headers
)
macros = get_limited_api_macros(headers)

stable_symbols = {
symbol
for symbol in (stable_functions | stable_exported_data | stable_data | macros)
for symbol in (stable_functions | stable_exported_data | stable_data)
if symbol.startswith("Py") and symbol in available_symbols
}
with open(args.output_file, "w") as output_file:
Expand All @@ -128,36 +127,6 @@ def generate_limited_api_symbols(args):
output_file.write(f"{symbol}\n")


def get_limited_api_macros(headers):
"""Run the preprocesor over all the header files in "Include" setting
"-DPy_LIMITED_API" to the correct value for the running version of the interpreter
and extracting all macro definitions (via adding -dM to the compiler arguments).
"""

preprocesor_output_with_macros = subprocess.check_output(
sysconfig.get_config_var("CC").split()
+ [
# Prevent the expansion of the exported macros so we can capture them later
"-DSIZEOF_WCHAR_T=4", # The actual value is not important
f"-DPy_LIMITED_API={sys.version_info.major << 24 | sys.version_info.minor << 16}",
"-I.",
"-I./Include",
"-dM",
"-E",
]
+ [str(file) for file in headers],
text=True,
stderr=subprocess.DEVNULL,
)

return {
target
for _, target in re.findall(
r"#define (\w+)\s*(?:\(.*?\))?\s+(\w+)", preprocesor_output_with_macros
)
}


def get_limited_api_definitions(headers):
"""Run the preprocesor over all the header files in "Include" setting
"-DPy_LIMITED_API" to the correct value for the running version of the interpreter.
Expand Down

0 comments on commit 61092a9

Please sign in to comment.