gh-100239: specialize long tail of binary operations (#128722)

This commit is contained in:
Irit Katriel 2025-01-16 15:22:13 +00:00 committed by GitHub
parent e81fe940c9
commit 3893a92d95
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
21 changed files with 796 additions and 492 deletions

View file

@ -100,6 +100,7 @@ typedef struct {
typedef struct { typedef struct {
_Py_BackoffCounter counter; _Py_BackoffCounter counter;
uint16_t external_cache[4];
} _PyBinaryOpCache; } _PyBinaryOpCache;
#define INLINE_CACHE_ENTRIES_BINARY_OP CACHE_ENTRIES(_PyBinaryOpCache) #define INLINE_CACHE_ENTRIES_BINARY_OP CACHE_ENTRIES(_PyBinaryOpCache)
@ -438,7 +439,7 @@ write_u64(uint16_t *p, uint64_t val)
} }
static inline void static inline void
write_obj(uint16_t *p, PyObject *val) write_ptr(uint16_t *p, void *val)
{ {
memcpy(p, &val, sizeof(val)); memcpy(p, &val, sizeof(val));
} }
@ -576,6 +577,16 @@ adaptive_counter_backoff(_Py_BackoffCounter counter) {
return restart_backoff_counter(counter); return restart_backoff_counter(counter);
} }
/* Specialization Extensions */
/* callbacks for an external specialization */
typedef int (*binaryopguardfunc)(PyObject *lhs, PyObject *rhs);
typedef PyObject *(*binaryopactionfunc)(PyObject *lhs, PyObject *rhs);
typedef struct {
binaryopguardfunc guard;
binaryopactionfunc action;
} _PyBinaryOpSpecializationDescr;
/* Comparison bit masks. */ /* Comparison bit masks. */

View file

@ -266,6 +266,7 @@ Known values:
Python 3.14a4 3611 (Add NOT_TAKEN instruction) Python 3.14a4 3611 (Add NOT_TAKEN instruction)
Python 3.14a4 3612 (Add POP_ITER and INSTRUMENTED_POP_ITER) Python 3.14a4 3612 (Add POP_ITER and INSTRUMENTED_POP_ITER)
Python 3.14a4 3613 (Add LOAD_CONST_MORTAL instruction) Python 3.14a4 3613 (Add LOAD_CONST_MORTAL instruction)
Python 3.14a5 3614 (Add BINARY_OP_EXTEND)
Python 3.15 will start with 3650 Python 3.15 will start with 3650
@ -278,7 +279,7 @@ PC/launcher.c must also be updated.
*/ */
#define PYC_MAGIC_NUMBER 3613 #define PYC_MAGIC_NUMBER 3614
/* This is equivalent to converting PYC_MAGIC_NUMBER to 2 bytes /* This is equivalent to converting PYC_MAGIC_NUMBER to 2 bytes
(little-endian) and then appending b'\r\n'. */ (little-endian) and then appending b'\r\n'. */
#define PYC_MAGIC_NUMBER_TOKEN \ #define PYC_MAGIC_NUMBER_TOKEN \

View file

@ -43,6 +43,8 @@ int _PyOpcode_num_popped(int opcode, int oparg) {
return 2; return 2;
case BINARY_OP_ADD_UNICODE: case BINARY_OP_ADD_UNICODE:
return 2; return 2;
case BINARY_OP_EXTEND:
return 2;
case BINARY_OP_INPLACE_ADD_UNICODE: case BINARY_OP_INPLACE_ADD_UNICODE:
return 2; return 2;
case BINARY_OP_MULTIPLY_FLOAT: case BINARY_OP_MULTIPLY_FLOAT:
@ -512,6 +514,8 @@ int _PyOpcode_num_pushed(int opcode, int oparg) {
return 1; return 1;
case BINARY_OP_ADD_UNICODE: case BINARY_OP_ADD_UNICODE:
return 1; return 1;
case BINARY_OP_EXTEND:
return 1;
case BINARY_OP_INPLACE_ADD_UNICODE: case BINARY_OP_INPLACE_ADD_UNICODE:
return 0; return 0;
case BINARY_OP_MULTIPLY_FLOAT: case BINARY_OP_MULTIPLY_FLOAT:
@ -989,6 +993,10 @@ int _PyOpcode_max_stack_effect(int opcode, int oparg, int *effect) {
*effect = 0; *effect = 0;
return 0; return 0;
} }
case BINARY_OP_EXTEND: {
*effect = 0;
return 0;
}
case BINARY_OP_INPLACE_ADD_UNICODE: { case BINARY_OP_INPLACE_ADD_UNICODE: {
*effect = 0; *effect = 0;
return 0; return 0;
@ -1919,11 +1927,13 @@ enum InstructionFormat {
INSTR_FMT_IBC = 2, INSTR_FMT_IBC = 2,
INSTR_FMT_IBC00 = 3, INSTR_FMT_IBC00 = 3,
INSTR_FMT_IBC000 = 4, INSTR_FMT_IBC000 = 4,
INSTR_FMT_IBC00000000 = 5, INSTR_FMT_IBC0000 = 5,
INSTR_FMT_IX = 6, INSTR_FMT_IBC00000000 = 6,
INSTR_FMT_IXC = 7, INSTR_FMT_IX = 7,
INSTR_FMT_IXC00 = 8, INSTR_FMT_IXC = 8,
INSTR_FMT_IXC000 = 9, INSTR_FMT_IXC00 = 9,
INSTR_FMT_IXC000 = 10,
INSTR_FMT_IXC0000 = 11,
}; };
#define IS_VALID_OPCODE(OP) \ #define IS_VALID_OPCODE(OP) \
@ -1981,15 +1991,16 @@ struct opcode_metadata {
extern const struct opcode_metadata _PyOpcode_opcode_metadata[266]; extern const struct opcode_metadata _PyOpcode_opcode_metadata[266];
#ifdef NEED_OPCODE_METADATA #ifdef NEED_OPCODE_METADATA
const struct opcode_metadata _PyOpcode_opcode_metadata[266] = { const struct opcode_metadata _PyOpcode_opcode_metadata[266] = {
[BINARY_OP] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, [BINARY_OP] = { true, INSTR_FMT_IBC0000, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[BINARY_OP_ADD_FLOAT] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG | HAS_ERROR_FLAG }, [BINARY_OP_ADD_FLOAT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
[BINARY_OP_ADD_INT] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG | HAS_ERROR_FLAG }, [BINARY_OP_ADD_INT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
[BINARY_OP_ADD_UNICODE] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG | HAS_ERROR_FLAG }, [BINARY_OP_ADD_UNICODE] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
[BINARY_OP_INPLACE_ADD_UNICODE] = { true, INSTR_FMT_IXC, HAS_LOCAL_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG }, [BINARY_OP_EXTEND] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ESCAPES_FLAG },
[BINARY_OP_MULTIPLY_FLOAT] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG | HAS_ERROR_FLAG }, [BINARY_OP_INPLACE_ADD_UNICODE] = { true, INSTR_FMT_IXC0000, HAS_LOCAL_FLAG | HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ERROR_FLAG },
[BINARY_OP_MULTIPLY_INT] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG | HAS_ERROR_FLAG }, [BINARY_OP_MULTIPLY_FLOAT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
[BINARY_OP_SUBTRACT_FLOAT] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG | HAS_ERROR_FLAG }, [BINARY_OP_MULTIPLY_INT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
[BINARY_OP_SUBTRACT_INT] = { true, INSTR_FMT_IXC, HAS_EXIT_FLAG | HAS_ERROR_FLAG }, [BINARY_OP_SUBTRACT_FLOAT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
[BINARY_OP_SUBTRACT_INT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG },
[BINARY_SLICE] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, [BINARY_SLICE] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[BINARY_SUBSCR] = { true, INSTR_FMT_IXC, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, [BINARY_SUBSCR] = { true, INSTR_FMT_IXC, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
[BINARY_SUBSCR_DICT] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, [BINARY_SUBSCR_DICT] = { true, INSTR_FMT_IXC, HAS_DEOPT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG },
@ -2227,6 +2238,7 @@ _PyOpcode_macro_expansion[256] = {
[BINARY_OP_ADD_FLOAT] = { .nuops = 2, .uops = { { _GUARD_BOTH_FLOAT, 0, 0 }, { _BINARY_OP_ADD_FLOAT, 0, 0 } } }, [BINARY_OP_ADD_FLOAT] = { .nuops = 2, .uops = { { _GUARD_BOTH_FLOAT, 0, 0 }, { _BINARY_OP_ADD_FLOAT, 0, 0 } } },
[BINARY_OP_ADD_INT] = { .nuops = 2, .uops = { { _GUARD_BOTH_INT, 0, 0 }, { _BINARY_OP_ADD_INT, 0, 0 } } }, [BINARY_OP_ADD_INT] = { .nuops = 2, .uops = { { _GUARD_BOTH_INT, 0, 0 }, { _BINARY_OP_ADD_INT, 0, 0 } } },
[BINARY_OP_ADD_UNICODE] = { .nuops = 2, .uops = { { _GUARD_BOTH_UNICODE, 0, 0 }, { _BINARY_OP_ADD_UNICODE, 0, 0 } } }, [BINARY_OP_ADD_UNICODE] = { .nuops = 2, .uops = { { _GUARD_BOTH_UNICODE, 0, 0 }, { _BINARY_OP_ADD_UNICODE, 0, 0 } } },
[BINARY_OP_EXTEND] = { .nuops = 2, .uops = { { _GUARD_BINARY_OP_EXTEND, 4, 1 }, { _BINARY_OP_EXTEND, 4, 1 } } },
[BINARY_OP_INPLACE_ADD_UNICODE] = { .nuops = 2, .uops = { { _GUARD_BOTH_UNICODE, 0, 0 }, { _BINARY_OP_INPLACE_ADD_UNICODE, 0, 0 } } }, [BINARY_OP_INPLACE_ADD_UNICODE] = { .nuops = 2, .uops = { { _GUARD_BOTH_UNICODE, 0, 0 }, { _BINARY_OP_INPLACE_ADD_UNICODE, 0, 0 } } },
[BINARY_OP_MULTIPLY_FLOAT] = { .nuops = 2, .uops = { { _GUARD_BOTH_FLOAT, 0, 0 }, { _BINARY_OP_MULTIPLY_FLOAT, 0, 0 } } }, [BINARY_OP_MULTIPLY_FLOAT] = { .nuops = 2, .uops = { { _GUARD_BOTH_FLOAT, 0, 0 }, { _BINARY_OP_MULTIPLY_FLOAT, 0, 0 } } },
[BINARY_OP_MULTIPLY_INT] = { .nuops = 2, .uops = { { _GUARD_BOTH_INT, 0, 0 }, { _BINARY_OP_MULTIPLY_INT, 0, 0 } } }, [BINARY_OP_MULTIPLY_INT] = { .nuops = 2, .uops = { { _GUARD_BOTH_INT, 0, 0 }, { _BINARY_OP_MULTIPLY_INT, 0, 0 } } },
@ -2411,6 +2423,7 @@ const char *_PyOpcode_OpName[266] = {
[BINARY_OP_ADD_FLOAT] = "BINARY_OP_ADD_FLOAT", [BINARY_OP_ADD_FLOAT] = "BINARY_OP_ADD_FLOAT",
[BINARY_OP_ADD_INT] = "BINARY_OP_ADD_INT", [BINARY_OP_ADD_INT] = "BINARY_OP_ADD_INT",
[BINARY_OP_ADD_UNICODE] = "BINARY_OP_ADD_UNICODE", [BINARY_OP_ADD_UNICODE] = "BINARY_OP_ADD_UNICODE",
[BINARY_OP_EXTEND] = "BINARY_OP_EXTEND",
[BINARY_OP_INPLACE_ADD_UNICODE] = "BINARY_OP_INPLACE_ADD_UNICODE", [BINARY_OP_INPLACE_ADD_UNICODE] = "BINARY_OP_INPLACE_ADD_UNICODE",
[BINARY_OP_MULTIPLY_FLOAT] = "BINARY_OP_MULTIPLY_FLOAT", [BINARY_OP_MULTIPLY_FLOAT] = "BINARY_OP_MULTIPLY_FLOAT",
[BINARY_OP_MULTIPLY_INT] = "BINARY_OP_MULTIPLY_INT", [BINARY_OP_MULTIPLY_INT] = "BINARY_OP_MULTIPLY_INT",
@ -2661,7 +2674,7 @@ const uint8_t _PyOpcode_Caches[256] = {
[FOR_ITER] = 1, [FOR_ITER] = 1,
[CALL] = 3, [CALL] = 3,
[CALL_KW] = 3, [CALL_KW] = 3,
[BINARY_OP] = 1, [BINARY_OP] = 5,
}; };
#endif #endif
@ -2672,6 +2685,7 @@ const uint8_t _PyOpcode_Deopt[256] = {
[BINARY_OP_ADD_FLOAT] = BINARY_OP, [BINARY_OP_ADD_FLOAT] = BINARY_OP,
[BINARY_OP_ADD_INT] = BINARY_OP, [BINARY_OP_ADD_INT] = BINARY_OP,
[BINARY_OP_ADD_UNICODE] = BINARY_OP, [BINARY_OP_ADD_UNICODE] = BINARY_OP,
[BINARY_OP_EXTEND] = BINARY_OP,
[BINARY_OP_INPLACE_ADD_UNICODE] = BINARY_OP, [BINARY_OP_INPLACE_ADD_UNICODE] = BINARY_OP,
[BINARY_OP_MULTIPLY_FLOAT] = BINARY_OP, [BINARY_OP_MULTIPLY_FLOAT] = BINARY_OP,
[BINARY_OP_MULTIPLY_INT] = BINARY_OP, [BINARY_OP_MULTIPLY_INT] = BINARY_OP,
@ -2923,7 +2937,6 @@ const uint8_t _PyOpcode_Deopt[256] = {
case 146: \ case 146: \
case 147: \ case 147: \
case 148: \ case 148: \
case 229: \
case 230: \ case 230: \
case 231: \ case 231: \
case 232: \ case 232: \

View file

@ -15,16 +15,17 @@ extern "C" {
#define _BINARY_OP_ADD_FLOAT 303 #define _BINARY_OP_ADD_FLOAT 303
#define _BINARY_OP_ADD_INT 304 #define _BINARY_OP_ADD_INT 304
#define _BINARY_OP_ADD_UNICODE 305 #define _BINARY_OP_ADD_UNICODE 305
#define _BINARY_OP_INPLACE_ADD_UNICODE 306 #define _BINARY_OP_EXTEND 306
#define _BINARY_OP_MULTIPLY_FLOAT 307 #define _BINARY_OP_INPLACE_ADD_UNICODE 307
#define _BINARY_OP_MULTIPLY_INT 308 #define _BINARY_OP_MULTIPLY_FLOAT 308
#define _BINARY_OP_SUBTRACT_FLOAT 309 #define _BINARY_OP_MULTIPLY_INT 309
#define _BINARY_OP_SUBTRACT_INT 310 #define _BINARY_OP_SUBTRACT_FLOAT 310
#define _BINARY_SLICE 311 #define _BINARY_OP_SUBTRACT_INT 311
#define _BINARY_SUBSCR 312 #define _BINARY_SLICE 312
#define _BINARY_SUBSCR_CHECK_FUNC 313 #define _BINARY_SUBSCR 313
#define _BINARY_SUBSCR_CHECK_FUNC 314
#define _BINARY_SUBSCR_DICT BINARY_SUBSCR_DICT #define _BINARY_SUBSCR_DICT BINARY_SUBSCR_DICT
#define _BINARY_SUBSCR_INIT_CALL 314 #define _BINARY_SUBSCR_INIT_CALL 315
#define _BINARY_SUBSCR_LIST_INT BINARY_SUBSCR_LIST_INT #define _BINARY_SUBSCR_LIST_INT BINARY_SUBSCR_LIST_INT
#define _BINARY_SUBSCR_STR_INT BINARY_SUBSCR_STR_INT #define _BINARY_SUBSCR_STR_INT BINARY_SUBSCR_STR_INT
#define _BINARY_SUBSCR_TUPLE_INT BINARY_SUBSCR_TUPLE_INT #define _BINARY_SUBSCR_TUPLE_INT BINARY_SUBSCR_TUPLE_INT
@ -34,122 +35,123 @@ extern "C" {
#define _BUILD_SLICE BUILD_SLICE #define _BUILD_SLICE BUILD_SLICE
#define _BUILD_STRING BUILD_STRING #define _BUILD_STRING BUILD_STRING
#define _BUILD_TUPLE BUILD_TUPLE #define _BUILD_TUPLE BUILD_TUPLE
#define _CALL_BUILTIN_CLASS 315 #define _CALL_BUILTIN_CLASS 316
#define _CALL_BUILTIN_FAST 316 #define _CALL_BUILTIN_FAST 317
#define _CALL_BUILTIN_FAST_WITH_KEYWORDS 317 #define _CALL_BUILTIN_FAST_WITH_KEYWORDS 318
#define _CALL_BUILTIN_O 318 #define _CALL_BUILTIN_O 319
#define _CALL_INTRINSIC_1 CALL_INTRINSIC_1 #define _CALL_INTRINSIC_1 CALL_INTRINSIC_1
#define _CALL_INTRINSIC_2 CALL_INTRINSIC_2 #define _CALL_INTRINSIC_2 CALL_INTRINSIC_2
#define _CALL_ISINSTANCE CALL_ISINSTANCE #define _CALL_ISINSTANCE CALL_ISINSTANCE
#define _CALL_KW_NON_PY 319 #define _CALL_KW_NON_PY 320
#define _CALL_LEN CALL_LEN #define _CALL_LEN CALL_LEN
#define _CALL_LIST_APPEND CALL_LIST_APPEND #define _CALL_LIST_APPEND CALL_LIST_APPEND
#define _CALL_METHOD_DESCRIPTOR_FAST 320 #define _CALL_METHOD_DESCRIPTOR_FAST 321
#define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 321 #define _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 322
#define _CALL_METHOD_DESCRIPTOR_NOARGS 322 #define _CALL_METHOD_DESCRIPTOR_NOARGS 323
#define _CALL_METHOD_DESCRIPTOR_O 323 #define _CALL_METHOD_DESCRIPTOR_O 324
#define _CALL_NON_PY_GENERAL 324 #define _CALL_NON_PY_GENERAL 325
#define _CALL_STR_1 325 #define _CALL_STR_1 326
#define _CALL_TUPLE_1 326 #define _CALL_TUPLE_1 327
#define _CALL_TYPE_1 CALL_TYPE_1 #define _CALL_TYPE_1 CALL_TYPE_1
#define _CHECK_AND_ALLOCATE_OBJECT 327 #define _CHECK_AND_ALLOCATE_OBJECT 328
#define _CHECK_ATTR_CLASS 328 #define _CHECK_ATTR_CLASS 329
#define _CHECK_ATTR_METHOD_LAZY_DICT 329 #define _CHECK_ATTR_METHOD_LAZY_DICT 330
#define _CHECK_ATTR_MODULE_PUSH_KEYS 330 #define _CHECK_ATTR_MODULE_PUSH_KEYS 331
#define _CHECK_ATTR_WITH_HINT 331 #define _CHECK_ATTR_WITH_HINT 332
#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS 332 #define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS 333
#define _CHECK_EG_MATCH CHECK_EG_MATCH #define _CHECK_EG_MATCH CHECK_EG_MATCH
#define _CHECK_EXC_MATCH CHECK_EXC_MATCH #define _CHECK_EXC_MATCH CHECK_EXC_MATCH
#define _CHECK_FUNCTION 333 #define _CHECK_FUNCTION 334
#define _CHECK_FUNCTION_EXACT_ARGS 334 #define _CHECK_FUNCTION_EXACT_ARGS 335
#define _CHECK_FUNCTION_VERSION 335 #define _CHECK_FUNCTION_VERSION 336
#define _CHECK_FUNCTION_VERSION_INLINE 336 #define _CHECK_FUNCTION_VERSION_INLINE 337
#define _CHECK_FUNCTION_VERSION_KW 337 #define _CHECK_FUNCTION_VERSION_KW 338
#define _CHECK_IS_NOT_PY_CALLABLE 338 #define _CHECK_IS_NOT_PY_CALLABLE 339
#define _CHECK_IS_NOT_PY_CALLABLE_KW 339 #define _CHECK_IS_NOT_PY_CALLABLE_KW 340
#define _CHECK_MANAGED_OBJECT_HAS_VALUES 340 #define _CHECK_MANAGED_OBJECT_HAS_VALUES 341
#define _CHECK_METHOD_VERSION 341 #define _CHECK_METHOD_VERSION 342
#define _CHECK_METHOD_VERSION_KW 342 #define _CHECK_METHOD_VERSION_KW 343
#define _CHECK_PEP_523 343 #define _CHECK_PEP_523 344
#define _CHECK_PERIODIC 344 #define _CHECK_PERIODIC 345
#define _CHECK_PERIODIC_IF_NOT_YIELD_FROM 345 #define _CHECK_PERIODIC_IF_NOT_YIELD_FROM 346
#define _CHECK_STACK_SPACE 346 #define _CHECK_STACK_SPACE 347
#define _CHECK_STACK_SPACE_OPERAND 347 #define _CHECK_STACK_SPACE_OPERAND 348
#define _CHECK_VALIDITY 348 #define _CHECK_VALIDITY 349
#define _CHECK_VALIDITY_AND_SET_IP 349 #define _CHECK_VALIDITY_AND_SET_IP 350
#define _COMPARE_OP 350 #define _COMPARE_OP 351
#define _COMPARE_OP_FLOAT 351 #define _COMPARE_OP_FLOAT 352
#define _COMPARE_OP_INT 352 #define _COMPARE_OP_INT 353
#define _COMPARE_OP_STR 353 #define _COMPARE_OP_STR 354
#define _CONTAINS_OP 354 #define _CONTAINS_OP 355
#define _CONTAINS_OP_DICT CONTAINS_OP_DICT #define _CONTAINS_OP_DICT CONTAINS_OP_DICT
#define _CONTAINS_OP_SET CONTAINS_OP_SET #define _CONTAINS_OP_SET CONTAINS_OP_SET
#define _CONVERT_VALUE CONVERT_VALUE #define _CONVERT_VALUE CONVERT_VALUE
#define _COPY COPY #define _COPY COPY
#define _COPY_FREE_VARS COPY_FREE_VARS #define _COPY_FREE_VARS COPY_FREE_VARS
#define _CREATE_INIT_FRAME 355 #define _CREATE_INIT_FRAME 356
#define _DELETE_ATTR DELETE_ATTR #define _DELETE_ATTR DELETE_ATTR
#define _DELETE_DEREF DELETE_DEREF #define _DELETE_DEREF DELETE_DEREF
#define _DELETE_FAST DELETE_FAST #define _DELETE_FAST DELETE_FAST
#define _DELETE_GLOBAL DELETE_GLOBAL #define _DELETE_GLOBAL DELETE_GLOBAL
#define _DELETE_NAME DELETE_NAME #define _DELETE_NAME DELETE_NAME
#define _DELETE_SUBSCR DELETE_SUBSCR #define _DELETE_SUBSCR DELETE_SUBSCR
#define _DEOPT 356 #define _DEOPT 357
#define _DICT_MERGE DICT_MERGE #define _DICT_MERGE DICT_MERGE
#define _DICT_UPDATE DICT_UPDATE #define _DICT_UPDATE DICT_UPDATE
#define _DO_CALL 357 #define _DO_CALL 358
#define _DO_CALL_FUNCTION_EX 358 #define _DO_CALL_FUNCTION_EX 359
#define _DO_CALL_KW 359 #define _DO_CALL_KW 360
#define _DYNAMIC_EXIT 360 #define _DYNAMIC_EXIT 361
#define _END_FOR END_FOR #define _END_FOR END_FOR
#define _END_SEND END_SEND #define _END_SEND END_SEND
#define _ERROR_POP_N 361 #define _ERROR_POP_N 362
#define _EXIT_INIT_CHECK EXIT_INIT_CHECK #define _EXIT_INIT_CHECK EXIT_INIT_CHECK
#define _EXPAND_METHOD 362 #define _EXPAND_METHOD 363
#define _EXPAND_METHOD_KW 363 #define _EXPAND_METHOD_KW 364
#define _FATAL_ERROR 364 #define _FATAL_ERROR 365
#define _FORMAT_SIMPLE FORMAT_SIMPLE #define _FORMAT_SIMPLE FORMAT_SIMPLE
#define _FORMAT_WITH_SPEC FORMAT_WITH_SPEC #define _FORMAT_WITH_SPEC FORMAT_WITH_SPEC
#define _FOR_ITER 365 #define _FOR_ITER 366
#define _FOR_ITER_GEN_FRAME 366 #define _FOR_ITER_GEN_FRAME 367
#define _FOR_ITER_TIER_TWO 367 #define _FOR_ITER_TIER_TWO 368
#define _GET_AITER GET_AITER #define _GET_AITER GET_AITER
#define _GET_ANEXT GET_ANEXT #define _GET_ANEXT GET_ANEXT
#define _GET_AWAITABLE GET_AWAITABLE #define _GET_AWAITABLE GET_AWAITABLE
#define _GET_ITER GET_ITER #define _GET_ITER GET_ITER
#define _GET_LEN GET_LEN #define _GET_LEN GET_LEN
#define _GET_YIELD_FROM_ITER GET_YIELD_FROM_ITER #define _GET_YIELD_FROM_ITER GET_YIELD_FROM_ITER
#define _GUARD_BOTH_FLOAT 368 #define _GUARD_BINARY_OP_EXTEND 369
#define _GUARD_BOTH_INT 369 #define _GUARD_BOTH_FLOAT 370
#define _GUARD_BOTH_UNICODE 370 #define _GUARD_BOTH_INT 371
#define _GUARD_BUILTINS_VERSION_PUSH_KEYS 371 #define _GUARD_BOTH_UNICODE 372
#define _GUARD_DORV_NO_DICT 372 #define _GUARD_BUILTINS_VERSION_PUSH_KEYS 373
#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT 373 #define _GUARD_DORV_NO_DICT 374
#define _GUARD_GLOBALS_VERSION 374 #define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT 375
#define _GUARD_GLOBALS_VERSION_PUSH_KEYS 375 #define _GUARD_GLOBALS_VERSION 376
#define _GUARD_IS_FALSE_POP 376 #define _GUARD_GLOBALS_VERSION_PUSH_KEYS 377
#define _GUARD_IS_NONE_POP 377 #define _GUARD_IS_FALSE_POP 378
#define _GUARD_IS_NOT_NONE_POP 378 #define _GUARD_IS_NONE_POP 379
#define _GUARD_IS_TRUE_POP 379 #define _GUARD_IS_NOT_NONE_POP 380
#define _GUARD_KEYS_VERSION 380 #define _GUARD_IS_TRUE_POP 381
#define _GUARD_NOS_FLOAT 381 #define _GUARD_KEYS_VERSION 382
#define _GUARD_NOS_INT 382 #define _GUARD_NOS_FLOAT 383
#define _GUARD_NOT_EXHAUSTED_LIST 383 #define _GUARD_NOS_INT 384
#define _GUARD_NOT_EXHAUSTED_RANGE 384 #define _GUARD_NOT_EXHAUSTED_LIST 385
#define _GUARD_NOT_EXHAUSTED_TUPLE 385 #define _GUARD_NOT_EXHAUSTED_RANGE 386
#define _GUARD_TOS_FLOAT 386 #define _GUARD_NOT_EXHAUSTED_TUPLE 387
#define _GUARD_TOS_INT 387 #define _GUARD_TOS_FLOAT 388
#define _GUARD_TYPE_VERSION 388 #define _GUARD_TOS_INT 389
#define _GUARD_TYPE_VERSION_AND_LOCK 389 #define _GUARD_TYPE_VERSION 390
#define _GUARD_TYPE_VERSION_AND_LOCK 391
#define _IMPORT_FROM IMPORT_FROM #define _IMPORT_FROM IMPORT_FROM
#define _IMPORT_NAME IMPORT_NAME #define _IMPORT_NAME IMPORT_NAME
#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 390 #define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 392
#define _INIT_CALL_PY_EXACT_ARGS 391 #define _INIT_CALL_PY_EXACT_ARGS 393
#define _INIT_CALL_PY_EXACT_ARGS_0 392 #define _INIT_CALL_PY_EXACT_ARGS_0 394
#define _INIT_CALL_PY_EXACT_ARGS_1 393 #define _INIT_CALL_PY_EXACT_ARGS_1 395
#define _INIT_CALL_PY_EXACT_ARGS_2 394 #define _INIT_CALL_PY_EXACT_ARGS_2 396
#define _INIT_CALL_PY_EXACT_ARGS_3 395 #define _INIT_CALL_PY_EXACT_ARGS_3 397
#define _INIT_CALL_PY_EXACT_ARGS_4 396 #define _INIT_CALL_PY_EXACT_ARGS_4 398
#define _INSTRUMENTED_CALL_FUNCTION_EX INSTRUMENTED_CALL_FUNCTION_EX #define _INSTRUMENTED_CALL_FUNCTION_EX INSTRUMENTED_CALL_FUNCTION_EX
#define _INSTRUMENTED_CALL_KW INSTRUMENTED_CALL_KW #define _INSTRUMENTED_CALL_KW INSTRUMENTED_CALL_KW
#define _INSTRUMENTED_FOR_ITER INSTRUMENTED_FOR_ITER #define _INSTRUMENTED_FOR_ITER INSTRUMENTED_FOR_ITER
@ -162,144 +164,144 @@ extern "C" {
#define _INSTRUMENTED_POP_JUMP_IF_NONE INSTRUMENTED_POP_JUMP_IF_NONE #define _INSTRUMENTED_POP_JUMP_IF_NONE INSTRUMENTED_POP_JUMP_IF_NONE
#define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE INSTRUMENTED_POP_JUMP_IF_NOT_NONE #define _INSTRUMENTED_POP_JUMP_IF_NOT_NONE INSTRUMENTED_POP_JUMP_IF_NOT_NONE
#define _INSTRUMENTED_POP_JUMP_IF_TRUE INSTRUMENTED_POP_JUMP_IF_TRUE #define _INSTRUMENTED_POP_JUMP_IF_TRUE INSTRUMENTED_POP_JUMP_IF_TRUE
#define _INTERNAL_INCREMENT_OPT_COUNTER 397 #define _INTERNAL_INCREMENT_OPT_COUNTER 399
#define _IS_NONE 398 #define _IS_NONE 400
#define _IS_OP IS_OP #define _IS_OP IS_OP
#define _ITER_CHECK_LIST 399 #define _ITER_CHECK_LIST 401
#define _ITER_CHECK_RANGE 400 #define _ITER_CHECK_RANGE 402
#define _ITER_CHECK_TUPLE 401 #define _ITER_CHECK_TUPLE 403
#define _ITER_JUMP_LIST 402 #define _ITER_JUMP_LIST 404
#define _ITER_JUMP_RANGE 403 #define _ITER_JUMP_RANGE 405
#define _ITER_JUMP_TUPLE 404 #define _ITER_JUMP_TUPLE 406
#define _ITER_NEXT_LIST 405 #define _ITER_NEXT_LIST 407
#define _ITER_NEXT_RANGE 406 #define _ITER_NEXT_RANGE 408
#define _ITER_NEXT_TUPLE 407 #define _ITER_NEXT_TUPLE 409
#define _JUMP_TO_TOP 408 #define _JUMP_TO_TOP 410
#define _LIST_APPEND LIST_APPEND #define _LIST_APPEND LIST_APPEND
#define _LIST_EXTEND LIST_EXTEND #define _LIST_EXTEND LIST_EXTEND
#define _LOAD_ATTR 409 #define _LOAD_ATTR 411
#define _LOAD_ATTR_CLASS 410 #define _LOAD_ATTR_CLASS 412
#define _LOAD_ATTR_CLASS_0 411 #define _LOAD_ATTR_CLASS_0 413
#define _LOAD_ATTR_CLASS_1 412 #define _LOAD_ATTR_CLASS_1 414
#define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN #define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN
#define _LOAD_ATTR_INSTANCE_VALUE 413 #define _LOAD_ATTR_INSTANCE_VALUE 415
#define _LOAD_ATTR_INSTANCE_VALUE_0 414 #define _LOAD_ATTR_INSTANCE_VALUE_0 416
#define _LOAD_ATTR_INSTANCE_VALUE_1 415 #define _LOAD_ATTR_INSTANCE_VALUE_1 417
#define _LOAD_ATTR_METHOD_LAZY_DICT 416 #define _LOAD_ATTR_METHOD_LAZY_DICT 418
#define _LOAD_ATTR_METHOD_NO_DICT 417 #define _LOAD_ATTR_METHOD_NO_DICT 419
#define _LOAD_ATTR_METHOD_WITH_VALUES 418 #define _LOAD_ATTR_METHOD_WITH_VALUES 420
#define _LOAD_ATTR_MODULE 419 #define _LOAD_ATTR_MODULE 421
#define _LOAD_ATTR_MODULE_FROM_KEYS 420 #define _LOAD_ATTR_MODULE_FROM_KEYS 422
#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT 421 #define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT 423
#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 422 #define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 424
#define _LOAD_ATTR_PROPERTY_FRAME 423 #define _LOAD_ATTR_PROPERTY_FRAME 425
#define _LOAD_ATTR_SLOT 424 #define _LOAD_ATTR_SLOT 426
#define _LOAD_ATTR_SLOT_0 425 #define _LOAD_ATTR_SLOT_0 427
#define _LOAD_ATTR_SLOT_1 426 #define _LOAD_ATTR_SLOT_1 428
#define _LOAD_ATTR_WITH_HINT 427 #define _LOAD_ATTR_WITH_HINT 429
#define _LOAD_BUILD_CLASS LOAD_BUILD_CLASS #define _LOAD_BUILD_CLASS LOAD_BUILD_CLASS
#define _LOAD_BYTECODE 428 #define _LOAD_BYTECODE 430
#define _LOAD_COMMON_CONSTANT LOAD_COMMON_CONSTANT #define _LOAD_COMMON_CONSTANT LOAD_COMMON_CONSTANT
#define _LOAD_CONST LOAD_CONST #define _LOAD_CONST LOAD_CONST
#define _LOAD_CONST_IMMORTAL LOAD_CONST_IMMORTAL #define _LOAD_CONST_IMMORTAL LOAD_CONST_IMMORTAL
#define _LOAD_CONST_INLINE 429 #define _LOAD_CONST_INLINE 431
#define _LOAD_CONST_INLINE_BORROW 430 #define _LOAD_CONST_INLINE_BORROW 432
#define _LOAD_CONST_INLINE_BORROW_WITH_NULL 431 #define _LOAD_CONST_INLINE_BORROW_WITH_NULL 433
#define _LOAD_CONST_INLINE_WITH_NULL 432 #define _LOAD_CONST_INLINE_WITH_NULL 434
#define _LOAD_CONST_MORTAL LOAD_CONST_MORTAL #define _LOAD_CONST_MORTAL LOAD_CONST_MORTAL
#define _LOAD_DEREF LOAD_DEREF #define _LOAD_DEREF LOAD_DEREF
#define _LOAD_FAST 433 #define _LOAD_FAST 435
#define _LOAD_FAST_0 434 #define _LOAD_FAST_0 436
#define _LOAD_FAST_1 435 #define _LOAD_FAST_1 437
#define _LOAD_FAST_2 436 #define _LOAD_FAST_2 438
#define _LOAD_FAST_3 437 #define _LOAD_FAST_3 439
#define _LOAD_FAST_4 438 #define _LOAD_FAST_4 440
#define _LOAD_FAST_5 439 #define _LOAD_FAST_5 441
#define _LOAD_FAST_6 440 #define _LOAD_FAST_6 442
#define _LOAD_FAST_7 441 #define _LOAD_FAST_7 443
#define _LOAD_FAST_AND_CLEAR LOAD_FAST_AND_CLEAR #define _LOAD_FAST_AND_CLEAR LOAD_FAST_AND_CLEAR
#define _LOAD_FAST_CHECK LOAD_FAST_CHECK #define _LOAD_FAST_CHECK LOAD_FAST_CHECK
#define _LOAD_FAST_LOAD_FAST LOAD_FAST_LOAD_FAST #define _LOAD_FAST_LOAD_FAST LOAD_FAST_LOAD_FAST
#define _LOAD_FROM_DICT_OR_DEREF LOAD_FROM_DICT_OR_DEREF #define _LOAD_FROM_DICT_OR_DEREF LOAD_FROM_DICT_OR_DEREF
#define _LOAD_FROM_DICT_OR_GLOBALS LOAD_FROM_DICT_OR_GLOBALS #define _LOAD_FROM_DICT_OR_GLOBALS LOAD_FROM_DICT_OR_GLOBALS
#define _LOAD_GLOBAL 442 #define _LOAD_GLOBAL 444
#define _LOAD_GLOBAL_BUILTINS 443 #define _LOAD_GLOBAL_BUILTINS 445
#define _LOAD_GLOBAL_BUILTINS_FROM_KEYS 444 #define _LOAD_GLOBAL_BUILTINS_FROM_KEYS 446
#define _LOAD_GLOBAL_MODULE 445 #define _LOAD_GLOBAL_MODULE 447
#define _LOAD_GLOBAL_MODULE_FROM_KEYS 446 #define _LOAD_GLOBAL_MODULE_FROM_KEYS 448
#define _LOAD_LOCALS LOAD_LOCALS #define _LOAD_LOCALS LOAD_LOCALS
#define _LOAD_NAME LOAD_NAME #define _LOAD_NAME LOAD_NAME
#define _LOAD_SMALL_INT 447 #define _LOAD_SMALL_INT 449
#define _LOAD_SMALL_INT_0 448 #define _LOAD_SMALL_INT_0 450
#define _LOAD_SMALL_INT_1 449 #define _LOAD_SMALL_INT_1 451
#define _LOAD_SMALL_INT_2 450 #define _LOAD_SMALL_INT_2 452
#define _LOAD_SMALL_INT_3 451 #define _LOAD_SMALL_INT_3 453
#define _LOAD_SPECIAL LOAD_SPECIAL #define _LOAD_SPECIAL LOAD_SPECIAL
#define _LOAD_SUPER_ATTR_ATTR LOAD_SUPER_ATTR_ATTR #define _LOAD_SUPER_ATTR_ATTR LOAD_SUPER_ATTR_ATTR
#define _LOAD_SUPER_ATTR_METHOD LOAD_SUPER_ATTR_METHOD #define _LOAD_SUPER_ATTR_METHOD LOAD_SUPER_ATTR_METHOD
#define _MAKE_CALLARGS_A_TUPLE 452 #define _MAKE_CALLARGS_A_TUPLE 454
#define _MAKE_CELL MAKE_CELL #define _MAKE_CELL MAKE_CELL
#define _MAKE_FUNCTION MAKE_FUNCTION #define _MAKE_FUNCTION MAKE_FUNCTION
#define _MAKE_WARM 453 #define _MAKE_WARM 455
#define _MAP_ADD MAP_ADD #define _MAP_ADD MAP_ADD
#define _MATCH_CLASS MATCH_CLASS #define _MATCH_CLASS MATCH_CLASS
#define _MATCH_KEYS MATCH_KEYS #define _MATCH_KEYS MATCH_KEYS
#define _MATCH_MAPPING MATCH_MAPPING #define _MATCH_MAPPING MATCH_MAPPING
#define _MATCH_SEQUENCE MATCH_SEQUENCE #define _MATCH_SEQUENCE MATCH_SEQUENCE
#define _MAYBE_EXPAND_METHOD 454 #define _MAYBE_EXPAND_METHOD 456
#define _MAYBE_EXPAND_METHOD_KW 455 #define _MAYBE_EXPAND_METHOD_KW 457
#define _MONITOR_CALL 456 #define _MONITOR_CALL 458
#define _MONITOR_JUMP_BACKWARD 457 #define _MONITOR_JUMP_BACKWARD 459
#define _MONITOR_RESUME 458 #define _MONITOR_RESUME 460
#define _NOP NOP #define _NOP NOP
#define _POP_EXCEPT POP_EXCEPT #define _POP_EXCEPT POP_EXCEPT
#define _POP_JUMP_IF_FALSE 459 #define _POP_JUMP_IF_FALSE 461
#define _POP_JUMP_IF_TRUE 460 #define _POP_JUMP_IF_TRUE 462
#define _POP_TOP POP_TOP #define _POP_TOP POP_TOP
#define _POP_TOP_LOAD_CONST_INLINE_BORROW 461 #define _POP_TOP_LOAD_CONST_INLINE_BORROW 463
#define _PUSH_EXC_INFO PUSH_EXC_INFO #define _PUSH_EXC_INFO PUSH_EXC_INFO
#define _PUSH_FRAME 462 #define _PUSH_FRAME 464
#define _PUSH_NULL PUSH_NULL #define _PUSH_NULL PUSH_NULL
#define _PY_FRAME_GENERAL 463 #define _PY_FRAME_GENERAL 465
#define _PY_FRAME_KW 464 #define _PY_FRAME_KW 466
#define _QUICKEN_RESUME 465 #define _QUICKEN_RESUME 467
#define _REPLACE_WITH_TRUE 466 #define _REPLACE_WITH_TRUE 468
#define _RESUME_CHECK RESUME_CHECK #define _RESUME_CHECK RESUME_CHECK
#define _RETURN_GENERATOR RETURN_GENERATOR #define _RETURN_GENERATOR RETURN_GENERATOR
#define _RETURN_VALUE RETURN_VALUE #define _RETURN_VALUE RETURN_VALUE
#define _SAVE_RETURN_OFFSET 467 #define _SAVE_RETURN_OFFSET 469
#define _SEND 468 #define _SEND 470
#define _SEND_GEN_FRAME 469 #define _SEND_GEN_FRAME 471
#define _SETUP_ANNOTATIONS SETUP_ANNOTATIONS #define _SETUP_ANNOTATIONS SETUP_ANNOTATIONS
#define _SET_ADD SET_ADD #define _SET_ADD SET_ADD
#define _SET_FUNCTION_ATTRIBUTE SET_FUNCTION_ATTRIBUTE #define _SET_FUNCTION_ATTRIBUTE SET_FUNCTION_ATTRIBUTE
#define _SET_UPDATE SET_UPDATE #define _SET_UPDATE SET_UPDATE
#define _START_EXECUTOR 470 #define _START_EXECUTOR 472
#define _STORE_ATTR 471 #define _STORE_ATTR 473
#define _STORE_ATTR_INSTANCE_VALUE 472 #define _STORE_ATTR_INSTANCE_VALUE 474
#define _STORE_ATTR_SLOT 473 #define _STORE_ATTR_SLOT 475
#define _STORE_ATTR_WITH_HINT 474 #define _STORE_ATTR_WITH_HINT 476
#define _STORE_DEREF STORE_DEREF #define _STORE_DEREF STORE_DEREF
#define _STORE_FAST 475 #define _STORE_FAST 477
#define _STORE_FAST_0 476 #define _STORE_FAST_0 478
#define _STORE_FAST_1 477 #define _STORE_FAST_1 479
#define _STORE_FAST_2 478 #define _STORE_FAST_2 480
#define _STORE_FAST_3 479 #define _STORE_FAST_3 481
#define _STORE_FAST_4 480 #define _STORE_FAST_4 482
#define _STORE_FAST_5 481 #define _STORE_FAST_5 483
#define _STORE_FAST_6 482 #define _STORE_FAST_6 484
#define _STORE_FAST_7 483 #define _STORE_FAST_7 485
#define _STORE_FAST_LOAD_FAST STORE_FAST_LOAD_FAST #define _STORE_FAST_LOAD_FAST STORE_FAST_LOAD_FAST
#define _STORE_FAST_STORE_FAST STORE_FAST_STORE_FAST #define _STORE_FAST_STORE_FAST STORE_FAST_STORE_FAST
#define _STORE_GLOBAL STORE_GLOBAL #define _STORE_GLOBAL STORE_GLOBAL
#define _STORE_NAME STORE_NAME #define _STORE_NAME STORE_NAME
#define _STORE_SLICE 484 #define _STORE_SLICE 486
#define _STORE_SUBSCR 485 #define _STORE_SUBSCR 487
#define _STORE_SUBSCR_DICT STORE_SUBSCR_DICT #define _STORE_SUBSCR_DICT STORE_SUBSCR_DICT
#define _STORE_SUBSCR_LIST_INT STORE_SUBSCR_LIST_INT #define _STORE_SUBSCR_LIST_INT STORE_SUBSCR_LIST_INT
#define _SWAP SWAP #define _SWAP SWAP
#define _TIER2_RESUME_CHECK 486 #define _TIER2_RESUME_CHECK 488
#define _TO_BOOL 487 #define _TO_BOOL 489
#define _TO_BOOL_BOOL TO_BOOL_BOOL #define _TO_BOOL_BOOL TO_BOOL_BOOL
#define _TO_BOOL_INT TO_BOOL_INT #define _TO_BOOL_INT TO_BOOL_INT
#define _TO_BOOL_LIST TO_BOOL_LIST #define _TO_BOOL_LIST TO_BOOL_LIST
@ -309,13 +311,13 @@ extern "C" {
#define _UNARY_NEGATIVE UNARY_NEGATIVE #define _UNARY_NEGATIVE UNARY_NEGATIVE
#define _UNARY_NOT UNARY_NOT #define _UNARY_NOT UNARY_NOT
#define _UNPACK_EX UNPACK_EX #define _UNPACK_EX UNPACK_EX
#define _UNPACK_SEQUENCE 488 #define _UNPACK_SEQUENCE 490
#define _UNPACK_SEQUENCE_LIST UNPACK_SEQUENCE_LIST #define _UNPACK_SEQUENCE_LIST UNPACK_SEQUENCE_LIST
#define _UNPACK_SEQUENCE_TUPLE UNPACK_SEQUENCE_TUPLE #define _UNPACK_SEQUENCE_TUPLE UNPACK_SEQUENCE_TUPLE
#define _UNPACK_SEQUENCE_TWO_TUPLE UNPACK_SEQUENCE_TWO_TUPLE #define _UNPACK_SEQUENCE_TWO_TUPLE UNPACK_SEQUENCE_TWO_TUPLE
#define _WITH_EXCEPT_START WITH_EXCEPT_START #define _WITH_EXCEPT_START WITH_EXCEPT_START
#define _YIELD_VALUE YIELD_VALUE #define _YIELD_VALUE YIELD_VALUE
#define MAX_UOP_ID 488 #define MAX_UOP_ID 490
#ifdef __cplusplus #ifdef __cplusplus
} }

View file

@ -82,6 +82,8 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = {
[_GUARD_BOTH_UNICODE] = HAS_EXIT_FLAG, [_GUARD_BOTH_UNICODE] = HAS_EXIT_FLAG,
[_BINARY_OP_ADD_UNICODE] = 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, [_BINARY_OP_INPLACE_ADD_UNICODE] = HAS_LOCAL_FLAG | HAS_DEOPT_FLAG | HAS_ERROR_FLAG,
[_GUARD_BINARY_OP_EXTEND] = HAS_EXIT_FLAG | HAS_ESCAPES_FLAG,
[_BINARY_OP_EXTEND] = HAS_ESCAPES_FLAG | HAS_PURE_FLAG,
[_BINARY_SUBSCR] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, [_BINARY_SUBSCR] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
[_BINARY_SLICE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, [_BINARY_SLICE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
[_STORE_SLICE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, [_STORE_SLICE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG,
@ -309,6 +311,7 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = {
[_BINARY_OP_ADD_FLOAT] = "_BINARY_OP_ADD_FLOAT", [_BINARY_OP_ADD_FLOAT] = "_BINARY_OP_ADD_FLOAT",
[_BINARY_OP_ADD_INT] = "_BINARY_OP_ADD_INT", [_BINARY_OP_ADD_INT] = "_BINARY_OP_ADD_INT",
[_BINARY_OP_ADD_UNICODE] = "_BINARY_OP_ADD_UNICODE", [_BINARY_OP_ADD_UNICODE] = "_BINARY_OP_ADD_UNICODE",
[_BINARY_OP_EXTEND] = "_BINARY_OP_EXTEND",
[_BINARY_OP_INPLACE_ADD_UNICODE] = "_BINARY_OP_INPLACE_ADD_UNICODE", [_BINARY_OP_INPLACE_ADD_UNICODE] = "_BINARY_OP_INPLACE_ADD_UNICODE",
[_BINARY_OP_MULTIPLY_FLOAT] = "_BINARY_OP_MULTIPLY_FLOAT", [_BINARY_OP_MULTIPLY_FLOAT] = "_BINARY_OP_MULTIPLY_FLOAT",
[_BINARY_OP_MULTIPLY_INT] = "_BINARY_OP_MULTIPLY_INT", [_BINARY_OP_MULTIPLY_INT] = "_BINARY_OP_MULTIPLY_INT",
@ -410,6 +413,7 @@ const char *const _PyOpcode_uop_name[MAX_UOP_ID+1] = {
[_GET_ITER] = "_GET_ITER", [_GET_ITER] = "_GET_ITER",
[_GET_LEN] = "_GET_LEN", [_GET_LEN] = "_GET_LEN",
[_GET_YIELD_FROM_ITER] = "_GET_YIELD_FROM_ITER", [_GET_YIELD_FROM_ITER] = "_GET_YIELD_FROM_ITER",
[_GUARD_BINARY_OP_EXTEND] = "_GUARD_BINARY_OP_EXTEND",
[_GUARD_BOTH_FLOAT] = "_GUARD_BOTH_FLOAT", [_GUARD_BOTH_FLOAT] = "_GUARD_BOTH_FLOAT",
[_GUARD_BOTH_INT] = "_GUARD_BOTH_INT", [_GUARD_BOTH_INT] = "_GUARD_BOTH_INT",
[_GUARD_BOTH_UNICODE] = "_GUARD_BOTH_UNICODE", [_GUARD_BOTH_UNICODE] = "_GUARD_BOTH_UNICODE",
@ -711,6 +715,10 @@ int _PyUop_num_popped(int opcode, int oparg)
return 2; return 2;
case _BINARY_OP_INPLACE_ADD_UNICODE: case _BINARY_OP_INPLACE_ADD_UNICODE:
return 2; return 2;
case _GUARD_BINARY_OP_EXTEND:
return 0;
case _BINARY_OP_EXTEND:
return 2;
case _BINARY_SUBSCR: case _BINARY_SUBSCR:
return 2; return 2;
case _BINARY_SLICE: case _BINARY_SLICE:

153
Include/opcode_ids.h generated
View file

@ -132,82 +132,83 @@ extern "C" {
#define BINARY_OP_ADD_FLOAT 150 #define BINARY_OP_ADD_FLOAT 150
#define BINARY_OP_ADD_INT 151 #define BINARY_OP_ADD_INT 151
#define BINARY_OP_ADD_UNICODE 152 #define BINARY_OP_ADD_UNICODE 152
#define BINARY_OP_MULTIPLY_FLOAT 153 #define BINARY_OP_EXTEND 153
#define BINARY_OP_MULTIPLY_INT 154 #define BINARY_OP_MULTIPLY_FLOAT 154
#define BINARY_OP_SUBTRACT_FLOAT 155 #define BINARY_OP_MULTIPLY_INT 155
#define BINARY_OP_SUBTRACT_INT 156 #define BINARY_OP_SUBTRACT_FLOAT 156
#define BINARY_SUBSCR_DICT 157 #define BINARY_OP_SUBTRACT_INT 157
#define BINARY_SUBSCR_GETITEM 158 #define BINARY_SUBSCR_DICT 158
#define BINARY_SUBSCR_LIST_INT 159 #define BINARY_SUBSCR_GETITEM 159
#define BINARY_SUBSCR_STR_INT 160 #define BINARY_SUBSCR_LIST_INT 160
#define BINARY_SUBSCR_TUPLE_INT 161 #define BINARY_SUBSCR_STR_INT 161
#define CALL_ALLOC_AND_ENTER_INIT 162 #define BINARY_SUBSCR_TUPLE_INT 162
#define CALL_BOUND_METHOD_EXACT_ARGS 163 #define CALL_ALLOC_AND_ENTER_INIT 163
#define CALL_BOUND_METHOD_GENERAL 164 #define CALL_BOUND_METHOD_EXACT_ARGS 164
#define CALL_BUILTIN_CLASS 165 #define CALL_BOUND_METHOD_GENERAL 165
#define CALL_BUILTIN_FAST 166 #define CALL_BUILTIN_CLASS 166
#define CALL_BUILTIN_FAST_WITH_KEYWORDS 167 #define CALL_BUILTIN_FAST 167
#define CALL_BUILTIN_O 168 #define CALL_BUILTIN_FAST_WITH_KEYWORDS 168
#define CALL_ISINSTANCE 169 #define CALL_BUILTIN_O 169
#define CALL_KW_BOUND_METHOD 170 #define CALL_ISINSTANCE 170
#define CALL_KW_NON_PY 171 #define CALL_KW_BOUND_METHOD 171
#define CALL_KW_PY 172 #define CALL_KW_NON_PY 172
#define CALL_LEN 173 #define CALL_KW_PY 173
#define CALL_LIST_APPEND 174 #define CALL_LEN 174
#define CALL_METHOD_DESCRIPTOR_FAST 175 #define CALL_LIST_APPEND 175
#define CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 176 #define CALL_METHOD_DESCRIPTOR_FAST 176
#define CALL_METHOD_DESCRIPTOR_NOARGS 177 #define CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS 177
#define CALL_METHOD_DESCRIPTOR_O 178 #define CALL_METHOD_DESCRIPTOR_NOARGS 178
#define CALL_NON_PY_GENERAL 179 #define CALL_METHOD_DESCRIPTOR_O 179
#define CALL_PY_EXACT_ARGS 180 #define CALL_NON_PY_GENERAL 180
#define CALL_PY_GENERAL 181 #define CALL_PY_EXACT_ARGS 181
#define CALL_STR_1 182 #define CALL_PY_GENERAL 182
#define CALL_TUPLE_1 183 #define CALL_STR_1 183
#define CALL_TYPE_1 184 #define CALL_TUPLE_1 184
#define COMPARE_OP_FLOAT 185 #define CALL_TYPE_1 185
#define COMPARE_OP_INT 186 #define COMPARE_OP_FLOAT 186
#define COMPARE_OP_STR 187 #define COMPARE_OP_INT 187
#define CONTAINS_OP_DICT 188 #define COMPARE_OP_STR 188
#define CONTAINS_OP_SET 189 #define CONTAINS_OP_DICT 189
#define FOR_ITER_GEN 190 #define CONTAINS_OP_SET 190
#define FOR_ITER_LIST 191 #define FOR_ITER_GEN 191
#define FOR_ITER_RANGE 192 #define FOR_ITER_LIST 192
#define FOR_ITER_TUPLE 193 #define FOR_ITER_RANGE 193
#define LOAD_ATTR_CLASS 194 #define FOR_ITER_TUPLE 194
#define LOAD_ATTR_CLASS_WITH_METACLASS_CHECK 195 #define LOAD_ATTR_CLASS 195
#define LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN 196 #define LOAD_ATTR_CLASS_WITH_METACLASS_CHECK 196
#define LOAD_ATTR_INSTANCE_VALUE 197 #define LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN 197
#define LOAD_ATTR_METHOD_LAZY_DICT 198 #define LOAD_ATTR_INSTANCE_VALUE 198
#define LOAD_ATTR_METHOD_NO_DICT 199 #define LOAD_ATTR_METHOD_LAZY_DICT 199
#define LOAD_ATTR_METHOD_WITH_VALUES 200 #define LOAD_ATTR_METHOD_NO_DICT 200
#define LOAD_ATTR_MODULE 201 #define LOAD_ATTR_METHOD_WITH_VALUES 201
#define LOAD_ATTR_NONDESCRIPTOR_NO_DICT 202 #define LOAD_ATTR_MODULE 202
#define LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 203 #define LOAD_ATTR_NONDESCRIPTOR_NO_DICT 203
#define LOAD_ATTR_PROPERTY 204 #define LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES 204
#define LOAD_ATTR_SLOT 205 #define LOAD_ATTR_PROPERTY 205
#define LOAD_ATTR_WITH_HINT 206 #define LOAD_ATTR_SLOT 206
#define LOAD_CONST_IMMORTAL 207 #define LOAD_ATTR_WITH_HINT 207
#define LOAD_CONST_MORTAL 208 #define LOAD_CONST_IMMORTAL 208
#define LOAD_GLOBAL_BUILTIN 209 #define LOAD_CONST_MORTAL 209
#define LOAD_GLOBAL_MODULE 210 #define LOAD_GLOBAL_BUILTIN 210
#define LOAD_SUPER_ATTR_ATTR 211 #define LOAD_GLOBAL_MODULE 211
#define LOAD_SUPER_ATTR_METHOD 212 #define LOAD_SUPER_ATTR_ATTR 212
#define RESUME_CHECK 213 #define LOAD_SUPER_ATTR_METHOD 213
#define SEND_GEN 214 #define RESUME_CHECK 214
#define STORE_ATTR_INSTANCE_VALUE 215 #define SEND_GEN 215
#define STORE_ATTR_SLOT 216 #define STORE_ATTR_INSTANCE_VALUE 216
#define STORE_ATTR_WITH_HINT 217 #define STORE_ATTR_SLOT 217
#define STORE_SUBSCR_DICT 218 #define STORE_ATTR_WITH_HINT 218
#define STORE_SUBSCR_LIST_INT 219 #define STORE_SUBSCR_DICT 219
#define TO_BOOL_ALWAYS_TRUE 220 #define STORE_SUBSCR_LIST_INT 220
#define TO_BOOL_BOOL 221 #define TO_BOOL_ALWAYS_TRUE 221
#define TO_BOOL_INT 222 #define TO_BOOL_BOOL 222
#define TO_BOOL_LIST 223 #define TO_BOOL_INT 223
#define TO_BOOL_NONE 224 #define TO_BOOL_LIST 224
#define TO_BOOL_STR 225 #define TO_BOOL_NONE 225
#define UNPACK_SEQUENCE_LIST 226 #define TO_BOOL_STR 226
#define UNPACK_SEQUENCE_TUPLE 227 #define UNPACK_SEQUENCE_LIST 227
#define UNPACK_SEQUENCE_TWO_TUPLE 228 #define UNPACK_SEQUENCE_TUPLE 228
#define UNPACK_SEQUENCE_TWO_TUPLE 229
#define INSTRUMENTED_END_FOR 235 #define INSTRUMENTED_END_FOR 235
#define INSTRUMENTED_POP_ITER 236 #define INSTRUMENTED_POP_ITER 236
#define INSTRUMENTED_END_SEND 237 #define INSTRUMENTED_END_SEND 237

154
Lib/_opcode_metadata.py generated
View file

@ -26,6 +26,7 @@ _specializations = {
"BINARY_OP_ADD_FLOAT", "BINARY_OP_ADD_FLOAT",
"BINARY_OP_SUBTRACT_FLOAT", "BINARY_OP_SUBTRACT_FLOAT",
"BINARY_OP_ADD_UNICODE", "BINARY_OP_ADD_UNICODE",
"BINARY_OP_EXTEND",
"BINARY_OP_INPLACE_ADD_UNICODE", "BINARY_OP_INPLACE_ADD_UNICODE",
], ],
"BINARY_SUBSCR": [ "BINARY_SUBSCR": [
@ -123,83 +124,84 @@ _specialized_opmap = {
'BINARY_OP_ADD_FLOAT': 150, 'BINARY_OP_ADD_FLOAT': 150,
'BINARY_OP_ADD_INT': 151, 'BINARY_OP_ADD_INT': 151,
'BINARY_OP_ADD_UNICODE': 152, 'BINARY_OP_ADD_UNICODE': 152,
'BINARY_OP_EXTEND': 153,
'BINARY_OP_INPLACE_ADD_UNICODE': 3, 'BINARY_OP_INPLACE_ADD_UNICODE': 3,
'BINARY_OP_MULTIPLY_FLOAT': 153, 'BINARY_OP_MULTIPLY_FLOAT': 154,
'BINARY_OP_MULTIPLY_INT': 154, 'BINARY_OP_MULTIPLY_INT': 155,
'BINARY_OP_SUBTRACT_FLOAT': 155, 'BINARY_OP_SUBTRACT_FLOAT': 156,
'BINARY_OP_SUBTRACT_INT': 156, 'BINARY_OP_SUBTRACT_INT': 157,
'BINARY_SUBSCR_DICT': 157, 'BINARY_SUBSCR_DICT': 158,
'BINARY_SUBSCR_GETITEM': 158, 'BINARY_SUBSCR_GETITEM': 159,
'BINARY_SUBSCR_LIST_INT': 159, 'BINARY_SUBSCR_LIST_INT': 160,
'BINARY_SUBSCR_STR_INT': 160, 'BINARY_SUBSCR_STR_INT': 161,
'BINARY_SUBSCR_TUPLE_INT': 161, 'BINARY_SUBSCR_TUPLE_INT': 162,
'CALL_ALLOC_AND_ENTER_INIT': 162, 'CALL_ALLOC_AND_ENTER_INIT': 163,
'CALL_BOUND_METHOD_EXACT_ARGS': 163, 'CALL_BOUND_METHOD_EXACT_ARGS': 164,
'CALL_BOUND_METHOD_GENERAL': 164, 'CALL_BOUND_METHOD_GENERAL': 165,
'CALL_BUILTIN_CLASS': 165, 'CALL_BUILTIN_CLASS': 166,
'CALL_BUILTIN_FAST': 166, 'CALL_BUILTIN_FAST': 167,
'CALL_BUILTIN_FAST_WITH_KEYWORDS': 167, 'CALL_BUILTIN_FAST_WITH_KEYWORDS': 168,
'CALL_BUILTIN_O': 168, 'CALL_BUILTIN_O': 169,
'CALL_ISINSTANCE': 169, 'CALL_ISINSTANCE': 170,
'CALL_KW_BOUND_METHOD': 170, 'CALL_KW_BOUND_METHOD': 171,
'CALL_KW_NON_PY': 171, 'CALL_KW_NON_PY': 172,
'CALL_KW_PY': 172, 'CALL_KW_PY': 173,
'CALL_LEN': 173, 'CALL_LEN': 174,
'CALL_LIST_APPEND': 174, 'CALL_LIST_APPEND': 175,
'CALL_METHOD_DESCRIPTOR_FAST': 175, 'CALL_METHOD_DESCRIPTOR_FAST': 176,
'CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS': 176, 'CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS': 177,
'CALL_METHOD_DESCRIPTOR_NOARGS': 177, 'CALL_METHOD_DESCRIPTOR_NOARGS': 178,
'CALL_METHOD_DESCRIPTOR_O': 178, 'CALL_METHOD_DESCRIPTOR_O': 179,
'CALL_NON_PY_GENERAL': 179, 'CALL_NON_PY_GENERAL': 180,
'CALL_PY_EXACT_ARGS': 180, 'CALL_PY_EXACT_ARGS': 181,
'CALL_PY_GENERAL': 181, 'CALL_PY_GENERAL': 182,
'CALL_STR_1': 182, 'CALL_STR_1': 183,
'CALL_TUPLE_1': 183, 'CALL_TUPLE_1': 184,
'CALL_TYPE_1': 184, 'CALL_TYPE_1': 185,
'COMPARE_OP_FLOAT': 185, 'COMPARE_OP_FLOAT': 186,
'COMPARE_OP_INT': 186, 'COMPARE_OP_INT': 187,
'COMPARE_OP_STR': 187, 'COMPARE_OP_STR': 188,
'CONTAINS_OP_DICT': 188, 'CONTAINS_OP_DICT': 189,
'CONTAINS_OP_SET': 189, 'CONTAINS_OP_SET': 190,
'FOR_ITER_GEN': 190, 'FOR_ITER_GEN': 191,
'FOR_ITER_LIST': 191, 'FOR_ITER_LIST': 192,
'FOR_ITER_RANGE': 192, 'FOR_ITER_RANGE': 193,
'FOR_ITER_TUPLE': 193, 'FOR_ITER_TUPLE': 194,
'LOAD_ATTR_CLASS': 194, 'LOAD_ATTR_CLASS': 195,
'LOAD_ATTR_CLASS_WITH_METACLASS_CHECK': 195, 'LOAD_ATTR_CLASS_WITH_METACLASS_CHECK': 196,
'LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN': 196, 'LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN': 197,
'LOAD_ATTR_INSTANCE_VALUE': 197, 'LOAD_ATTR_INSTANCE_VALUE': 198,
'LOAD_ATTR_METHOD_LAZY_DICT': 198, 'LOAD_ATTR_METHOD_LAZY_DICT': 199,
'LOAD_ATTR_METHOD_NO_DICT': 199, 'LOAD_ATTR_METHOD_NO_DICT': 200,
'LOAD_ATTR_METHOD_WITH_VALUES': 200, 'LOAD_ATTR_METHOD_WITH_VALUES': 201,
'LOAD_ATTR_MODULE': 201, 'LOAD_ATTR_MODULE': 202,
'LOAD_ATTR_NONDESCRIPTOR_NO_DICT': 202, 'LOAD_ATTR_NONDESCRIPTOR_NO_DICT': 203,
'LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES': 203, 'LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES': 204,
'LOAD_ATTR_PROPERTY': 204, 'LOAD_ATTR_PROPERTY': 205,
'LOAD_ATTR_SLOT': 205, 'LOAD_ATTR_SLOT': 206,
'LOAD_ATTR_WITH_HINT': 206, 'LOAD_ATTR_WITH_HINT': 207,
'LOAD_CONST_IMMORTAL': 207, 'LOAD_CONST_IMMORTAL': 208,
'LOAD_CONST_MORTAL': 208, 'LOAD_CONST_MORTAL': 209,
'LOAD_GLOBAL_BUILTIN': 209, 'LOAD_GLOBAL_BUILTIN': 210,
'LOAD_GLOBAL_MODULE': 210, 'LOAD_GLOBAL_MODULE': 211,
'LOAD_SUPER_ATTR_ATTR': 211, 'LOAD_SUPER_ATTR_ATTR': 212,
'LOAD_SUPER_ATTR_METHOD': 212, 'LOAD_SUPER_ATTR_METHOD': 213,
'RESUME_CHECK': 213, 'RESUME_CHECK': 214,
'SEND_GEN': 214, 'SEND_GEN': 215,
'STORE_ATTR_INSTANCE_VALUE': 215, 'STORE_ATTR_INSTANCE_VALUE': 216,
'STORE_ATTR_SLOT': 216, 'STORE_ATTR_SLOT': 217,
'STORE_ATTR_WITH_HINT': 217, 'STORE_ATTR_WITH_HINT': 218,
'STORE_SUBSCR_DICT': 218, 'STORE_SUBSCR_DICT': 219,
'STORE_SUBSCR_LIST_INT': 219, 'STORE_SUBSCR_LIST_INT': 220,
'TO_BOOL_ALWAYS_TRUE': 220, 'TO_BOOL_ALWAYS_TRUE': 221,
'TO_BOOL_BOOL': 221, 'TO_BOOL_BOOL': 222,
'TO_BOOL_INT': 222, 'TO_BOOL_INT': 223,
'TO_BOOL_LIST': 223, 'TO_BOOL_LIST': 224,
'TO_BOOL_NONE': 224, 'TO_BOOL_NONE': 225,
'TO_BOOL_STR': 225, 'TO_BOOL_STR': 226,
'UNPACK_SEQUENCE_LIST': 226, 'UNPACK_SEQUENCE_LIST': 227,
'UNPACK_SEQUENCE_TUPLE': 227, 'UNPACK_SEQUENCE_TUPLE': 228,
'UNPACK_SEQUENCE_TWO_TUPLE': 228, 'UNPACK_SEQUENCE_TWO_TUPLE': 229,
} }
opmap = { opmap = {

View file

@ -52,6 +52,7 @@ _cache_format = {
}, },
"BINARY_OP": { "BINARY_OP": {
"counter": 1, "counter": 1,
"descr": 4,
}, },
"UNPACK_SEQUENCE": { "UNPACK_SEQUENCE": {
"counter": 1, "counter": 1,

View file

@ -429,14 +429,14 @@ class CodeTest(unittest.TestCase):
def foo(): def foo():
pass pass
# assert that opcode 229 is invalid # assert that opcode 135 is invalid
self.assertEqual(opname[229], '<229>') self.assertEqual(opname[135], '<135>')
# change first opcode to 0xeb (=229) # change first opcode to 0x87 (=135)
foo.__code__ = foo.__code__.replace( foo.__code__ = foo.__code__.replace(
co_code=b'\xe5' + foo.__code__.co_code[1:]) co_code=b'\x87' + foo.__code__.co_code[1:])
msg = "unknown opcode 229" msg = "unknown opcode 135"
with self.assertRaisesRegex(SystemError, msg): with self.assertRaisesRegex(SystemError, msg):
foo() foo()

View file

@ -438,7 +438,7 @@ dis_compound_stmt_str = """\
LOAD_SMALL_INT 1 LOAD_SMALL_INT 1
BINARY_OP 13 (+=) BINARY_OP 13 (+=)
STORE_NAME 0 (x) STORE_NAME 0 (x)
JUMP_BACKWARD 8 (to L1) JUMP_BACKWARD 12 (to L1)
""" """
dis_traceback = """\ dis_traceback = """\
@ -843,7 +843,7 @@ Disassembly of <code object <genexpr> at 0x..., file "%s", line %d>:
L1: RESUME 0 L1: RESUME 0
LOAD_FAST 0 (.0) LOAD_FAST 0 (.0)
GET_ITER GET_ITER
L2: FOR_ITER 10 (to L3) L2: FOR_ITER 14 (to L3)
STORE_FAST 1 (z) STORE_FAST 1 (z)
LOAD_DEREF 2 (x) LOAD_DEREF 2 (x)
LOAD_FAST 1 (z) LOAD_FAST 1 (z)
@ -851,7 +851,7 @@ Disassembly of <code object <genexpr> at 0x..., file "%s", line %d>:
YIELD_VALUE 0 YIELD_VALUE 0
RESUME 5 RESUME 5
POP_TOP POP_TOP
JUMP_BACKWARD 12 (to L2) JUMP_BACKWARD 16 (to L2)
L3: END_FOR L3: END_FOR
POP_ITER POP_ITER
LOAD_CONST 0 (None) LOAD_CONST 0 (None)
@ -1807,7 +1807,7 @@ expected_opinfo_jumpy = [
Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=116, start_offset=116, starts_line=False, line_number=10, label=None, positions=None, cache_info=None), Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=116, start_offset=116, starts_line=False, line_number=10, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_FAST_CHECK', opcode=85, arg=0, argval='i', argrepr='i', offset=118, start_offset=118, starts_line=True, line_number=11, label=5, positions=None, cache_info=None), Instruction(opname='LOAD_FAST_CHECK', opcode=85, arg=0, argval='i', argrepr='i', offset=118, start_offset=118, starts_line=True, line_number=11, label=5, positions=None, cache_info=None),
Instruction(opname='TO_BOOL', opcode=39, arg=None, argval=None, argrepr='', offset=120, start_offset=120, starts_line=False, line_number=11, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, b'\x00\x00\x00\x00')]), Instruction(opname='TO_BOOL', opcode=39, arg=None, argval=None, argrepr='', offset=120, start_offset=120, starts_line=False, line_number=11, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, b'\x00\x00\x00\x00')]),
Instruction(opname='POP_JUMP_IF_FALSE', opcode=97, arg=36, argval=204, argrepr='to L8', offset=128, start_offset=128, starts_line=False, line_number=11, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]), Instruction(opname='POP_JUMP_IF_FALSE', opcode=97, arg=40, argval=212, argrepr='to L8', offset=128, start_offset=128, starts_line=False, line_number=11, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
Instruction(opname='NOT_TAKEN', opcode=28, arg=None, argval=None, argrepr='', offset=132, start_offset=132, starts_line=False, line_number=11, label=None, positions=None, cache_info=None), Instruction(opname='NOT_TAKEN', opcode=28, arg=None, argval=None, argrepr='', offset=132, start_offset=132, starts_line=False, line_number=11, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=134, start_offset=134, starts_line=True, line_number=12, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=134, start_offset=134, starts_line=True, line_number=12, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=144, start_offset=144, starts_line=False, line_number=12, label=None, positions=None, cache_info=None), Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=144, start_offset=144, starts_line=False, line_number=12, label=None, positions=None, cache_info=None),
@ -1815,93 +1815,93 @@ expected_opinfo_jumpy = [
Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=154, start_offset=154, starts_line=False, line_number=12, label=None, positions=None, cache_info=None), Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=154, start_offset=154, starts_line=False, line_number=12, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=156, start_offset=156, starts_line=True, line_number=13, label=None, positions=None, cache_info=None), Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=156, start_offset=156, starts_line=True, line_number=13, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=1, argval=1, argrepr='', offset=158, start_offset=158, starts_line=False, line_number=13, label=None, positions=None, cache_info=None), Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=1, argval=1, argrepr='', offset=158, start_offset=158, starts_line=False, line_number=13, label=None, positions=None, cache_info=None),
Instruction(opname='BINARY_OP', opcode=44, arg=23, argval=23, argrepr='-=', offset=160, start_offset=160, starts_line=False, line_number=13, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]), Instruction(opname='BINARY_OP', opcode=44, arg=23, argval=23, argrepr='-=', offset=160, start_offset=160, starts_line=False, line_number=13, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('descr', 4, b'\x00\x00\x00\x00\x00\x00\x00\x00')]),
Instruction(opname='STORE_FAST', opcode=109, arg=0, argval='i', argrepr='i', offset=164, start_offset=164, starts_line=False, line_number=13, label=None, positions=None, cache_info=None), Instruction(opname='STORE_FAST', opcode=109, arg=0, argval='i', argrepr='i', offset=172, start_offset=172, starts_line=False, line_number=13, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=166, start_offset=166, starts_line=True, line_number=14, label=None, positions=None, cache_info=None), Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=174, start_offset=174, starts_line=True, line_number=14, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=6, argval=6, argrepr='', offset=168, start_offset=168, starts_line=False, line_number=14, label=None, positions=None, cache_info=None), Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=6, argval=6, argrepr='', offset=176, start_offset=176, starts_line=False, line_number=14, label=None, positions=None, cache_info=None),
Instruction(opname='COMPARE_OP', opcode=56, arg=148, argval='>', argrepr='bool(>)', offset=170, start_offset=170, starts_line=False, line_number=14, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]), Instruction(opname='COMPARE_OP', opcode=56, arg=148, argval='>', argrepr='bool(>)', offset=178, start_offset=178, starts_line=False, line_number=14, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
Instruction(opname='POP_JUMP_IF_FALSE', opcode=97, arg=3, argval=184, argrepr='to L6', offset=174, start_offset=174, starts_line=False, line_number=14, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]), Instruction(opname='POP_JUMP_IF_FALSE', opcode=97, arg=3, argval=192, argrepr='to L6', offset=182, start_offset=182, starts_line=False, line_number=14, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
Instruction(opname='NOT_TAKEN', opcode=28, arg=None, argval=None, argrepr='', offset=178, start_offset=178, starts_line=False, line_number=14, label=None, positions=None, cache_info=None), Instruction(opname='NOT_TAKEN', opcode=28, arg=None, argval=None, argrepr='', offset=186, start_offset=186, starts_line=False, line_number=14, label=None, positions=None, cache_info=None),
Instruction(opname='JUMP_BACKWARD', opcode=74, arg=33, argval=118, argrepr='to L5', offset=180, start_offset=180, starts_line=True, line_number=15, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]), Instruction(opname='JUMP_BACKWARD', opcode=74, arg=37, argval=118, argrepr='to L5', offset=188, start_offset=188, starts_line=True, line_number=15, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=184, start_offset=184, starts_line=True, line_number=16, label=6, positions=None, cache_info=None), Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=192, start_offset=192, starts_line=True, line_number=16, label=6, positions=None, cache_info=None),
Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=4, argval=4, argrepr='', offset=186, start_offset=186, starts_line=False, line_number=16, label=None, positions=None, cache_info=None), Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=4, argval=4, argrepr='', offset=194, start_offset=194, starts_line=False, line_number=16, label=None, positions=None, cache_info=None),
Instruction(opname='COMPARE_OP', opcode=56, arg=18, argval='<', argrepr='bool(<)', offset=188, start_offset=188, starts_line=False, line_number=16, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]), Instruction(opname='COMPARE_OP', opcode=56, arg=18, argval='<', argrepr='bool(<)', offset=196, start_offset=196, starts_line=False, line_number=16, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
Instruction(opname='POP_JUMP_IF_TRUE', opcode=100, arg=3, argval=202, argrepr='to L7', offset=192, start_offset=192, starts_line=False, line_number=16, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]), Instruction(opname='POP_JUMP_IF_TRUE', opcode=100, arg=3, argval=210, argrepr='to L7', offset=200, start_offset=200, starts_line=False, line_number=16, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
Instruction(opname='NOT_TAKEN', opcode=28, arg=None, argval=None, argrepr='', offset=196, start_offset=196, starts_line=False, line_number=16, label=None, positions=None, cache_info=None), Instruction(opname='NOT_TAKEN', opcode=28, arg=None, argval=None, argrepr='', offset=204, start_offset=204, starts_line=False, line_number=16, label=None, positions=None, cache_info=None),
Instruction(opname='JUMP_BACKWARD', opcode=74, arg=42, argval=118, argrepr='to L5', offset=198, start_offset=198, starts_line=False, line_number=16, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]), Instruction(opname='JUMP_BACKWARD', opcode=74, arg=46, argval=118, argrepr='to L5', offset=206, start_offset=206, starts_line=False, line_number=16, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
Instruction(opname='JUMP_FORWARD', opcode=76, arg=11, argval=226, argrepr='to L9', offset=202, start_offset=202, starts_line=True, line_number=17, label=7, positions=None, cache_info=None), Instruction(opname='JUMP_FORWARD', opcode=76, arg=11, argval=234, argrepr='to L9', offset=210, start_offset=210, starts_line=True, line_number=17, label=7, positions=None, cache_info=None),
Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=204, start_offset=204, starts_line=True, line_number=19, label=8, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=212, start_offset=212, starts_line=True, line_number=19, label=8, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
Instruction(opname='LOAD_CONST', opcode=81, arg=1, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=214, start_offset=214, starts_line=False, line_number=19, label=None, positions=None, cache_info=None), Instruction(opname='LOAD_CONST', opcode=81, arg=1, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=222, start_offset=222, starts_line=False, line_number=19, label=None, positions=None, cache_info=None),
Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=216, start_offset=216, starts_line=False, line_number=19, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=224, start_offset=224, starts_line=False, line_number=19, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=224, start_offset=224, starts_line=False, line_number=19, label=None, positions=None, cache_info=None), Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=232, start_offset=232, starts_line=False, line_number=19, label=None, positions=None, cache_info=None),
Instruction(opname='NOP', opcode=27, arg=None, argval=None, argrepr='', offset=226, start_offset=226, starts_line=True, line_number=20, label=9, positions=None, cache_info=None), Instruction(opname='NOP', opcode=27, arg=None, argval=None, argrepr='', offset=234, start_offset=234, starts_line=True, line_number=20, label=9, positions=None, cache_info=None),
Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=1, argval=1, argrepr='', offset=228, start_offset=228, starts_line=True, line_number=21, label=None, positions=None, cache_info=None), Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=1, argval=1, argrepr='', offset=236, start_offset=236, starts_line=True, line_number=21, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=0, argval=0, argrepr='', offset=230, start_offset=230, starts_line=False, line_number=21, label=None, positions=None, cache_info=None), Instruction(opname='LOAD_SMALL_INT', opcode=91, arg=0, argval=0, argrepr='', offset=238, start_offset=238, starts_line=False, line_number=21, label=None, positions=None, cache_info=None),
Instruction(opname='BINARY_OP', opcode=44, arg=11, argval=11, argrepr='/', offset=232, start_offset=232, starts_line=False, line_number=21, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]), Instruction(opname='BINARY_OP', opcode=44, arg=11, argval=11, argrepr='/', offset=240, start_offset=240, starts_line=False, line_number=21, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('descr', 4, b'\x00\x00\x00\x00\x00\x00\x00\x00')]),
Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=236, start_offset=236, starts_line=False, line_number=21, label=None, positions=None, cache_info=None), Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=252, start_offset=252, starts_line=False, line_number=21, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=238, start_offset=238, starts_line=True, line_number=25, label=None, positions=None, cache_info=None), Instruction(opname='LOAD_FAST', opcode=83, arg=0, argval='i', argrepr='i', offset=254, start_offset=254, starts_line=True, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='COPY', opcode=59, arg=1, argval=1, argrepr='', offset=240, start_offset=240, starts_line=False, line_number=25, label=None, positions=None, cache_info=None), Instruction(opname='COPY', opcode=59, arg=1, argval=1, argrepr='', offset=256, start_offset=256, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_SPECIAL', opcode=92, arg=1, argval=1, argrepr='__exit__', offset=242, start_offset=242, starts_line=False, line_number=25, label=None, positions=None, cache_info=None), Instruction(opname='LOAD_SPECIAL', opcode=92, arg=1, argval=1, argrepr='__exit__', offset=258, start_offset=258, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='SWAP', opcode=114, arg=2, argval=2, argrepr='', offset=244, start_offset=244, starts_line=False, line_number=25, label=None, positions=None, cache_info=None), Instruction(opname='SWAP', opcode=114, arg=2, argval=2, argrepr='', offset=260, start_offset=260, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='SWAP', opcode=114, arg=3, argval=3, argrepr='', offset=246, start_offset=246, starts_line=False, line_number=25, label=None, positions=None, cache_info=None), Instruction(opname='SWAP', opcode=114, arg=3, argval=3, argrepr='', offset=262, start_offset=262, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_SPECIAL', opcode=92, arg=0, argval=0, argrepr='__enter__', offset=248, start_offset=248, starts_line=False, line_number=25, label=None, positions=None, cache_info=None), Instruction(opname='LOAD_SPECIAL', opcode=92, arg=0, argval=0, argrepr='__enter__', offset=264, start_offset=264, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='CALL', opcode=51, arg=0, argval=0, argrepr='', offset=250, start_offset=250, starts_line=False, line_number=25, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), Instruction(opname='CALL', opcode=51, arg=0, argval=0, argrepr='', offset=266, start_offset=266, starts_line=False, line_number=25, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
Instruction(opname='STORE_FAST', opcode=109, arg=1, argval='dodgy', argrepr='dodgy', offset=258, start_offset=258, starts_line=False, line_number=25, label=None, positions=None, cache_info=None), Instruction(opname='STORE_FAST', opcode=109, arg=1, argval='dodgy', argrepr='dodgy', offset=274, start_offset=274, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=260, start_offset=260, starts_line=True, line_number=26, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=276, start_offset=276, starts_line=True, line_number=26, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
Instruction(opname='LOAD_CONST', opcode=81, arg=2, argval='Never reach this', argrepr="'Never reach this'", offset=270, start_offset=270, starts_line=False, line_number=26, label=None, positions=None, cache_info=None), Instruction(opname='LOAD_CONST', opcode=81, arg=2, argval='Never reach this', argrepr="'Never reach this'", offset=286, start_offset=286, starts_line=False, line_number=26, label=None, positions=None, cache_info=None),
Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=272, start_offset=272, starts_line=False, line_number=26, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=288, start_offset=288, starts_line=False, line_number=26, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=280, start_offset=280, starts_line=False, line_number=26, label=None, positions=None, cache_info=None), Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=296, start_offset=296, starts_line=False, line_number=26, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_CONST', opcode=81, arg=3, argval=None, argrepr='None', offset=282, start_offset=282, starts_line=True, line_number=25, label=None, positions=None, cache_info=None), Instruction(opname='LOAD_CONST', opcode=81, arg=3, argval=None, argrepr='None', offset=298, start_offset=298, starts_line=True, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_CONST', opcode=81, arg=3, argval=None, argrepr='None', offset=284, start_offset=284, starts_line=False, line_number=25, label=None, positions=None, cache_info=None), Instruction(opname='LOAD_CONST', opcode=81, arg=3, argval=None, argrepr='None', offset=300, start_offset=300, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_CONST', opcode=81, arg=3, argval=None, argrepr='None', offset=286, start_offset=286, starts_line=False, line_number=25, label=None, positions=None, cache_info=None), Instruction(opname='LOAD_CONST', opcode=81, arg=3, argval=None, argrepr='None', offset=302, start_offset=302, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='CALL', opcode=51, arg=3, argval=3, argrepr='', offset=288, start_offset=288, starts_line=False, line_number=25, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), Instruction(opname='CALL', opcode=51, arg=3, argval=3, argrepr='', offset=304, start_offset=304, starts_line=False, line_number=25, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=296, start_offset=296, starts_line=False, line_number=25, label=None, positions=None, cache_info=None), Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=312, start_offset=312, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=298, start_offset=298, starts_line=True, line_number=28, label=10, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=314, start_offset=314, starts_line=True, line_number=28, label=10, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
Instruction(opname='LOAD_CONST', opcode=81, arg=5, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=308, start_offset=308, starts_line=False, line_number=28, label=None, positions=None, cache_info=None), Instruction(opname='LOAD_CONST', opcode=81, arg=5, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=324, start_offset=324, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=310, start_offset=310, starts_line=False, line_number=28, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=326, start_offset=326, starts_line=False, line_number=28, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=318, start_offset=318, starts_line=False, line_number=28, label=None, positions=None, cache_info=None), Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=334, start_offset=334, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_CONST', opcode=81, arg=3, argval=None, argrepr='None', offset=320, start_offset=320, starts_line=False, line_number=28, label=None, positions=None, cache_info=None), Instruction(opname='LOAD_CONST', opcode=81, arg=3, argval=None, argrepr='None', offset=336, start_offset=336, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
Instruction(opname='RETURN_VALUE', opcode=35, arg=None, argval=None, argrepr='', offset=322, start_offset=322, starts_line=False, line_number=28, label=None, positions=None, cache_info=None), Instruction(opname='RETURN_VALUE', opcode=35, arg=None, argval=None, argrepr='', offset=338, start_offset=338, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
Instruction(opname='PUSH_EXC_INFO', opcode=32, arg=None, argval=None, argrepr='', offset=324, start_offset=324, starts_line=True, line_number=25, label=None, positions=None, cache_info=None), Instruction(opname='PUSH_EXC_INFO', opcode=32, arg=None, argval=None, argrepr='', offset=340, start_offset=340, starts_line=True, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='WITH_EXCEPT_START', opcode=43, arg=None, argval=None, argrepr='', offset=326, start_offset=326, starts_line=False, line_number=25, label=None, positions=None, cache_info=None), Instruction(opname='WITH_EXCEPT_START', opcode=43, arg=None, argval=None, argrepr='', offset=342, start_offset=342, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='TO_BOOL', opcode=39, arg=None, argval=None, argrepr='', offset=328, start_offset=328, starts_line=False, line_number=25, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, b'\x00\x00\x00\x00')]), Instruction(opname='TO_BOOL', opcode=39, arg=None, argval=None, argrepr='', offset=344, start_offset=344, starts_line=False, line_number=25, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('version', 2, b'\x00\x00\x00\x00')]),
Instruction(opname='POP_JUMP_IF_TRUE', opcode=100, arg=2, argval=344, argrepr='to L11', offset=336, start_offset=336, starts_line=False, line_number=25, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]), Instruction(opname='POP_JUMP_IF_TRUE', opcode=100, arg=2, argval=360, argrepr='to L11', offset=352, start_offset=352, starts_line=False, line_number=25, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
Instruction(opname='NOT_TAKEN', opcode=28, arg=None, argval=None, argrepr='', offset=340, start_offset=340, starts_line=False, line_number=25, label=None, positions=None, cache_info=None), Instruction(opname='NOT_TAKEN', opcode=28, arg=None, argval=None, argrepr='', offset=356, start_offset=356, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='RERAISE', opcode=102, arg=2, argval=2, argrepr='', offset=342, start_offset=342, starts_line=False, line_number=25, label=None, positions=None, cache_info=None), Instruction(opname='RERAISE', opcode=102, arg=2, argval=2, argrepr='', offset=358, start_offset=358, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=344, start_offset=344, starts_line=False, line_number=25, label=11, positions=None, cache_info=None), Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=360, start_offset=360, starts_line=False, line_number=25, label=11, positions=None, cache_info=None),
Instruction(opname='POP_EXCEPT', opcode=29, arg=None, argval=None, argrepr='', offset=346, start_offset=346, starts_line=False, line_number=25, label=None, positions=None, cache_info=None), Instruction(opname='POP_EXCEPT', opcode=29, arg=None, argval=None, argrepr='', offset=362, start_offset=362, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=348, start_offset=348, starts_line=False, line_number=25, label=None, positions=None, cache_info=None), Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=364, start_offset=364, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=350, start_offset=350, starts_line=False, line_number=25, label=None, positions=None, cache_info=None), Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=366, start_offset=366, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=352, start_offset=352, starts_line=False, line_number=25, label=None, positions=None, cache_info=None), Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=368, start_offset=368, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='JUMP_BACKWARD_NO_INTERRUPT', opcode=75, arg=29, argval=298, argrepr='to L10', offset=354, start_offset=354, starts_line=False, line_number=25, label=None, positions=None, cache_info=None), Instruction(opname='JUMP_BACKWARD_NO_INTERRUPT', opcode=75, arg=29, argval=314, argrepr='to L10', offset=370, start_offset=370, starts_line=False, line_number=25, label=None, positions=None, cache_info=None),
Instruction(opname='COPY', opcode=59, arg=3, argval=3, argrepr='', offset=356, start_offset=356, starts_line=True, line_number=None, label=None, positions=None, cache_info=None), Instruction(opname='COPY', opcode=59, arg=3, argval=3, argrepr='', offset=372, start_offset=372, starts_line=True, line_number=None, label=None, positions=None, cache_info=None),
Instruction(opname='POP_EXCEPT', opcode=29, arg=None, argval=None, argrepr='', offset=358, start_offset=358, starts_line=False, line_number=None, label=None, positions=None, cache_info=None), Instruction(opname='POP_EXCEPT', opcode=29, arg=None, argval=None, argrepr='', offset=374, start_offset=374, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
Instruction(opname='RERAISE', opcode=102, arg=1, argval=1, argrepr='', offset=360, start_offset=360, starts_line=False, line_number=None, label=None, positions=None, cache_info=None), Instruction(opname='RERAISE', opcode=102, arg=1, argval=1, argrepr='', offset=376, start_offset=376, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
Instruction(opname='PUSH_EXC_INFO', opcode=32, arg=None, argval=None, argrepr='', offset=362, start_offset=362, starts_line=False, line_number=None, label=None, positions=None, cache_info=None), Instruction(opname='PUSH_EXC_INFO', opcode=32, arg=None, argval=None, argrepr='', offset=378, start_offset=378, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_GLOBAL', opcode=89, arg=4, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=364, start_offset=364, starts_line=True, line_number=22, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), Instruction(opname='LOAD_GLOBAL', opcode=89, arg=4, argval='ZeroDivisionError', argrepr='ZeroDivisionError', offset=380, start_offset=380, starts_line=True, line_number=22, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
Instruction(opname='CHECK_EXC_MATCH', opcode=5, arg=None, argval=None, argrepr='', offset=374, start_offset=374, starts_line=False, line_number=22, label=None, positions=None, cache_info=None), Instruction(opname='CHECK_EXC_MATCH', opcode=5, arg=None, argval=None, argrepr='', offset=390, start_offset=390, starts_line=False, line_number=22, label=None, positions=None, cache_info=None),
Instruction(opname='POP_JUMP_IF_FALSE', opcode=97, arg=15, argval=410, argrepr='to L12', offset=376, start_offset=376, starts_line=False, line_number=22, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]), Instruction(opname='POP_JUMP_IF_FALSE', opcode=97, arg=15, argval=426, argrepr='to L12', offset=392, start_offset=392, starts_line=False, line_number=22, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00')]),
Instruction(opname='NOT_TAKEN', opcode=28, arg=None, argval=None, argrepr='', offset=380, start_offset=380, starts_line=False, line_number=22, label=None, positions=None, cache_info=None), Instruction(opname='NOT_TAKEN', opcode=28, arg=None, argval=None, argrepr='', offset=396, start_offset=396, starts_line=False, line_number=22, label=None, positions=None, cache_info=None),
Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=382, start_offset=382, starts_line=False, line_number=22, label=None, positions=None, cache_info=None), Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=398, start_offset=398, starts_line=False, line_number=22, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=384, start_offset=384, starts_line=True, line_number=23, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=400, start_offset=400, starts_line=True, line_number=23, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
Instruction(opname='LOAD_CONST', opcode=81, arg=4, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=394, start_offset=394, starts_line=False, line_number=23, label=None, positions=None, cache_info=None), Instruction(opname='LOAD_CONST', opcode=81, arg=4, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=410, start_offset=410, starts_line=False, line_number=23, label=None, positions=None, cache_info=None),
Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=396, start_offset=396, starts_line=False, line_number=23, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=412, start_offset=412, starts_line=False, line_number=23, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=404, start_offset=404, starts_line=False, line_number=23, label=None, positions=None, cache_info=None), Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=420, start_offset=420, starts_line=False, line_number=23, label=None, positions=None, cache_info=None),
Instruction(opname='POP_EXCEPT', opcode=29, arg=None, argval=None, argrepr='', offset=406, start_offset=406, starts_line=False, line_number=23, label=None, positions=None, cache_info=None), Instruction(opname='POP_EXCEPT', opcode=29, arg=None, argval=None, argrepr='', offset=422, start_offset=422, starts_line=False, line_number=23, label=None, positions=None, cache_info=None),
Instruction(opname='JUMP_BACKWARD_NO_INTERRUPT', opcode=75, arg=56, argval=298, argrepr='to L10', offset=408, start_offset=408, starts_line=False, line_number=23, label=None, positions=None, cache_info=None), Instruction(opname='JUMP_BACKWARD_NO_INTERRUPT', opcode=75, arg=56, argval=314, argrepr='to L10', offset=424, start_offset=424, starts_line=False, line_number=23, label=None, positions=None, cache_info=None),
Instruction(opname='RERAISE', opcode=102, arg=0, argval=0, argrepr='', offset=410, start_offset=410, starts_line=True, line_number=22, label=12, positions=None, cache_info=None), Instruction(opname='RERAISE', opcode=102, arg=0, argval=0, argrepr='', offset=426, start_offset=426, starts_line=True, line_number=22, label=12, positions=None, cache_info=None),
Instruction(opname='COPY', opcode=59, arg=3, argval=3, argrepr='', offset=412, start_offset=412, starts_line=True, line_number=None, label=None, positions=None, cache_info=None), Instruction(opname='COPY', opcode=59, arg=3, argval=3, argrepr='', offset=428, start_offset=428, starts_line=True, line_number=None, label=None, positions=None, cache_info=None),
Instruction(opname='POP_EXCEPT', opcode=29, arg=None, argval=None, argrepr='', offset=414, start_offset=414, starts_line=False, line_number=None, label=None, positions=None, cache_info=None), Instruction(opname='POP_EXCEPT', opcode=29, arg=None, argval=None, argrepr='', offset=430, start_offset=430, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
Instruction(opname='RERAISE', opcode=102, arg=1, argval=1, argrepr='', offset=416, start_offset=416, starts_line=False, line_number=None, label=None, positions=None, cache_info=None), Instruction(opname='RERAISE', opcode=102, arg=1, argval=1, argrepr='', offset=432, start_offset=432, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
Instruction(opname='PUSH_EXC_INFO', opcode=32, arg=None, argval=None, argrepr='', offset=418, start_offset=418, starts_line=False, line_number=None, label=None, positions=None, cache_info=None), Instruction(opname='PUSH_EXC_INFO', opcode=32, arg=None, argval=None, argrepr='', offset=434, start_offset=434, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=420, start_offset=420, starts_line=True, line_number=28, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]), Instruction(opname='LOAD_GLOBAL', opcode=89, arg=3, argval='print', argrepr='print + NULL', offset=436, start_offset=436, starts_line=True, line_number=28, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('index', 1, b'\x00\x00'), ('module_keys_version', 1, b'\x00\x00'), ('builtin_keys_version', 1, b'\x00\x00')]),
Instruction(opname='LOAD_CONST', opcode=81, arg=5, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=430, start_offset=430, starts_line=False, line_number=28, label=None, positions=None, cache_info=None), Instruction(opname='LOAD_CONST', opcode=81, arg=5, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=446, start_offset=446, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=432, start_offset=432, starts_line=False, line_number=28, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]), Instruction(opname='CALL', opcode=51, arg=1, argval=1, argrepr='', offset=448, start_offset=448, starts_line=False, line_number=28, label=None, positions=None, cache_info=[('counter', 1, b'\x00\x00'), ('func_version', 2, b'\x00\x00\x00\x00')]),
Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=440, start_offset=440, starts_line=False, line_number=28, label=None, positions=None, cache_info=None), Instruction(opname='POP_TOP', opcode=31, arg=None, argval=None, argrepr='', offset=456, start_offset=456, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
Instruction(opname='RERAISE', opcode=102, arg=0, argval=0, argrepr='', offset=442, start_offset=442, starts_line=False, line_number=28, label=None, positions=None, cache_info=None), Instruction(opname='RERAISE', opcode=102, arg=0, argval=0, argrepr='', offset=458, start_offset=458, starts_line=False, line_number=28, label=None, positions=None, cache_info=None),
Instruction(opname='COPY', opcode=59, arg=3, argval=3, argrepr='', offset=444, start_offset=444, starts_line=True, line_number=None, label=None, positions=None, cache_info=None), Instruction(opname='COPY', opcode=59, arg=3, argval=3, argrepr='', offset=460, start_offset=460, starts_line=True, line_number=None, label=None, positions=None, cache_info=None),
Instruction(opname='POP_EXCEPT', opcode=29, arg=None, argval=None, argrepr='', offset=446, start_offset=446, starts_line=False, line_number=None, label=None, positions=None, cache_info=None), Instruction(opname='POP_EXCEPT', opcode=29, arg=None, argval=None, argrepr='', offset=462, start_offset=462, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
Instruction(opname='RERAISE', opcode=102, arg=1, argval=1, argrepr='', offset=448, start_offset=448, starts_line=False, line_number=None, label=None, positions=None, cache_info=None), Instruction(opname='RERAISE', opcode=102, arg=1, argval=1, argrepr='', offset=464, start_offset=464, starts_line=False, line_number=None, label=None, positions=None, cache_info=None),
] ]
# One last piece of inspect fodder to check the default line number handling # One last piece of inspect fodder to check the default line number handling

View file

@ -1649,7 +1649,7 @@ class TestBranchAndJumpEvents(CheckEvents):
return None return None
in_loop = ('branch left', 'foo', 10, 16) in_loop = ('branch left', 'foo', 10, 16)
exit_loop = ('branch right', 'foo', 10, 32) exit_loop = ('branch right', 'foo', 10, 40)
self.check_events(foo, recorders = BRANCH_OFFSET_RECORDERS, expected = [ self.check_events(foo, recorders = BRANCH_OFFSET_RECORDERS, expected = [
in_loop, in_loop,
in_loop, in_loop,

View file

@ -1338,6 +1338,31 @@ class TestSpecializer(TestBase):
self.assert_specialized(binary_op_add_unicode, "BINARY_OP_ADD_UNICODE") self.assert_specialized(binary_op_add_unicode, "BINARY_OP_ADD_UNICODE")
self.assert_no_opcode(binary_op_add_unicode, "BINARY_OP") self.assert_no_opcode(binary_op_add_unicode, "BINARY_OP")
def binary_op_add_extend():
for _ in range(100):
a, b = 6, 3.0
c = a + b
self.assertEqual(c, 9.0)
c = b + a
self.assertEqual(c, 9.0)
c = a - b
self.assertEqual(c, 3.0)
c = b - a
self.assertEqual(c, -3.0)
c = a * b
self.assertEqual(c, 18.0)
c = b * a
self.assertEqual(c, 18.0)
c = a / b
self.assertEqual(c, 2.0)
c = b / a
self.assertEqual(c, 0.5)
binary_op_add_extend()
self.assert_specialized(binary_op_add_extend, "BINARY_OP_EXTEND")
self.assert_no_opcode(binary_op_add_extend, "BINARY_OP")
@cpython_only @cpython_only
@requires_specialization_ft @requires_specialization_ft
def test_load_super_attr(self): def test_load_super_attr(self):

View file

@ -0,0 +1,2 @@
Add opcode ``BINARY_OP_EXTEND`` which executes a pair of functions (guard and
specialization functions) accessed from the inline cache.

View file

@ -522,6 +522,7 @@ dummy_func(
BINARY_OP_SUBTRACT_FLOAT, BINARY_OP_SUBTRACT_FLOAT,
BINARY_OP_ADD_UNICODE, BINARY_OP_ADD_UNICODE,
// BINARY_OP_INPLACE_ADD_UNICODE, // See comments at that opcode. // BINARY_OP_INPLACE_ADD_UNICODE, // See comments at that opcode.
BINARY_OP_EXTEND,
}; };
op(_GUARD_BOTH_INT, (left, right -- left, right)) { op(_GUARD_BOTH_INT, (left, right -- left, right)) {
@ -587,11 +588,11 @@ dummy_func(
} }
macro(BINARY_OP_MULTIPLY_INT) = macro(BINARY_OP_MULTIPLY_INT) =
_GUARD_BOTH_INT + unused/1 + _BINARY_OP_MULTIPLY_INT; _GUARD_BOTH_INT + unused/5 + _BINARY_OP_MULTIPLY_INT;
macro(BINARY_OP_ADD_INT) = macro(BINARY_OP_ADD_INT) =
_GUARD_BOTH_INT + unused/1 + _BINARY_OP_ADD_INT; _GUARD_BOTH_INT + unused/5 + _BINARY_OP_ADD_INT;
macro(BINARY_OP_SUBTRACT_INT) = macro(BINARY_OP_SUBTRACT_INT) =
_GUARD_BOTH_INT + unused/1 + _BINARY_OP_SUBTRACT_INT; _GUARD_BOTH_INT + unused/5 + _BINARY_OP_SUBTRACT_INT;
op(_GUARD_BOTH_FLOAT, (left, right -- left, right)) { op(_GUARD_BOTH_FLOAT, (left, right -- left, right)) {
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
@ -659,11 +660,11 @@ dummy_func(
} }
macro(BINARY_OP_MULTIPLY_FLOAT) = macro(BINARY_OP_MULTIPLY_FLOAT) =
_GUARD_BOTH_FLOAT + unused/1 + _BINARY_OP_MULTIPLY_FLOAT; _GUARD_BOTH_FLOAT + unused/5 + _BINARY_OP_MULTIPLY_FLOAT;
macro(BINARY_OP_ADD_FLOAT) = macro(BINARY_OP_ADD_FLOAT) =
_GUARD_BOTH_FLOAT + unused/1 + _BINARY_OP_ADD_FLOAT; _GUARD_BOTH_FLOAT + unused/5 + _BINARY_OP_ADD_FLOAT;
macro(BINARY_OP_SUBTRACT_FLOAT) = macro(BINARY_OP_SUBTRACT_FLOAT) =
_GUARD_BOTH_FLOAT + unused/1 + _BINARY_OP_SUBTRACT_FLOAT; _GUARD_BOTH_FLOAT + unused/5 + _BINARY_OP_SUBTRACT_FLOAT;
op(_GUARD_BOTH_UNICODE, (left, right -- left, right)) { op(_GUARD_BOTH_UNICODE, (left, right -- left, right)) {
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
@ -689,7 +690,7 @@ dummy_func(
} }
macro(BINARY_OP_ADD_UNICODE) = macro(BINARY_OP_ADD_UNICODE) =
_GUARD_BOTH_UNICODE + unused/1 + _BINARY_OP_ADD_UNICODE; _GUARD_BOTH_UNICODE + unused/5 + _BINARY_OP_ADD_UNICODE;
// This is a subtle one. It's a super-instruction for // This is a subtle one. It's a super-instruction for
// BINARY_OP_ADD_UNICODE followed by STORE_FAST // BINARY_OP_ADD_UNICODE followed by STORE_FAST
@ -741,8 +742,34 @@ dummy_func(
#endif #endif
} }
op(_GUARD_BINARY_OP_EXTEND, (descr/4, left, right -- left, right)) {
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
_PyBinaryOpSpecializationDescr *d = (_PyBinaryOpSpecializationDescr*)descr;
assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5);
assert(d && d->guard);
int res = d->guard(left_o, right_o);
EXIT_IF(!res);
}
pure op(_BINARY_OP_EXTEND, (descr/4, left, right -- res)) {
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5);
_PyBinaryOpSpecializationDescr *d = (_PyBinaryOpSpecializationDescr*)descr;
STAT_INC(BINARY_OP, hit);
PyObject *res_o = d->action(left_o, right_o);
DECREF_INPUTS();
res = PyStackRef_FromPyObjectSteal(res_o);
}
macro(BINARY_OP_EXTEND) =
unused/1 + _GUARD_BINARY_OP_EXTEND + rewind/-4 + _BINARY_OP_EXTEND;
macro(BINARY_OP_INPLACE_ADD_UNICODE) = macro(BINARY_OP_INPLACE_ADD_UNICODE) =
_GUARD_BOTH_UNICODE + unused/1 + _BINARY_OP_INPLACE_ADD_UNICODE; _GUARD_BOTH_UNICODE + unused/5 + _BINARY_OP_INPLACE_ADD_UNICODE;
family(BINARY_SUBSCR, INLINE_CACHE_ENTRIES_BINARY_SUBSCR) = { family(BINARY_SUBSCR, INLINE_CACHE_ENTRIES_BINARY_SUBSCR) = {
BINARY_SUBSCR_DICT, BINARY_SUBSCR_DICT,
@ -4742,7 +4769,7 @@ dummy_func(
res = PyStackRef_FromPyObjectSteal(res_o); res = PyStackRef_FromPyObjectSteal(res_o);
} }
macro(BINARY_OP) = _SPECIALIZE_BINARY_OP + _BINARY_OP; macro(BINARY_OP) = _SPECIALIZE_BINARY_OP + unused/4 + _BINARY_OP;
pure inst(SWAP, (bottom_in, unused[oparg-2], top_in -- pure inst(SWAP, (bottom_in, unused[oparg-2], top_in --
top_out, unused[oparg-2], bottom_out)) { top_out, unused[oparg-2], bottom_out)) {

View file

@ -899,6 +899,51 @@
break; break;
} }
case _GUARD_BINARY_OP_EXTEND: {
_PyStackRef right;
_PyStackRef left;
right = stack_pointer[-1];
left = stack_pointer[-2];
PyObject *descr = (PyObject *)CURRENT_OPERAND0();
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
_PyBinaryOpSpecializationDescr *d = (_PyBinaryOpSpecializationDescr*)descr;
assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5);
assert(d && d->guard);
_PyFrame_SetStackPointer(frame, stack_pointer);
int res = d->guard(left_o, right_o);
stack_pointer = _PyFrame_GetStackPointer(frame);
if (!res) {
UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET();
}
break;
}
case _BINARY_OP_EXTEND: {
_PyStackRef right;
_PyStackRef left;
_PyStackRef res;
right = stack_pointer[-1];
left = stack_pointer[-2];
PyObject *descr = (PyObject *)CURRENT_OPERAND0();
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5);
_PyBinaryOpSpecializationDescr *d = (_PyBinaryOpSpecializationDescr*)descr;
STAT_INC(BINARY_OP, hit);
_PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *res_o = d->action(left_o, right_o);
stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(left);
PyStackRef_CLOSE(right);
res = PyStackRef_FromPyObjectSteal(res_o);
stack_pointer[-2] = res;
stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
break;
}
case _BINARY_SUBSCR: { case _BINARY_SUBSCR: {
_PyStackRef sub; _PyStackRef sub;
_PyStackRef container; _PyStackRef container;

View file

@ -11,10 +11,10 @@
TARGET(BINARY_OP) { TARGET(BINARY_OP) {
frame->instr_ptr = next_instr; frame->instr_ptr = next_instr;
next_instr += 2; next_instr += 6;
INSTRUCTION_STATS(BINARY_OP); INSTRUCTION_STATS(BINARY_OP);
PREDICTED(BINARY_OP); PREDICTED(BINARY_OP);
_Py_CODEUNIT* const this_instr = next_instr - 2; _Py_CODEUNIT* const this_instr = next_instr - 6;
(void)this_instr; (void)this_instr;
_PyStackRef lhs; _PyStackRef lhs;
_PyStackRef rhs; _PyStackRef rhs;
@ -39,6 +39,7 @@
assert(NB_ADD <= oparg); assert(NB_ADD <= oparg);
assert(oparg <= NB_INPLACE_XOR); assert(oparg <= NB_INPLACE_XOR);
} }
/* Skip 4 cache entries */
// _BINARY_OP // _BINARY_OP
{ {
PyObject *lhs_o = PyStackRef_AsPyObjectBorrow(lhs); PyObject *lhs_o = PyStackRef_AsPyObjectBorrow(lhs);
@ -60,9 +61,9 @@
TARGET(BINARY_OP_ADD_FLOAT) { TARGET(BINARY_OP_ADD_FLOAT) {
frame->instr_ptr = next_instr; frame->instr_ptr = next_instr;
next_instr += 2; next_instr += 6;
INSTRUCTION_STATS(BINARY_OP_ADD_FLOAT); INSTRUCTION_STATS(BINARY_OP_ADD_FLOAT);
static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 1, "incorrect cache size"); static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5, "incorrect cache size");
_PyStackRef left; _PyStackRef left;
_PyStackRef right; _PyStackRef right;
_PyStackRef res; _PyStackRef res;
@ -75,7 +76,7 @@
DEOPT_IF(!PyFloat_CheckExact(left_o), BINARY_OP); DEOPT_IF(!PyFloat_CheckExact(left_o), BINARY_OP);
DEOPT_IF(!PyFloat_CheckExact(right_o), BINARY_OP); DEOPT_IF(!PyFloat_CheckExact(right_o), BINARY_OP);
} }
/* Skip 1 cache entry */ /* Skip 5 cache entries */
// _BINARY_OP_ADD_FLOAT // _BINARY_OP_ADD_FLOAT
{ {
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
@ -98,9 +99,9 @@
TARGET(BINARY_OP_ADD_INT) { TARGET(BINARY_OP_ADD_INT) {
frame->instr_ptr = next_instr; frame->instr_ptr = next_instr;
next_instr += 2; next_instr += 6;
INSTRUCTION_STATS(BINARY_OP_ADD_INT); INSTRUCTION_STATS(BINARY_OP_ADD_INT);
static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 1, "incorrect cache size"); static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5, "incorrect cache size");
_PyStackRef left; _PyStackRef left;
_PyStackRef right; _PyStackRef right;
_PyStackRef res; _PyStackRef res;
@ -113,7 +114,7 @@
DEOPT_IF(!PyLong_CheckExact(left_o), BINARY_OP); DEOPT_IF(!PyLong_CheckExact(left_o), BINARY_OP);
DEOPT_IF(!PyLong_CheckExact(right_o), BINARY_OP); DEOPT_IF(!PyLong_CheckExact(right_o), BINARY_OP);
} }
/* Skip 1 cache entry */ /* Skip 5 cache entries */
// _BINARY_OP_ADD_INT // _BINARY_OP_ADD_INT
{ {
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
@ -135,9 +136,9 @@
TARGET(BINARY_OP_ADD_UNICODE) { TARGET(BINARY_OP_ADD_UNICODE) {
frame->instr_ptr = next_instr; frame->instr_ptr = next_instr;
next_instr += 2; next_instr += 6;
INSTRUCTION_STATS(BINARY_OP_ADD_UNICODE); INSTRUCTION_STATS(BINARY_OP_ADD_UNICODE);
static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 1, "incorrect cache size"); static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5, "incorrect cache size");
_PyStackRef left; _PyStackRef left;
_PyStackRef right; _PyStackRef right;
_PyStackRef res; _PyStackRef res;
@ -150,7 +151,7 @@
DEOPT_IF(!PyUnicode_CheckExact(left_o), BINARY_OP); DEOPT_IF(!PyUnicode_CheckExact(left_o), BINARY_OP);
DEOPT_IF(!PyUnicode_CheckExact(right_o), BINARY_OP); DEOPT_IF(!PyUnicode_CheckExact(right_o), BINARY_OP);
} }
/* Skip 1 cache entry */ /* Skip 5 cache entries */
// _BINARY_OP_ADD_UNICODE // _BINARY_OP_ADD_UNICODE
{ {
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
@ -170,11 +171,57 @@
DISPATCH(); DISPATCH();
} }
TARGET(BINARY_OP_EXTEND) {
_Py_CODEUNIT* const this_instr = frame->instr_ptr = next_instr;
next_instr += 6;
INSTRUCTION_STATS(BINARY_OP_EXTEND);
static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5, "incorrect cache size");
_PyStackRef left;
_PyStackRef right;
_PyStackRef res;
/* Skip 1 cache entry */
// _GUARD_BINARY_OP_EXTEND
{
right = stack_pointer[-1];
left = stack_pointer[-2];
PyObject *descr = read_obj(&this_instr[2].cache);
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
_PyBinaryOpSpecializationDescr *d = (_PyBinaryOpSpecializationDescr*)descr;
assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5);
assert(d && d->guard);
_PyFrame_SetStackPointer(frame, stack_pointer);
int res = d->guard(left_o, right_o);
stack_pointer = _PyFrame_GetStackPointer(frame);
DEOPT_IF(!res, BINARY_OP);
}
/* Skip -4 cache entry */
// _BINARY_OP_EXTEND
{
PyObject *descr = read_obj(&this_instr[2].cache);
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
PyObject *right_o = PyStackRef_AsPyObjectBorrow(right);
assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5);
_PyBinaryOpSpecializationDescr *d = (_PyBinaryOpSpecializationDescr*)descr;
STAT_INC(BINARY_OP, hit);
_PyFrame_SetStackPointer(frame, stack_pointer);
PyObject *res_o = d->action(left_o, right_o);
stack_pointer = _PyFrame_GetStackPointer(frame);
PyStackRef_CLOSE(left);
PyStackRef_CLOSE(right);
res = PyStackRef_FromPyObjectSteal(res_o);
}
stack_pointer[-2] = res;
stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
DISPATCH();
}
TARGET(BINARY_OP_INPLACE_ADD_UNICODE) { TARGET(BINARY_OP_INPLACE_ADD_UNICODE) {
frame->instr_ptr = next_instr; frame->instr_ptr = next_instr;
next_instr += 2; next_instr += 6;
INSTRUCTION_STATS(BINARY_OP_INPLACE_ADD_UNICODE); INSTRUCTION_STATS(BINARY_OP_INPLACE_ADD_UNICODE);
static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 1, "incorrect cache size"); static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5, "incorrect cache size");
_PyStackRef left; _PyStackRef left;
_PyStackRef right; _PyStackRef right;
// _GUARD_BOTH_UNICODE // _GUARD_BOTH_UNICODE
@ -186,7 +233,7 @@
DEOPT_IF(!PyUnicode_CheckExact(left_o), BINARY_OP); DEOPT_IF(!PyUnicode_CheckExact(left_o), BINARY_OP);
DEOPT_IF(!PyUnicode_CheckExact(right_o), BINARY_OP); DEOPT_IF(!PyUnicode_CheckExact(right_o), BINARY_OP);
} }
/* Skip 1 cache entry */ /* Skip 5 cache entries */
// _BINARY_OP_INPLACE_ADD_UNICODE // _BINARY_OP_INPLACE_ADD_UNICODE
{ {
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
@ -235,9 +282,9 @@
TARGET(BINARY_OP_MULTIPLY_FLOAT) { TARGET(BINARY_OP_MULTIPLY_FLOAT) {
frame->instr_ptr = next_instr; frame->instr_ptr = next_instr;
next_instr += 2; next_instr += 6;
INSTRUCTION_STATS(BINARY_OP_MULTIPLY_FLOAT); INSTRUCTION_STATS(BINARY_OP_MULTIPLY_FLOAT);
static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 1, "incorrect cache size"); static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5, "incorrect cache size");
_PyStackRef left; _PyStackRef left;
_PyStackRef right; _PyStackRef right;
_PyStackRef res; _PyStackRef res;
@ -250,7 +297,7 @@
DEOPT_IF(!PyFloat_CheckExact(left_o), BINARY_OP); DEOPT_IF(!PyFloat_CheckExact(left_o), BINARY_OP);
DEOPT_IF(!PyFloat_CheckExact(right_o), BINARY_OP); DEOPT_IF(!PyFloat_CheckExact(right_o), BINARY_OP);
} }
/* Skip 1 cache entry */ /* Skip 5 cache entries */
// _BINARY_OP_MULTIPLY_FLOAT // _BINARY_OP_MULTIPLY_FLOAT
{ {
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
@ -273,9 +320,9 @@
TARGET(BINARY_OP_MULTIPLY_INT) { TARGET(BINARY_OP_MULTIPLY_INT) {
frame->instr_ptr = next_instr; frame->instr_ptr = next_instr;
next_instr += 2; next_instr += 6;
INSTRUCTION_STATS(BINARY_OP_MULTIPLY_INT); INSTRUCTION_STATS(BINARY_OP_MULTIPLY_INT);
static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 1, "incorrect cache size"); static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5, "incorrect cache size");
_PyStackRef left; _PyStackRef left;
_PyStackRef right; _PyStackRef right;
_PyStackRef res; _PyStackRef res;
@ -288,7 +335,7 @@
DEOPT_IF(!PyLong_CheckExact(left_o), BINARY_OP); DEOPT_IF(!PyLong_CheckExact(left_o), BINARY_OP);
DEOPT_IF(!PyLong_CheckExact(right_o), BINARY_OP); DEOPT_IF(!PyLong_CheckExact(right_o), BINARY_OP);
} }
/* Skip 1 cache entry */ /* Skip 5 cache entries */
// _BINARY_OP_MULTIPLY_INT // _BINARY_OP_MULTIPLY_INT
{ {
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
@ -310,9 +357,9 @@
TARGET(BINARY_OP_SUBTRACT_FLOAT) { TARGET(BINARY_OP_SUBTRACT_FLOAT) {
frame->instr_ptr = next_instr; frame->instr_ptr = next_instr;
next_instr += 2; next_instr += 6;
INSTRUCTION_STATS(BINARY_OP_SUBTRACT_FLOAT); INSTRUCTION_STATS(BINARY_OP_SUBTRACT_FLOAT);
static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 1, "incorrect cache size"); static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5, "incorrect cache size");
_PyStackRef left; _PyStackRef left;
_PyStackRef right; _PyStackRef right;
_PyStackRef res; _PyStackRef res;
@ -325,7 +372,7 @@
DEOPT_IF(!PyFloat_CheckExact(left_o), BINARY_OP); DEOPT_IF(!PyFloat_CheckExact(left_o), BINARY_OP);
DEOPT_IF(!PyFloat_CheckExact(right_o), BINARY_OP); DEOPT_IF(!PyFloat_CheckExact(right_o), BINARY_OP);
} }
/* Skip 1 cache entry */ /* Skip 5 cache entries */
// _BINARY_OP_SUBTRACT_FLOAT // _BINARY_OP_SUBTRACT_FLOAT
{ {
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);
@ -348,9 +395,9 @@
TARGET(BINARY_OP_SUBTRACT_INT) { TARGET(BINARY_OP_SUBTRACT_INT) {
frame->instr_ptr = next_instr; frame->instr_ptr = next_instr;
next_instr += 2; next_instr += 6;
INSTRUCTION_STATS(BINARY_OP_SUBTRACT_INT); INSTRUCTION_STATS(BINARY_OP_SUBTRACT_INT);
static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 1, "incorrect cache size"); static_assert(INLINE_CACHE_ENTRIES_BINARY_OP == 5, "incorrect cache size");
_PyStackRef left; _PyStackRef left;
_PyStackRef right; _PyStackRef right;
_PyStackRef res; _PyStackRef res;
@ -363,7 +410,7 @@
DEOPT_IF(!PyLong_CheckExact(left_o), BINARY_OP); DEOPT_IF(!PyLong_CheckExact(left_o), BINARY_OP);
DEOPT_IF(!PyLong_CheckExact(right_o), BINARY_OP); DEOPT_IF(!PyLong_CheckExact(right_o), BINARY_OP);
} }
/* Skip 1 cache entry */ /* Skip 5 cache entries */
// _BINARY_OP_SUBTRACT_INT // _BINARY_OP_SUBTRACT_INT
{ {
PyObject *left_o = PyStackRef_AsPyObjectBorrow(left); PyObject *left_o = PyStackRef_AsPyObjectBorrow(left);

View file

@ -152,6 +152,7 @@ static void *opcode_targets[256] = {
&&TARGET_BINARY_OP_ADD_FLOAT, &&TARGET_BINARY_OP_ADD_FLOAT,
&&TARGET_BINARY_OP_ADD_INT, &&TARGET_BINARY_OP_ADD_INT,
&&TARGET_BINARY_OP_ADD_UNICODE, &&TARGET_BINARY_OP_ADD_UNICODE,
&&TARGET_BINARY_OP_EXTEND,
&&TARGET_BINARY_OP_MULTIPLY_FLOAT, &&TARGET_BINARY_OP_MULTIPLY_FLOAT,
&&TARGET_BINARY_OP_MULTIPLY_INT, &&TARGET_BINARY_OP_MULTIPLY_INT,
&&TARGET_BINARY_OP_SUBTRACT_FLOAT, &&TARGET_BINARY_OP_SUBTRACT_FLOAT,
@ -233,7 +234,6 @@ static void *opcode_targets[256] = {
&&_unknown_opcode, &&_unknown_opcode,
&&_unknown_opcode, &&_unknown_opcode,
&&_unknown_opcode, &&_unknown_opcode,
&&_unknown_opcode,
&&TARGET_INSTRUMENTED_END_FOR, &&TARGET_INSTRUMENTED_END_FOR,
&&TARGET_INSTRUMENTED_POP_ITER, &&TARGET_INSTRUMENTED_POP_ITER,
&&TARGET_INSTRUMENTED_END_SEND, &&TARGET_INSTRUMENTED_END_SEND,

View file

@ -562,6 +562,19 @@
break; break;
} }
case _GUARD_BINARY_OP_EXTEND: {
break;
}
case _BINARY_OP_EXTEND: {
_Py_UopsSymbol *res;
res = sym_new_not_null(ctx);
stack_pointer[-2] = res;
stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
break;
}
case _BINARY_SUBSCR: { case _BINARY_SUBSCR: {
_Py_UopsSymbol *res; _Py_UopsSymbol *res;
res = sym_new_not_null(ctx); res = sym_new_not_null(ctx);

View file

@ -1174,7 +1174,7 @@ do_specialize_instance_load_attr(PyObject* owner, _Py_CODEUNIT* instr, PyObject*
assert(tp_version != 0); assert(tp_version != 0);
write_u32(lm_cache->type_version, tp_version); write_u32(lm_cache->type_version, tp_version);
/* borrowed */ /* borrowed */
write_obj(lm_cache->descr, fget); write_ptr(lm_cache->descr, fget);
specialize(instr, LOAD_ATTR_PROPERTY); specialize(instr, LOAD_ATTR_PROPERTY);
return 0; return 0;
} }
@ -1254,7 +1254,7 @@ do_specialize_instance_load_attr(PyObject* owner, _Py_CODEUNIT* instr, PyObject*
#endif #endif
write_u32(lm_cache->keys_version, version); write_u32(lm_cache->keys_version, version);
/* borrowed */ /* borrowed */
write_obj(lm_cache->descr, descr); write_ptr(lm_cache->descr, descr);
write_u32(lm_cache->type_version, tp_version); write_u32(lm_cache->type_version, tp_version);
specialize(instr, LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN); specialize(instr, LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN);
return 0; return 0;
@ -1534,7 +1534,7 @@ specialize_class_load_attr(PyObject *owner, _Py_CODEUNIT *instr,
} }
#endif #endif
write_u32(cache->type_version, tp_version); write_u32(cache->type_version, tp_version);
write_obj(cache->descr, descr); write_ptr(cache->descr, descr);
if (metaclass_check) { if (metaclass_check) {
write_u32(cache->keys_version, meta_version); write_u32(cache->keys_version, meta_version);
specialize(instr, LOAD_ATTR_CLASS_WITH_METACLASS_CHECK); specialize(instr, LOAD_ATTR_CLASS_WITH_METACLASS_CHECK);
@ -1642,7 +1642,7 @@ specialize_attr_loadclassattr(PyObject *owner, _Py_CODEUNIT *instr,
* working since Python 2.6 and it's battle-tested. * working since Python 2.6 and it's battle-tested.
*/ */
write_u32(cache->type_version, tp_version); write_u32(cache->type_version, tp_version);
write_obj(cache->descr, descr); write_ptr(cache->descr, descr);
return 1; return 1;
} }
@ -2412,6 +2412,92 @@ binary_op_fail_kind(int oparg, PyObject *lhs, PyObject *rhs)
} }
#endif #endif
/** Binary Op Specialization Extensions */
/* float-long */
static int
float_compactlong_guard(PyObject *lhs, PyObject *rhs)
{
return (
PyFloat_CheckExact(lhs) &&
PyLong_CheckExact(rhs) &&
_PyLong_IsCompact((PyLongObject *)rhs)
);
}
#define FLOAT_LONG_ACTION(NAME, OP) \
static PyObject * \
(NAME)(PyObject *lhs, PyObject *rhs) \
{ \
double lhs_val = PyFloat_AsDouble(lhs); \
Py_ssize_t rhs_val = _PyLong_CompactValue((PyLongObject *)rhs); \
return PyFloat_FromDouble(lhs_val OP rhs_val); \
}
FLOAT_LONG_ACTION(float_compactlong_add, +)
FLOAT_LONG_ACTION(float_compactlong_subtract, -)
FLOAT_LONG_ACTION(float_compactlong_multiply, *)
FLOAT_LONG_ACTION(float_compactlong_true_div, /)
#undef FLOAT_LONG_ACTION
/* long-float */
static int
compactlong_float_guard(PyObject *lhs, PyObject *rhs)
{
return (
PyFloat_CheckExact(rhs) &&
PyLong_CheckExact(lhs) &&
_PyLong_IsCompact((PyLongObject *)lhs)
);
}
#define LONG_FLOAT_ACTION(NAME, OP) \
static PyObject * \
(NAME)(PyObject *lhs, PyObject *rhs) \
{ \
double rhs_val = PyFloat_AsDouble(rhs); \
Py_ssize_t lhs_val = _PyLong_CompactValue((PyLongObject *)lhs); \
return PyFloat_FromDouble(lhs_val OP rhs_val); \
}
LONG_FLOAT_ACTION(compactlong_float_add, +)
LONG_FLOAT_ACTION(compactlong_float_subtract, -)
LONG_FLOAT_ACTION(compactlong_float_multiply, *)
LONG_FLOAT_ACTION(compactlong_float_true_div, /)
#undef LONG_FLOAT_ACTION
static _PyBinaryOpSpecializationDescr float_compactlong_specs[NB_OPARG_LAST+1] = {
[NB_ADD] = {float_compactlong_guard, float_compactlong_add},
[NB_SUBTRACT] = {float_compactlong_guard, float_compactlong_subtract},
[NB_TRUE_DIVIDE] = {float_compactlong_guard, float_compactlong_true_div},
[NB_MULTIPLY] = {float_compactlong_guard, float_compactlong_multiply},
};
static _PyBinaryOpSpecializationDescr compactlong_float_specs[NB_OPARG_LAST+1] = {
[NB_ADD] = {compactlong_float_guard, compactlong_float_add},
[NB_SUBTRACT] = {compactlong_float_guard, compactlong_float_subtract},
[NB_TRUE_DIVIDE] = {compactlong_float_guard, compactlong_float_true_div},
[NB_MULTIPLY] = {compactlong_float_guard, compactlong_float_multiply},
};
static int
binary_op_extended_specialization(PyObject *lhs, PyObject *rhs, int oparg,
_PyBinaryOpSpecializationDescr **descr)
{
#define LOOKUP_SPEC(TABLE, OPARG) \
if ((TABLE)[(OPARG)].action) { \
if ((TABLE)[(OPARG)].guard(lhs, rhs)) { \
*descr = &((TABLE)[OPARG]); \
return 1; \
} \
}
LOOKUP_SPEC(compactlong_float_specs, oparg);
LOOKUP_SPEC(float_compactlong_specs, oparg);
#undef LOOKUP_SPEC
return 0;
}
void void
_Py_Specialize_BinaryOp(_PyStackRef lhs_st, _PyStackRef rhs_st, _Py_CODEUNIT *instr, _Py_Specialize_BinaryOp(_PyStackRef lhs_st, _PyStackRef rhs_st, _Py_CODEUNIT *instr,
int oparg, _PyStackRef *locals) int oparg, _PyStackRef *locals)
@ -2420,6 +2506,12 @@ _Py_Specialize_BinaryOp(_PyStackRef lhs_st, _PyStackRef rhs_st, _Py_CODEUNIT *in
PyObject *rhs = PyStackRef_AsPyObjectBorrow(rhs_st); PyObject *rhs = PyStackRef_AsPyObjectBorrow(rhs_st);
assert(ENABLE_SPECIALIZATION_FT); assert(ENABLE_SPECIALIZATION_FT);
assert(_PyOpcode_Caches[BINARY_OP] == INLINE_CACHE_ENTRIES_BINARY_OP); assert(_PyOpcode_Caches[BINARY_OP] == INLINE_CACHE_ENTRIES_BINARY_OP);
_PyBinaryOpCache *cache = (_PyBinaryOpCache *)(instr + 1);
if (instr->op.code == BINARY_OP_EXTEND) {
write_ptr(cache->external_cache, NULL);
}
switch (oparg) { switch (oparg) {
case NB_ADD: case NB_ADD:
case NB_INPLACE_ADD: case NB_INPLACE_ADD:
@ -2474,8 +2566,17 @@ _Py_Specialize_BinaryOp(_PyStackRef lhs_st, _PyStackRef rhs_st, _Py_CODEUNIT *in
} }
break; break;
} }
_PyBinaryOpSpecializationDescr *descr;
if (binary_op_extended_specialization(lhs, rhs, oparg, &descr)) {
specialize(instr, BINARY_OP_EXTEND);
write_ptr(cache->external_cache, (void*)descr);
return;
}
SPECIALIZATION_FAIL(BINARY_OP, binary_op_fail_kind(oparg, lhs, rhs)); SPECIALIZATION_FAIL(BINARY_OP, binary_op_fail_kind(oparg, lhs, rhs));
unspecialize(instr); unspecialize(instr);
return;
} }

View file

@ -378,6 +378,8 @@ Python/pylifecycle.c - INTERPRETER_TRAMPOLINE_CODEDEF -
Python/pystate.c - initial - Python/pystate.c - initial -
Python/specialize.c - adaptive_opcodes - Python/specialize.c - adaptive_opcodes -
Python/specialize.c - cache_requirements - Python/specialize.c - cache_requirements -
Python/specialize.c - float_compactlong_specs -
Python/specialize.c - compactlong_float_specs -
Python/stdlib_module_names.h - _Py_stdlib_module_names - Python/stdlib_module_names.h - _Py_stdlib_module_names -
Python/sysmodule.c - perf_map_state - Python/sysmodule.c - perf_map_state -
Python/sysmodule.c - _PySys_ImplCacheTag - Python/sysmodule.c - _PySys_ImplCacheTag -

Can't render this file because it has a wrong number of fields in line 4.

View file

@ -357,9 +357,12 @@ class Parser(PLexer):
def uop(self) -> UOp | None: def uop(self) -> UOp | None:
if tkn := self.expect(lx.IDENTIFIER): if tkn := self.expect(lx.IDENTIFIER):
if self.expect(lx.DIVIDE): if self.expect(lx.DIVIDE):
sign = 1
if negate := self.expect(lx.MINUS):
sign = -1
if num := self.expect(lx.NUMBER): if num := self.expect(lx.NUMBER):
try: try:
size = int(num.text) size = sign * int(num.text)
except ValueError: except ValueError:
raise self.make_syntax_error( raise self.make_syntax_error(
f"Expected integer, got {num.text!r}" f"Expected integer, got {num.text!r}"