mirror of https://github.com/python/cpython
gh-105481: remove dependency of _inline_cache_entries on opname (#107339)
This commit is contained in:
parent
766d2518ae
commit
d77d973335
|
@ -19,20 +19,20 @@ extern const uint8_t _PyOpcode_Deopt[256];
|
||||||
#ifdef NEED_OPCODE_TABLES
|
#ifdef NEED_OPCODE_TABLES
|
||||||
|
|
||||||
const uint8_t _PyOpcode_Caches[256] = {
|
const uint8_t _PyOpcode_Caches[256] = {
|
||||||
[TO_BOOL] = 3,
|
|
||||||
[BINARY_SUBSCR] = 1,
|
|
||||||
[STORE_SUBSCR] = 1,
|
|
||||||
[UNPACK_SEQUENCE] = 1,
|
|
||||||
[FOR_ITER] = 1,
|
|
||||||
[STORE_ATTR] = 4,
|
|
||||||
[LOAD_ATTR] = 9,
|
|
||||||
[COMPARE_OP] = 1,
|
|
||||||
[LOAD_GLOBAL] = 4,
|
[LOAD_GLOBAL] = 4,
|
||||||
[BINARY_OP] = 1,
|
[BINARY_OP] = 1,
|
||||||
|
[UNPACK_SEQUENCE] = 1,
|
||||||
|
[COMPARE_OP] = 1,
|
||||||
|
[BINARY_SUBSCR] = 1,
|
||||||
|
[FOR_ITER] = 1,
|
||||||
|
[LOAD_SUPER_ATTR] = 1,
|
||||||
|
[LOAD_ATTR] = 9,
|
||||||
|
[STORE_ATTR] = 4,
|
||||||
|
[CALL] = 3,
|
||||||
|
[STORE_SUBSCR] = 1,
|
||||||
[SEND] = 1,
|
[SEND] = 1,
|
||||||
[JUMP_BACKWARD] = 1,
|
[JUMP_BACKWARD] = 1,
|
||||||
[LOAD_SUPER_ATTR] = 1,
|
[TO_BOOL] = 3,
|
||||||
[CALL] = 3,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint8_t _PyOpcode_Deopt[256] = {
|
const uint8_t _PyOpcode_Deopt[256] = {
|
||||||
|
|
13
Lib/dis.py
13
Lib/dis.py
|
@ -288,13 +288,16 @@ _ExceptionTableEntry = collections.namedtuple("_ExceptionTableEntry",
|
||||||
_OPNAME_WIDTH = 20
|
_OPNAME_WIDTH = 20
|
||||||
_OPARG_WIDTH = 5
|
_OPARG_WIDTH = 5
|
||||||
|
|
||||||
|
def _get_cache_size(opname):
|
||||||
|
return _inline_cache_entries.get(opname, 0)
|
||||||
|
|
||||||
def _get_jump_target(op, arg, offset):
|
def _get_jump_target(op, arg, offset):
|
||||||
"""Gets the bytecode offset of the jump target if this is a jump instruction.
|
"""Gets the bytecode offset of the jump target if this is a jump instruction.
|
||||||
|
|
||||||
Otherwise return None.
|
Otherwise return None.
|
||||||
"""
|
"""
|
||||||
deop = _deoptop(op)
|
deop = _deoptop(op)
|
||||||
caches = _inline_cache_entries[deop]
|
caches = _get_cache_size(_all_opname[deop])
|
||||||
if deop in hasjrel:
|
if deop in hasjrel:
|
||||||
if _is_backward_jump(deop):
|
if _is_backward_jump(deop):
|
||||||
arg = -arg
|
arg = -arg
|
||||||
|
@ -353,7 +356,7 @@ class Instruction(_Instruction):
|
||||||
@property
|
@property
|
||||||
def end_offset(self):
|
def end_offset(self):
|
||||||
"""End index of the cache entries following the operation."""
|
"""End index of the cache entries following the operation."""
|
||||||
return self.cache_offset + _inline_cache_entries[self.opcode]*2
|
return self.cache_offset + _get_cache_size(_all_opname[self.opcode])*2
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def jump_target(self):
|
def jump_target(self):
|
||||||
|
@ -535,7 +538,7 @@ def _get_instructions_bytes(code, varname_from_oparg=None,
|
||||||
argrepr = ''
|
argrepr = ''
|
||||||
positions = Positions(*next(co_positions, ()))
|
positions = Positions(*next(co_positions, ()))
|
||||||
deop = _deoptop(op)
|
deop = _deoptop(op)
|
||||||
caches = _inline_cache_entries[deop]
|
caches = _get_cache_size(_all_opname[deop])
|
||||||
op = code[offset]
|
op = code[offset]
|
||||||
if arg is not None:
|
if arg is not None:
|
||||||
# Set argval to the dereferenced value of the argument when
|
# Set argval to the dereferenced value of the argument when
|
||||||
|
@ -679,7 +682,7 @@ def _disassemble_bytes(code, lasti=-1, varname_from_oparg=None,
|
||||||
else:
|
else:
|
||||||
# Each CACHE takes 2 bytes
|
# Each CACHE takes 2 bytes
|
||||||
is_current_instr = instr.offset <= lasti \
|
is_current_instr = instr.offset <= lasti \
|
||||||
<= instr.offset + 2 * _inline_cache_entries[_deoptop(instr.opcode)]
|
<= instr.offset + 2 * _get_cache_size(_all_opname[_deoptop(instr.opcode)])
|
||||||
print(instr._disassemble(lineno_width, is_current_instr, offset_width),
|
print(instr._disassemble(lineno_width, is_current_instr, offset_width),
|
||||||
file=file)
|
file=file)
|
||||||
if exception_entries:
|
if exception_entries:
|
||||||
|
@ -712,7 +715,7 @@ def _unpack_opargs(code):
|
||||||
continue
|
continue
|
||||||
op = code[i]
|
op = code[i]
|
||||||
deop = _deoptop(op)
|
deop = _deoptop(op)
|
||||||
caches = _inline_cache_entries[deop]
|
caches = _get_cache_size(_all_opname[deop])
|
||||||
if deop in hasarg:
|
if deop in hasarg:
|
||||||
arg = code[i+1] | extended_arg
|
arg = code[i+1] | extended_arg
|
||||||
extended_arg = (arg << 8) if deop == EXTENDED_ARG else 0
|
extended_arg = (arg << 8) if deop == EXTENDED_ARG else 0
|
||||||
|
|
|
@ -347,6 +347,6 @@ _cache_format = {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
_inline_cache_entries = [
|
_inline_cache_entries = {
|
||||||
sum(_cache_format.get(opname[opcode], {}).values()) for opcode in range(256)
|
name : sum(value.values()) for (name, value) in _cache_format.items()
|
||||||
]
|
}
|
||||||
|
|
|
@ -106,7 +106,7 @@ class SpecializationStatsTests(unittest.TestCase):
|
||||||
specialized_opcodes = [
|
specialized_opcodes = [
|
||||||
op.lower()
|
op.lower()
|
||||||
for op in opcode._specializations
|
for op in opcode._specializations
|
||||||
if opcode._inline_cache_entries[opcode.opmap[op]]
|
if opcode._inline_cache_entries.get(op, 0)
|
||||||
]
|
]
|
||||||
self.assertIn('load_attr', specialized_opcodes)
|
self.assertIn('load_attr', specialized_opcodes)
|
||||||
self.assertIn('binary_subscr', specialized_opcodes)
|
self.assertIn('binary_subscr', specialized_opcodes)
|
||||||
|
|
|
@ -120,9 +120,8 @@ def main(opcode_py,
|
||||||
iobj.write("\n#ifdef NEED_OPCODE_TABLES\n")
|
iobj.write("\n#ifdef NEED_OPCODE_TABLES\n")
|
||||||
|
|
||||||
iobj.write("\nconst uint8_t _PyOpcode_Caches[256] = {\n")
|
iobj.write("\nconst uint8_t _PyOpcode_Caches[256] = {\n")
|
||||||
for i, entries in enumerate(opcode["_inline_cache_entries"]):
|
for name, entries in opcode["_inline_cache_entries"].items():
|
||||||
if entries:
|
iobj.write(f" [{name}] = {entries},\n")
|
||||||
iobj.write(f" [{opname[i]}] = {entries},\n")
|
|
||||||
iobj.write("};\n")
|
iobj.write("};\n")
|
||||||
|
|
||||||
deoptcodes = {}
|
deoptcodes = {}
|
||||||
|
|
Loading…
Reference in New Issue