mirror of
https://github.com/python/cpython.git
synced 2025-12-23 09:19:18 +00:00
Revert "gh-133395: add option for extension modules to specialize BINARY_OP/SUBSCR, apply to arrays (#133396)" (#133498)
This commit is contained in:
parent
3c73cf51df
commit
296cd128bf
14 changed files with 44 additions and 171 deletions
|
|
@ -143,11 +143,6 @@ typedef struct {
|
|||
* backwards-compatibility */
|
||||
typedef Py_ssize_t printfunc;
|
||||
|
||||
/* Specialize a binary op by setting the descriptor pointer */
|
||||
struct _PyBinopSpecializationDescr;
|
||||
typedef int (*binop_specialize_func)(PyObject *v, PyObject *w, int oparg,
|
||||
struct _PyBinopSpecializationDescr **descr);
|
||||
|
||||
// If this structure is modified, Doc/includes/typestruct.h should be updated
|
||||
// as well.
|
||||
struct _typeobject {
|
||||
|
|
@ -238,13 +233,6 @@ struct _typeobject {
|
|||
/* bitset of which type-watchers care about this type */
|
||||
unsigned char tp_watched;
|
||||
|
||||
/* callback that may specialize BINARY_OP
|
||||
* this is an experimental API based on the ideas in the paper
|
||||
* Cross Module Quickening - The Curious Case of C Extensions
|
||||
* by Felix Berlakovich and Stefan Brunthaler.
|
||||
*/
|
||||
binop_specialize_func tp_binop_specialize;
|
||||
|
||||
/* Number of tp_version_tag values used.
|
||||
* Set to _Py_ATTR_CACHE_UNUSED if the attribute cache is
|
||||
* disabled for this type (e.g. due to custom MRO entries).
|
||||
|
|
|
|||
|
|
@ -480,18 +480,13 @@ adaptive_counter_backoff(_Py_BackoffCounter counter) {
|
|||
/* Specialization Extensions */
|
||||
|
||||
/* callbacks for an external specialization */
|
||||
|
||||
struct _PyBinopSpecializationDescr;
|
||||
|
||||
typedef int (*binaryopguardfunc)(PyObject *lhs, PyObject *rhs);
|
||||
typedef PyObject* (*binaryopactionfunc)(PyObject *lhs, PyObject *rhs);
|
||||
typedef void (*binaryopfreefunc)(struct _PyBinopSpecializationDescr *descr);
|
||||
typedef PyObject *(*binaryopactionfunc)(PyObject *lhs, PyObject *rhs);
|
||||
|
||||
typedef struct _PyBinopSpecializationDescr {
|
||||
typedef struct {
|
||||
int oparg;
|
||||
binaryopguardfunc guard;
|
||||
binaryopactionfunc action;
|
||||
binaryopfreefunc free;
|
||||
} _PyBinaryOpSpecializationDescr;
|
||||
|
||||
/* Comparison bit masks. */
|
||||
|
|
|
|||
3
Include/internal/pycore_opcode_metadata.h
generated
3
Include/internal/pycore_opcode_metadata.h
generated
|
|
@ -1082,7 +1082,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = {
|
|||
[BINARY_OP_ADD_FLOAT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
|
||||
[BINARY_OP_ADD_INT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
|
||||
[BINARY_OP_ADD_UNICODE] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
|
||||
[BINARY_OP_EXTEND] = { true, INSTR_FMT_IXC0000, HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
|
||||
[BINARY_OP_EXTEND] = { true, INSTR_FMT_IXC0000, HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG },
|
||||
[BINARY_OP_INPLACE_ADD_UNICODE] = { true, INSTR_FMT_IXC0000, HAS_LOCAL_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
|
||||
[BINARY_OP_MULTIPLY_FLOAT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
|
||||
[BINARY_OP_MULTIPLY_INT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
|
||||
|
|
@ -1333,6 +1333,7 @@ _PyOpcode_macro_expansion[256] = {
|
|||
[BINARY_OP_ADD_FLOAT] = { .nuops = 3, .uops = { { _GUARD_TOS_FLOAT, OPARG_SIMPLE, 0 }, { _GUARD_NOS_FLOAT, OPARG_SIMPLE, 0 }, { _BINARY_OP_ADD_FLOAT, OPARG_SIMPLE, 5 } } },
|
||||
[BINARY_OP_ADD_INT] = { .nuops = 3, .uops = { { _GUARD_TOS_INT, OPARG_SIMPLE, 0 }, { _GUARD_NOS_INT, OPARG_SIMPLE, 0 }, { _BINARY_OP_ADD_INT, OPARG_SIMPLE, 5 } } },
|
||||
[BINARY_OP_ADD_UNICODE] = { .nuops = 3, .uops = { { _GUARD_TOS_UNICODE, OPARG_SIMPLE, 0 }, { _GUARD_NOS_UNICODE, OPARG_SIMPLE, 0 }, { _BINARY_OP_ADD_UNICODE, OPARG_SIMPLE, 5 } } },
|
||||
[BINARY_OP_EXTEND] = { .nuops = 2, .uops = { { _GUARD_BINARY_OP_EXTEND, 4, 1 }, { _BINARY_OP_EXTEND, 4, 1 } } },
|
||||
[BINARY_OP_INPLACE_ADD_UNICODE] = { .nuops = 3, .uops = { { _GUARD_TOS_UNICODE, OPARG_SIMPLE, 0 }, { _GUARD_NOS_UNICODE, OPARG_SIMPLE, 0 }, { _BINARY_OP_INPLACE_ADD_UNICODE, OPARG_SIMPLE, 5 } } },
|
||||
[BINARY_OP_MULTIPLY_FLOAT] = { .nuops = 3, .uops = { { _GUARD_TOS_FLOAT, OPARG_SIMPLE, 0 }, { _GUARD_NOS_FLOAT, OPARG_SIMPLE, 0 }, { _BINARY_OP_MULTIPLY_FLOAT, OPARG_SIMPLE, 5 } } },
|
||||
[BINARY_OP_MULTIPLY_INT] = { .nuops = 3, .uops = { { _GUARD_TOS_INT, OPARG_SIMPLE, 0 }, { _GUARD_NOS_INT, OPARG_SIMPLE, 0 }, { _BINARY_OP_MULTIPLY_INT, OPARG_SIMPLE, 5 } } },
|
||||
|
|
|
|||
6
Include/internal/pycore_uop_metadata.h
generated
6
Include/internal/pycore_uop_metadata.h
generated
|
|
@ -94,7 +94,8 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
|
|||
[_BINARY_OP_SUBTRACT_FLOAT] = HAS_ERROR_FLAG | HAS_PURE_FLAG,
|
||||
[_BINARY_OP_ADD_UNICODE] = HAS_ERROR_FLAG | HAS_PURE_FLAG,
|
||||
[_BINARY_OP_INPLACE_ADD_UNICODE] = HAS_LOCAL_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
|
||||
[_BINARY_OP_EXTEND] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_PURE_FLAG,
|
||||
[_GUARD_BINARY_OP_EXTEND] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG,
|
||||
[_BINARY_OP_EXTEND] = HAS_ESCAPES_FLAG | HAS_PURE_FLAG,
|
||||
[_BINARY_SLICE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
|
||||
[_STORE_SLICE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
|
||||
[_BINARY_OP_SUBSCR_LIST_INT] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG,
|
||||
|
|
@ -423,6 +424,7 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = {
|
|||
[_GET_ITER] = "_GET_ITER",
|
||||
[_GET_LEN] = "_GET_LEN",
|
||||
[_GET_YIELD_FROM_ITER] = "_GET_YIELD_FROM_ITER",
|
||||
[_GUARD_BINARY_OP_EXTEND] = "_GUARD_BINARY_OP_EXTEND",
|
||||
[_GUARD_CALLABLE_LEN] = "_GUARD_CALLABLE_LEN",
|
||||
[_GUARD_CALLABLE_STR_1] = "_GUARD_CALLABLE_STR_1",
|
||||
[_GUARD_CALLABLE_TUPLE_1] = "_GUARD_CALLABLE_TUPLE_1",
|
||||
|
|
@ -760,6 +762,8 @@ int _PyUop_num_popped(int opcode, int oparg)
|
|||
return 2;
|
||||
case _BINARY_OP_INPLACE_ADD_UNICODE:
|
||||
return 2;
|
||||
case _GUARD_BINARY_OP_EXTEND:
|
||||
return 0;
|
||||
case _BINARY_OP_EXTEND:
|
||||
return 2;
|
||||
case _BINARY_SLICE:
|
||||
|
|
|
|||
|
|
@ -93,5 +93,4 @@
|
|||
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030E0000
|
||||
/* New in 3.14 */
|
||||
#define Py_tp_token 83
|
||||
#define Py_tp_binop_specialize 84
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue