From 9930928e950e048b2408f55fb60f301c6dd1e7c0 Mon Sep 17 00:00:00 2001 From: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com> Date: Thu, 19 Jun 2025 20:20:04 +0800 Subject: [PATCH 1/2] Move PyLong_CheckCompact to private header --- Include/cpython/longintrepr.h | 6 ------ Include/internal/pycore_long.h | 6 ++++++ Python/bytecodes.c | 4 ++-- Python/executor_cases.c.h | 4 ++-- Python/generated_cases.c.h | 24 ++++++++++++------------ Python/optimizer_symbols.c | 6 +++--- Tools/cases_generator/analyzer.py | 2 +- 7 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Include/cpython/longintrepr.h b/Include/cpython/longintrepr.h index 19a57284e0edb1..4b6f97a5e475d6 100644 --- a/Include/cpython/longintrepr.h +++ b/Include/cpython/longintrepr.h @@ -124,12 +124,6 @@ _PyLong_IsCompact(const PyLongObject* op) { return op->long_value.lv_tag < (2 << _PyLong_NON_SIZE_BITS); } -static inline int -PyLong_CheckCompact(PyObject *op) -{ - return PyLong_CheckExact(op) && _PyLong_IsCompact((const PyLongObject *)op); -} - #define PyUnstable_Long_IsCompact _PyLong_IsCompact static inline Py_ssize_t diff --git a/Include/internal/pycore_long.h b/Include/internal/pycore_long.h index 852d22bb8c5749..fad23562befa76 100644 --- a/Include/internal/pycore_long.h +++ b/Include/internal/pycore_long.h @@ -312,6 +312,12 @@ _PyLong_FlipSign(PyLongObject *op) { #define _PyLong_FALSE_TAG TAG_FROM_SIGN_AND_SIZE(0, 0) #define _PyLong_TRUE_TAG TAG_FROM_SIGN_AND_SIZE(1, 1) +static inline int +_PyLong_CheckCompact(PyObject *op) +{ + return PyLong_CheckExact(op) && _PyLong_IsCompact((const PyLongObject *)op); +} + #ifdef __cplusplus } #endif diff --git a/Python/bytecodes.c b/Python/bytecodes.c index c83bc15c751510..3cafc18f3476a7 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -569,12 +569,12 @@ dummy_func( op(_GUARD_NOS_INT, (left, unused -- left, unused)) { PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); - EXIT_IF(!PyLong_CheckCompact(left_o)); + EXIT_IF(!_PyLong_CheckCompact(left_o)); } op(_GUARD_TOS_INT, (value -- value)) { PyObject *value_o = PyStackRef_AsPyObjectBorrow(value); - EXIT_IF(!PyLong_CheckCompact(value_o)); + EXIT_IF(!_PyLong_CheckCompact(value_o)); } op(_GUARD_NOS_OVERFLOWED, (left, unused -- left, unused)) { diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index b6338dd483b4a0..f3e5d50e38809f 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -852,7 +852,7 @@ _PyStackRef left; left = stack_pointer[-2]; PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); - if (!PyLong_CheckCompact(left_o)) { + if (!_PyLong_CheckCompact(left_o)) { UOP_STAT_INC(uopcode, miss); JUMP_TO_JUMP_TARGET(); } @@ -863,7 +863,7 @@ _PyStackRef value; value = stack_pointer[-1]; PyObject *value_o = PyStackRef_AsPyObjectBorrow(value); - if (!PyLong_CheckCompact(value_o)) { + if (!_PyLong_CheckCompact(value_o)) { UOP_STAT_INC(uopcode, miss); JUMP_TO_JUMP_TARGET(); } diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 82142aee9a3aea..a5184a9caa3f80 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -158,7 +158,7 @@ { value = stack_pointer[-1]; PyObject *value_o = PyStackRef_AsPyObjectBorrow(value); - if (!PyLong_CheckCompact(value_o)) { + if (!_PyLong_CheckCompact(value_o)) { UPDATE_MISS_STATS(BINARY_OP); assert(_PyOpcode_Deopt[opcode] == (BINARY_OP)); JUMP_TO_PREDICTED(BINARY_OP); @@ -168,7 +168,7 @@ { left = stack_pointer[-2]; PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); - if (!PyLong_CheckCompact(left_o)) { + if (!_PyLong_CheckCompact(left_o)) { UPDATE_MISS_STATS(BINARY_OP); assert(_PyOpcode_Deopt[opcode] == (BINARY_OP)); JUMP_TO_PREDICTED(BINARY_OP); @@ -483,7 +483,7 @@ { value = stack_pointer[-1]; PyObject *value_o = PyStackRef_AsPyObjectBorrow(value); - if (!PyLong_CheckCompact(value_o)) { + if (!_PyLong_CheckCompact(value_o)) { UPDATE_MISS_STATS(BINARY_OP); assert(_PyOpcode_Deopt[opcode] == (BINARY_OP)); JUMP_TO_PREDICTED(BINARY_OP); @@ -493,7 +493,7 @@ { left = stack_pointer[-2]; PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); - if (!PyLong_CheckCompact(left_o)) { + if (!_PyLong_CheckCompact(left_o)) { UPDATE_MISS_STATS(BINARY_OP); assert(_PyOpcode_Deopt[opcode] == (BINARY_OP)); JUMP_TO_PREDICTED(BINARY_OP); @@ -694,7 +694,7 @@ { value = stack_pointer[-1]; PyObject *value_o = PyStackRef_AsPyObjectBorrow(value); - if (!PyLong_CheckCompact(value_o)) { + if (!_PyLong_CheckCompact(value_o)) { UPDATE_MISS_STATS(BINARY_OP); assert(_PyOpcode_Deopt[opcode] == (BINARY_OP)); JUMP_TO_PREDICTED(BINARY_OP); @@ -856,7 +856,7 @@ { value = stack_pointer[-1]; PyObject *value_o = PyStackRef_AsPyObjectBorrow(value); - if (!PyLong_CheckCompact(value_o)) { + if (!_PyLong_CheckCompact(value_o)) { UPDATE_MISS_STATS(BINARY_OP); assert(_PyOpcode_Deopt[opcode] == (BINARY_OP)); JUMP_TO_PREDICTED(BINARY_OP); @@ -934,7 +934,7 @@ { value = stack_pointer[-1]; PyObject *value_o = PyStackRef_AsPyObjectBorrow(value); - if (!PyLong_CheckCompact(value_o)) { + if (!_PyLong_CheckCompact(value_o)) { UPDATE_MISS_STATS(BINARY_OP); assert(_PyOpcode_Deopt[opcode] == (BINARY_OP)); JUMP_TO_PREDICTED(BINARY_OP); @@ -1064,7 +1064,7 @@ { value = stack_pointer[-1]; PyObject *value_o = PyStackRef_AsPyObjectBorrow(value); - if (!PyLong_CheckCompact(value_o)) { + if (!_PyLong_CheckCompact(value_o)) { UPDATE_MISS_STATS(BINARY_OP); assert(_PyOpcode_Deopt[opcode] == (BINARY_OP)); JUMP_TO_PREDICTED(BINARY_OP); @@ -1074,7 +1074,7 @@ { left = stack_pointer[-2]; PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); - if (!PyLong_CheckCompact(left_o)) { + if (!_PyLong_CheckCompact(left_o)) { UPDATE_MISS_STATS(BINARY_OP); assert(_PyOpcode_Deopt[opcode] == (BINARY_OP)); JUMP_TO_PREDICTED(BINARY_OP); @@ -4893,7 +4893,7 @@ { value = stack_pointer[-1]; PyObject *value_o = PyStackRef_AsPyObjectBorrow(value); - if (!PyLong_CheckCompact(value_o)) { + if (!_PyLong_CheckCompact(value_o)) { UPDATE_MISS_STATS(COMPARE_OP); assert(_PyOpcode_Deopt[opcode] == (COMPARE_OP)); JUMP_TO_PREDICTED(COMPARE_OP); @@ -4903,7 +4903,7 @@ { left = stack_pointer[-2]; PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); - if (!PyLong_CheckCompact(left_o)) { + if (!_PyLong_CheckCompact(left_o)) { UPDATE_MISS_STATS(COMPARE_OP); assert(_PyOpcode_Deopt[opcode] == (COMPARE_OP)); JUMP_TO_PREDICTED(COMPARE_OP); @@ -11473,7 +11473,7 @@ { value = stack_pointer[-1]; PyObject *value_o = PyStackRef_AsPyObjectBorrow(value); - if (!PyLong_CheckCompact(value_o)) { + if (!_PyLong_CheckCompact(value_o)) { UPDATE_MISS_STATS(STORE_SUBSCR); assert(_PyOpcode_Deopt[opcode] == (STORE_SUBSCR)); JUMP_TO_PREDICTED(STORE_SUBSCR); diff --git a/Python/optimizer_symbols.c b/Python/optimizer_symbols.c index 8ae670d10280ec..bf0883d88c046f 100644 --- a/Python/optimizer_symbols.c +++ b/Python/optimizer_symbols.c @@ -386,7 +386,7 @@ _Py_uop_sym_set_const(JitOptContext *ctx, JitOptRef ref, PyObject *const_val) make_const(sym, const_val); return; case JIT_SYM_COMPACT_INT: - if (PyLong_CheckCompact(const_val)) { + if (_PyLong_CheckCompact(const_val)) { make_const(sym, const_val); } else { @@ -679,7 +679,7 @@ _Py_uop_sym_is_compact_int(JitOptRef ref) { JitOptSymbol *sym = PyJitRef_Unwrap(ref); if (sym->tag == JIT_SYM_KNOWN_VALUE_TAG) { - return (bool)PyLong_CheckCompact(sym->value.value); + return (bool)_PyLong_CheckCompact(sym->value.value); } return sym->tag == JIT_SYM_COMPACT_INT; } @@ -716,7 +716,7 @@ _Py_uop_sym_set_compact_int(JitOptContext *ctx, JitOptRef ref) } return; case JIT_SYM_KNOWN_VALUE_TAG: - if (!PyLong_CheckCompact(sym->value.value)) { + if (!_PyLong_CheckCompact(sym->value.value)) { Py_CLEAR(sym->value.value); sym_set_bottom(ctx, sym); } diff --git a/Tools/cases_generator/analyzer.py b/Tools/cases_generator/analyzer.py index 8020c9c5c8a887..013a201071d5ee 100644 --- a/Tools/cases_generator/analyzer.py +++ b/Tools/cases_generator/analyzer.py @@ -687,7 +687,7 @@ def has_error_without_pop(op: parser.CodeDef) -> bool: "PyStackRef_IsValid", "PyStackRef_Wrap", "PyStackRef_Unwrap", - "PyLong_CheckCompact", + "_PyLong_CheckCompact", ) From b23c39ff3ba0a8423d312f128739b86264129846 Mon Sep 17 00:00:00 2001 From: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com> Date: Thu, 19 Jun 2025 20:24:23 +0800 Subject: [PATCH 2/2] rename --- Include/internal/pycore_long.h | 2 +- Python/bytecodes.c | 4 ++-- Python/executor_cases.c.h | 4 ++-- Python/generated_cases.c.h | 24 ++++++++++++------------ Python/optimizer_symbols.c | 6 +++--- Tools/cases_generator/analyzer.py | 2 +- 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/Include/internal/pycore_long.h b/Include/internal/pycore_long.h index fad23562befa76..3c213783cd432b 100644 --- a/Include/internal/pycore_long.h +++ b/Include/internal/pycore_long.h @@ -313,7 +313,7 @@ _PyLong_FlipSign(PyLongObject *op) { #define _PyLong_TRUE_TAG TAG_FROM_SIGN_AND_SIZE(1, 1) static inline int -_PyLong_CheckCompact(PyObject *op) +_PyLong_CheckExactAndCompact(PyObject *op) { return PyLong_CheckExact(op) && _PyLong_IsCompact((const PyLongObject *)op); } diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 3cafc18f3476a7..307844d38ccfcc 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -569,12 +569,12 @@ dummy_func( op(_GUARD_NOS_INT, (left, unused -- left, unused)) { PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); - EXIT_IF(!_PyLong_CheckCompact(left_o)); + EXIT_IF(!_PyLong_CheckExactAndCompact(left_o)); } op(_GUARD_TOS_INT, (value -- value)) { PyObject *value_o = PyStackRef_AsPyObjectBorrow(value); - EXIT_IF(!_PyLong_CheckCompact(value_o)); + EXIT_IF(!_PyLong_CheckExactAndCompact(value_o)); } op(_GUARD_NOS_OVERFLOWED, (left, unused -- left, unused)) { diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index f3e5d50e38809f..8f506172550afe 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -852,7 +852,7 @@ _PyStackRef left; left = stack_pointer[-2]; PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); - if (!_PyLong_CheckCompact(left_o)) { + if (!_PyLong_CheckExactAndCompact(left_o)) { UOP_STAT_INC(uopcode, miss); JUMP_TO_JUMP_TARGET(); } @@ -863,7 +863,7 @@ _PyStackRef value; value = stack_pointer[-1]; PyObject *value_o = PyStackRef_AsPyObjectBorrow(value); - if (!_PyLong_CheckCompact(value_o)) { + if (!_PyLong_CheckExactAndCompact(value_o)) { UOP_STAT_INC(uopcode, miss); JUMP_TO_JUMP_TARGET(); } diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index a5184a9caa3f80..8f7932f0033c6f 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -158,7 +158,7 @@ { value = stack_pointer[-1]; PyObject *value_o = PyStackRef_AsPyObjectBorrow(value); - if (!_PyLong_CheckCompact(value_o)) { + if (!_PyLong_CheckExactAndCompact(value_o)) { UPDATE_MISS_STATS(BINARY_OP); assert(_PyOpcode_Deopt[opcode] == (BINARY_OP)); JUMP_TO_PREDICTED(BINARY_OP); @@ -168,7 +168,7 @@ { left = stack_pointer[-2]; PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); - if (!_PyLong_CheckCompact(left_o)) { + if (!_PyLong_CheckExactAndCompact(left_o)) { UPDATE_MISS_STATS(BINARY_OP); assert(_PyOpcode_Deopt[opcode] == (BINARY_OP)); JUMP_TO_PREDICTED(BINARY_OP); @@ -483,7 +483,7 @@ { value = stack_pointer[-1]; PyObject *value_o = PyStackRef_AsPyObjectBorrow(value); - if (!_PyLong_CheckCompact(value_o)) { + if (!_PyLong_CheckExactAndCompact(value_o)) { UPDATE_MISS_STATS(BINARY_OP); assert(_PyOpcode_Deopt[opcode] == (BINARY_OP)); JUMP_TO_PREDICTED(BINARY_OP); @@ -493,7 +493,7 @@ { left = stack_pointer[-2]; PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); - if (!_PyLong_CheckCompact(left_o)) { + if (!_PyLong_CheckExactAndCompact(left_o)) { UPDATE_MISS_STATS(BINARY_OP); assert(_PyOpcode_Deopt[opcode] == (BINARY_OP)); JUMP_TO_PREDICTED(BINARY_OP); @@ -694,7 +694,7 @@ { value = stack_pointer[-1]; PyObject *value_o = PyStackRef_AsPyObjectBorrow(value); - if (!_PyLong_CheckCompact(value_o)) { + if (!_PyLong_CheckExactAndCompact(value_o)) { UPDATE_MISS_STATS(BINARY_OP); assert(_PyOpcode_Deopt[opcode] == (BINARY_OP)); JUMP_TO_PREDICTED(BINARY_OP); @@ -856,7 +856,7 @@ { value = stack_pointer[-1]; PyObject *value_o = PyStackRef_AsPyObjectBorrow(value); - if (!_PyLong_CheckCompact(value_o)) { + if (!_PyLong_CheckExactAndCompact(value_o)) { UPDATE_MISS_STATS(BINARY_OP); assert(_PyOpcode_Deopt[opcode] == (BINARY_OP)); JUMP_TO_PREDICTED(BINARY_OP); @@ -934,7 +934,7 @@ { value = stack_pointer[-1]; PyObject *value_o = PyStackRef_AsPyObjectBorrow(value); - if (!_PyLong_CheckCompact(value_o)) { + if (!_PyLong_CheckExactAndCompact(value_o)) { UPDATE_MISS_STATS(BINARY_OP); assert(_PyOpcode_Deopt[opcode] == (BINARY_OP)); JUMP_TO_PREDICTED(BINARY_OP); @@ -1064,7 +1064,7 @@ { value = stack_pointer[-1]; PyObject *value_o = PyStackRef_AsPyObjectBorrow(value); - if (!_PyLong_CheckCompact(value_o)) { + if (!_PyLong_CheckExactAndCompact(value_o)) { UPDATE_MISS_STATS(BINARY_OP); assert(_PyOpcode_Deopt[opcode] == (BINARY_OP)); JUMP_TO_PREDICTED(BINARY_OP); @@ -1074,7 +1074,7 @@ { left = stack_pointer[-2]; PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); - if (!_PyLong_CheckCompact(left_o)) { + if (!_PyLong_CheckExactAndCompact(left_o)) { UPDATE_MISS_STATS(BINARY_OP); assert(_PyOpcode_Deopt[opcode] == (BINARY_OP)); JUMP_TO_PREDICTED(BINARY_OP); @@ -4893,7 +4893,7 @@ { value = stack_pointer[-1]; PyObject *value_o = PyStackRef_AsPyObjectBorrow(value); - if (!_PyLong_CheckCompact(value_o)) { + if (!_PyLong_CheckExactAndCompact(value_o)) { UPDATE_MISS_STATS(COMPARE_OP); assert(_PyOpcode_Deopt[opcode] == (COMPARE_OP)); JUMP_TO_PREDICTED(COMPARE_OP); @@ -4903,7 +4903,7 @@ { left = stack_pointer[-2]; PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); - if (!_PyLong_CheckCompact(left_o)) { + if (!_PyLong_CheckExactAndCompact(left_o)) { UPDATE_MISS_STATS(COMPARE_OP); assert(_PyOpcode_Deopt[opcode] == (COMPARE_OP)); JUMP_TO_PREDICTED(COMPARE_OP); @@ -11473,7 +11473,7 @@ { value = stack_pointer[-1]; PyObject *value_o = PyStackRef_AsPyObjectBorrow(value); - if (!_PyLong_CheckCompact(value_o)) { + if (!_PyLong_CheckExactAndCompact(value_o)) { UPDATE_MISS_STATS(STORE_SUBSCR); assert(_PyOpcode_Deopt[opcode] == (STORE_SUBSCR)); JUMP_TO_PREDICTED(STORE_SUBSCR); diff --git a/Python/optimizer_symbols.c b/Python/optimizer_symbols.c index bf0883d88c046f..64cc1b9074fcf0 100644 --- a/Python/optimizer_symbols.c +++ b/Python/optimizer_symbols.c @@ -386,7 +386,7 @@ _Py_uop_sym_set_const(JitOptContext *ctx, JitOptRef ref, PyObject *const_val) make_const(sym, const_val); return; case JIT_SYM_COMPACT_INT: - if (_PyLong_CheckCompact(const_val)) { + if (_PyLong_CheckExactAndCompact(const_val)) { make_const(sym, const_val); } else { @@ -679,7 +679,7 @@ _Py_uop_sym_is_compact_int(JitOptRef ref) { JitOptSymbol *sym = PyJitRef_Unwrap(ref); if (sym->tag == JIT_SYM_KNOWN_VALUE_TAG) { - return (bool)_PyLong_CheckCompact(sym->value.value); + return (bool)_PyLong_CheckExactAndCompact(sym->value.value); } return sym->tag == JIT_SYM_COMPACT_INT; } @@ -716,7 +716,7 @@ _Py_uop_sym_set_compact_int(JitOptContext *ctx, JitOptRef ref) } return; case JIT_SYM_KNOWN_VALUE_TAG: - if (!_PyLong_CheckCompact(sym->value.value)) { + if (!_PyLong_CheckExactAndCompact(sym->value.value)) { Py_CLEAR(sym->value.value); sym_set_bottom(ctx, sym); } diff --git a/Tools/cases_generator/analyzer.py b/Tools/cases_generator/analyzer.py index 013a201071d5ee..6ff0223d2ef3e7 100644 --- a/Tools/cases_generator/analyzer.py +++ b/Tools/cases_generator/analyzer.py @@ -687,7 +687,7 @@ def has_error_without_pop(op: parser.CodeDef) -> bool: "PyStackRef_IsValid", "PyStackRef_Wrap", "PyStackRef_Unwrap", - "_PyLong_CheckCompact", + "_PyLong_CheckExactAndCompact", )
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: