Skip to content

Commit 91ef606

Browse files
committed
fix test__opcode. Special case INSTRUMENTED_LINE in generator
1 parent f7ae491 commit 91ef606

File tree

4 files changed

+17
-7
lines changed

4 files changed

+17
-7
lines changed

Include/internal/pycore_opcode_metadata.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -949,7 +949,8 @@ enum InstructionFormat { INSTR_FMT_IB, INSTR_FMT_IBC, INSTR_FMT_IBC00, INSTR_FMT
949949

950950
#define IS_VALID_OPCODE(OP) \
951951
(((OP) >= 0) && ((OP) < OPCODE_METADATA_SIZE) && \
952-
(_PyOpcode_opcode_metadata[(OP)].valid_entry))
952+
(_PyOpcode_opcode_metadata[(OP)].valid_entry)) || \
953+
((OP) == INSTRUMENTED_LINE)
953954

954955
#define HAS_ARG_FLAG (1)
955956
#define HAS_CONST_FLAG (2)
@@ -964,7 +965,7 @@ enum InstructionFormat { INSTR_FMT_IB, INSTR_FMT_IBC, INSTR_FMT_IBC00, INSTR_FMT
964965
#define OPCODE_HAS_JUMP(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_JUMP_FLAG))
965966
#define OPCODE_HAS_FREE(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_FREE_FLAG))
966967
#define OPCODE_HAS_LOCAL(OP) (_PyOpcode_opcode_metadata[OP].flags & (HAS_LOCAL_FLAG))
967-
#define OPCODE_IS_INSTRUMENTED(OP) (_PyOpcode_opcode_metadata[OP].flags & (IS_INSTRUMENTED_FLAG))
968+
#define OPCODE_IS_INSTRUMENTED(OP) (_PyOpcode_opcode_metadata[OP].flags & (IS_INSTRUMENTED_FLAG)) || ((OP) == INSTRUMENTED_LINE)
968969

969970
struct opcode_metadata {
970971
bool valid_entry;

Lib/test/test__opcode.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,14 @@ def test_stack_effect(self):
5858
# All defined opcodes
5959
has_arg = dis.hasarg
6060
for name, code in filter(lambda item: item[0] not in dis.deoptmap, dis.opmap.items()):
61-
if code >= opcode.MIN_INSTRUMENTED_OPCODE:
61+
if _opcode.is_instrumented(code):
6262
continue
6363
with self.subTest(opname=name):
64-
stack_effect(code)
64+
try:
65+
stack_effect(code)
66+
except Exception as e:
67+
breakpoint()
68+
raise
6569
stack_effect(code, 0)
6670
# All not defined opcodes
6771
for code in set(range(256)) - set(dis.opmap.values()):
@@ -83,7 +87,7 @@ def test_stack_effect_jump(self):
8387
has_exc = dis.hasexc
8488
has_jump = dis.hasjabs + dis.hasjrel
8589
for name, code in filter(lambda item: item[0] not in dis.deoptmap, dis.opmap.items()):
86-
if code >= opcode.MIN_INSTRUMENTED_OPCODE:
90+
if _opcode.is_instrumented(code):
8791
continue
8892
with self.subTest(opname=name):
8993
if code not in has_arg:

Tools/cases_generator/flags.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,13 @@ def emit_macros(cls, out: Formatter):
7070
out.emit(f"#define {name} ({value})")
7171

7272
for name, value in flags.bitmask.items():
73+
if name == 'IS_INSTRUMENTED_FLAG':
74+
or_special_case = " || ((OP) == INSTRUMENTED_LINE)"
75+
else:
76+
or_special_case = ""
7377
out.emit(
7478
f"#define OPCODE_{name[:-len('_FLAG')]}(OP) "
75-
f"(_PyOpcode_opcode_metadata[OP].flags & ({name}))"
79+
f"(_PyOpcode_opcode_metadata[OP].flags & ({name})){or_special_case}"
7680
)
7781

7882

Tools/cases_generator/generate_cases.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,8 @@ def write_metadata(self, metadata_filename: str, pymetadata_filename: str) -> No
283283
self.out.emit(
284284
"#define IS_VALID_OPCODE(OP) \\\n"
285285
" (((OP) >= 0) && ((OP) < OPCODE_METADATA_SIZE) && \\\n"
286-
" (_PyOpcode_opcode_metadata[(OP)].valid_entry))"
286+
" (_PyOpcode_opcode_metadata[(OP)].valid_entry)) || \\\n"
287+
" ((OP) == INSTRUMENTED_LINE)" # implemented in ceval.c, not bytecodes.c
287288
)
288289

289290
self.out.emit("")

0 commit comments

Comments
 (0)