optimize(_Py_CODEUNIT *instructions, int len)
{
int previous_opcode = -1;
- int previous_oparg = -1;
for(int i = 0; i < len; i++) {
int opcode = _Py_OPCODE(instructions[i]);
- int oparg = _Py_OPARG(instructions[i]);
uint8_t adaptive_opcode = adaptive_opcodes[opcode];
if (adaptive_opcode) {
- instructions[i] = _Py_MAKECODEUNIT(adaptive_opcode, oparg);
+ _Py_SET_OPCODE(instructions[i], adaptive_opcode);
// Make sure the adaptive counter is zero:
assert(instructions[i + 1] == 0);
previous_opcode = -1;
- previous_oparg = -1;
i += _PyOpcode_InlineCacheEntries[opcode];
}
else {
assert(!_PyOpcode_InlineCacheEntries[opcode]);
switch (opcode) {
case JUMP_ABSOLUTE:
- instructions[i] = _Py_MAKECODEUNIT(JUMP_ABSOLUTE_QUICK, oparg);
+ _Py_SET_OPCODE(instructions[i], JUMP_ABSOLUTE_QUICK);
break;
case RESUME:
- instructions[i] = _Py_MAKECODEUNIT(RESUME_QUICK, oparg);
+ _Py_SET_OPCODE(instructions[i], RESUME_QUICK);
break;
case LOAD_FAST:
switch(previous_opcode) {
case LOAD_FAST:
- assert(0 <= previous_oparg);
- instructions[i-1] = _Py_MAKECODEUNIT(LOAD_FAST__LOAD_FAST, previous_oparg);
+ _Py_SET_OPCODE(instructions[i - 1],
+ LOAD_FAST__LOAD_FAST);
break;
case STORE_FAST:
- assert(0 <= previous_oparg);
- instructions[i-1] = _Py_MAKECODEUNIT(STORE_FAST__LOAD_FAST, previous_oparg);
+ _Py_SET_OPCODE(instructions[i - 1],
+ STORE_FAST__LOAD_FAST);
break;
case LOAD_CONST:
- assert(0 <= previous_oparg);
- instructions[i-1] = _Py_MAKECODEUNIT(LOAD_CONST__LOAD_FAST, previous_oparg);
+ _Py_SET_OPCODE(instructions[i - 1],
+ LOAD_CONST__LOAD_FAST);
break;
}
break;
case STORE_FAST:
if (previous_opcode == STORE_FAST) {
- assert(0 <= previous_oparg);
- instructions[i-1] = _Py_MAKECODEUNIT(STORE_FAST__STORE_FAST, previous_oparg);
+ _Py_SET_OPCODE(instructions[i - 1],
+ STORE_FAST__STORE_FAST);
}
break;
case LOAD_CONST:
if (previous_opcode == LOAD_FAST) {
- assert(0 <= previous_oparg);
- instructions[i-1] = _Py_MAKECODEUNIT(LOAD_FAST__LOAD_CONST, previous_oparg);
+ _Py_SET_OPCODE(instructions[i - 1],
+ LOAD_FAST__LOAD_CONST);
}
break;
}
previous_opcode = opcode;
- previous_oparg = oparg;
}
}
}
}
write_u32(cache->version, keys_version);
cache->index = (uint16_t)index;
- *instr = _Py_MAKECODEUNIT(opcode_module, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, opcode_module);
return 0;
}
}
write_u32(cache->version, type->tp_version_tag);
cache->index = (uint16_t)index;
- *instr = _Py_MAKECODEUNIT(values_op, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, values_op);
}
else {
if (!PyDict_CheckExact(dict)) {
}
cache->index = (uint16_t)hint;
write_u32(cache->version, type->tp_version_tag);
- *instr = _Py_MAKECODEUNIT(hint_op, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, hint_op);
}
return 1;
}
assert(offset > 0);
cache->index = (uint16_t)offset;
write_u32(cache->version, type->tp_version_tag);
- *instr = _Py_MAKECODEUNIT(LOAD_ATTR_SLOT, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, LOAD_ATTR_SLOT);
goto success;
}
case DUNDER_CLASS:
assert(offset == (uint16_t)offset);
cache->index = (uint16_t)offset;
write_u32(cache->version, type->tp_version_tag);
- *instr = _Py_MAKECODEUNIT(LOAD_ATTR_SLOT, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, LOAD_ATTR_SLOT);
goto success;
}
case OTHER_SLOT:
assert(offset > 0);
cache->index = (uint16_t)offset;
write_u32(cache->version, type->tp_version_tag);
- *instr = _Py_MAKECODEUNIT(STORE_ATTR_SLOT, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, STORE_ATTR_SLOT);
goto success;
}
case DUNDER_CLASS:
case NON_DESCRIPTOR:
write_u32(cache->type_version, ((PyTypeObject *)owner)->tp_version_tag);
write_obj(cache->descr, descr);
- *instr = _Py_MAKECODEUNIT(LOAD_METHOD_CLASS, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, LOAD_METHOD_CLASS);
return 0;
#ifdef Py_STATS
case ABSENT:
}
switch(dictkind) {
case NO_DICT:
- *instr = _Py_MAKECODEUNIT(LOAD_METHOD_NO_DICT, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, LOAD_METHOD_NO_DICT);
break;
case MANAGED_VALUES:
- *instr = _Py_MAKECODEUNIT(LOAD_METHOD_WITH_VALUES, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, LOAD_METHOD_WITH_VALUES);
break;
case MANAGED_DICT:
*(int16_t *)&cache->dict_offset = (int16_t)MANAGED_DICT_OFFSET;
- *instr = _Py_MAKECODEUNIT(LOAD_METHOD_WITH_DICT, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, LOAD_METHOD_WITH_DICT);
break;
case OFFSET_DICT:
assert(owner_cls->tp_dictoffset > 0 && owner_cls->tp_dictoffset <= INT16_MAX);
cache->dict_offset = (uint16_t)owner_cls->tp_dictoffset;
- *instr = _Py_MAKECODEUNIT(LOAD_METHOD_WITH_DICT, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, LOAD_METHOD_WITH_DICT);
break;
}
/* `descr` is borrowed. This is safe for methods (even inherited ones from
}
cache->index = (uint16_t)index;
write_u32(cache->module_keys_version, keys_version);
- *instr = _Py_MAKECODEUNIT(LOAD_GLOBAL_MODULE, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, LOAD_GLOBAL_MODULE);
goto success;
}
if (!PyDict_CheckExact(builtins)) {
cache->index = (uint16_t)index;
write_u32(cache->module_keys_version, globals_version);
cache->builtin_keys_version = (uint16_t)builtins_version;
- *instr = _Py_MAKECODEUNIT(LOAD_GLOBAL_BUILTIN, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, LOAD_GLOBAL_BUILTIN);
goto success;
fail:
STAT_INC(LOAD_GLOBAL, failure);
PyTypeObject *container_type = Py_TYPE(container);
if (container_type == &PyList_Type) {
if (PyLong_CheckExact(sub)) {
- *instr = _Py_MAKECODEUNIT(BINARY_SUBSCR_LIST_INT, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, BINARY_SUBSCR_LIST_INT);
goto success;
}
SPECIALIZATION_FAIL(BINARY_SUBSCR,
}
if (container_type == &PyTuple_Type) {
if (PyLong_CheckExact(sub)) {
- *instr = _Py_MAKECODEUNIT(BINARY_SUBSCR_TUPLE_INT, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, BINARY_SUBSCR_TUPLE_INT);
goto success;
}
SPECIALIZATION_FAIL(BINARY_SUBSCR,
goto fail;
}
if (container_type == &PyDict_Type) {
- *instr = _Py_MAKECODEUNIT(BINARY_SUBSCR_DICT, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, BINARY_SUBSCR_DICT);
goto success;
}
PyTypeObject *cls = Py_TYPE(container);
}
cache->func_version = version;
((PyHeapTypeObject *)container_type)->_spec_cache.getitem = descriptor;
- *instr = _Py_MAKECODEUNIT(BINARY_SUBSCR_GETITEM, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, BINARY_SUBSCR_GETITEM);
goto success;
}
SPECIALIZATION_FAIL(BINARY_SUBSCR,
if ((Py_SIZE(sub) == 0 || Py_SIZE(sub) == 1)
&& ((PyLongObject *)sub)->ob_digit[0] < (size_t)PyList_GET_SIZE(container))
{
- *instr = _Py_MAKECODEUNIT(STORE_SUBSCR_LIST_INT,
- _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, STORE_SUBSCR_LIST_INT);
goto success;
}
else {
}
}
if (container_type == &PyDict_Type) {
- *instr = _Py_MAKECODEUNIT(STORE_SUBSCR_DICT, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, STORE_SUBSCR_DICT);
goto success;
}
#ifdef Py_STATS
if (tp->tp_flags & Py_TPFLAGS_IMMUTABLETYPE) {
if (nargs == 1 && kwnames == NULL && oparg == 1) {
if (tp == &PyUnicode_Type) {
- *instr = _Py_MAKECODEUNIT(PRECALL_NO_KW_STR_1, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, PRECALL_NO_KW_STR_1);
return 0;
}
else if (tp == &PyType_Type) {
- *instr = _Py_MAKECODEUNIT(PRECALL_NO_KW_TYPE_1, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, PRECALL_NO_KW_TYPE_1);
return 0;
}
else if (tp == &PyTuple_Type) {
- *instr = _Py_MAKECODEUNIT(PRECALL_NO_KW_TUPLE_1, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, PRECALL_NO_KW_TUPLE_1);
return 0;
}
}
if (tp->tp_vectorcall != NULL) {
- *instr = _Py_MAKECODEUNIT(PRECALL_BUILTIN_CLASS, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, PRECALL_BUILTIN_CLASS);
return 0;
}
SPECIALIZATION_FAIL(PRECALL, tp == &PyUnicode_Type ?
SPECIALIZATION_FAIL(PRECALL, SPEC_FAIL_WRONG_NUMBER_ARGUMENTS);
return -1;
}
- *instr = _Py_MAKECODEUNIT(PRECALL_NO_KW_METHOD_DESCRIPTOR_NOARGS,
- _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, PRECALL_NO_KW_METHOD_DESCRIPTOR_NOARGS);
return 0;
}
case METH_O: {
PyInterpreterState *interp = _PyInterpreterState_GET();
PyObject *list_append = interp->callable_cache.list_append;
if ((PyObject *)descr == list_append && oparg == 1) {
- *instr = _Py_MAKECODEUNIT(PRECALL_NO_KW_LIST_APPEND,
- _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, PRECALL_NO_KW_LIST_APPEND);
return 0;
}
- *instr = _Py_MAKECODEUNIT(PRECALL_NO_KW_METHOD_DESCRIPTOR_O,
- _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, PRECALL_NO_KW_METHOD_DESCRIPTOR_O);
return 0;
}
case METH_FASTCALL: {
- *instr = _Py_MAKECODEUNIT(PRECALL_NO_KW_METHOD_DESCRIPTOR_FAST,
- _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, PRECALL_NO_KW_METHOD_DESCRIPTOR_FAST);
return 0;
}
}
write_u32(cache->func_version, version);
cache->min_args = min_args;
if (argcount == nargs) {
- *instr = _Py_MAKECODEUNIT(CALL_PY_EXACT_ARGS, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, CALL_PY_EXACT_ARGS);
}
else {
- *instr = _Py_MAKECODEUNIT(CALL_PY_WITH_DEFAULTS, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, CALL_PY_WITH_DEFAULTS);
}
return 0;
}
/* len(o) */
PyInterpreterState *interp = _PyInterpreterState_GET();
if (callable == interp->callable_cache.len) {
- *instr = _Py_MAKECODEUNIT(PRECALL_NO_KW_LEN,
- _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, PRECALL_NO_KW_LEN);
return 0;
}
- *instr = _Py_MAKECODEUNIT(PRECALL_NO_KW_BUILTIN_O,
- _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, PRECALL_NO_KW_BUILTIN_O);
return 0;
}
case METH_FASTCALL: {
/* isinstance(o1, o2) */
PyInterpreterState *interp = _PyInterpreterState_GET();
if (callable == interp->callable_cache.isinstance) {
- *instr = _Py_MAKECODEUNIT(PRECALL_NO_KW_ISINSTANCE,
- _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, PRECALL_NO_KW_ISINSTANCE);
return 0;
}
}
- *instr = _Py_MAKECODEUNIT(PRECALL_NO_KW_BUILTIN_FAST,
- _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, PRECALL_NO_KW_BUILTIN_FAST);
return 0;
}
case METH_FASTCALL | METH_KEYWORDS: {
- *instr = _Py_MAKECODEUNIT(PRECALL_BUILTIN_FAST_WITH_KEYWORDS,
- _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, PRECALL_BUILTIN_FAST_WITH_KEYWORDS);
return 0;
}
default:
fail = specialize_c_call(callable, instr, nargs, kwnames);
}
else if (PyFunction_Check(callable)) {
- *instr = _Py_MAKECODEUNIT(PRECALL_PYFUNC, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, PRECALL_PYFUNC);
fail = 0;
}
else if (PyType_Check(callable)) {
instr, nargs, kwnames, oparg);
}
else if (Py_TYPE(callable) == &PyMethod_Type) {
- *instr = _Py_MAKECODEUNIT(PRECALL_BOUND_METHOD, _Py_OPARG(*instr));
+ _Py_SET_OPCODE(*instr, PRECALL_BOUND_METHOD);
fail = 0;
}
else {
if (PyUnicode_CheckExact(lhs)) {
_Py_CODEUNIT next = instr[INLINE_CACHE_ENTRIES_BINARY_OP + 1];
if (_Py_OPCODE(next) == STORE_FAST && Py_REFCNT(lhs) == 2) {
- *instr = _Py_MAKECODEUNIT(BINARY_OP_INPLACE_ADD_UNICODE,
- oparg);
+ _Py_SET_OPCODE(*instr, BINARY_OP_INPLACE_ADD_UNICODE);
goto success;
}
- *instr = _Py_MAKECODEUNIT(BINARY_OP_ADD_UNICODE, oparg);
+ _Py_SET_OPCODE(*instr, BINARY_OP_ADD_UNICODE);
goto success;
}
if (PyLong_CheckExact(lhs)) {
- *instr = _Py_MAKECODEUNIT(BINARY_OP_ADD_INT, oparg);
+ _Py_SET_OPCODE(*instr, BINARY_OP_ADD_INT);
goto success;
}
if (PyFloat_CheckExact(lhs)) {
- *instr = _Py_MAKECODEUNIT(BINARY_OP_ADD_FLOAT, oparg);
+ _Py_SET_OPCODE(*instr, BINARY_OP_ADD_FLOAT);
goto success;
}
break;
break;
}
if (PyLong_CheckExact(lhs)) {
- *instr = _Py_MAKECODEUNIT(BINARY_OP_MULTIPLY_INT, oparg);
+ _Py_SET_OPCODE(*instr, BINARY_OP_MULTIPLY_INT);
goto success;
}
if (PyFloat_CheckExact(lhs)) {
- *instr = _Py_MAKECODEUNIT(BINARY_OP_MULTIPLY_FLOAT, oparg);
+ _Py_SET_OPCODE(*instr, BINARY_OP_MULTIPLY_FLOAT);
goto success;
}
break;
break;
}
if (PyLong_CheckExact(lhs)) {
- *instr = _Py_MAKECODEUNIT(BINARY_OP_SUBTRACT_INT, oparg);
+ _Py_SET_OPCODE(*instr, BINARY_OP_SUBTRACT_INT);
goto success;
}
if (PyFloat_CheckExact(lhs)) {
- *instr = _Py_MAKECODEUNIT(BINARY_OP_SUBTRACT_FLOAT, oparg);
+ _Py_SET_OPCODE(*instr, BINARY_OP_SUBTRACT_FLOAT);
goto success;
}
break;
// back to BINARY_OP (unless we're collecting stats, where it's more
// important to get accurate hit counts for the unadaptive version
// and each of the different failure types):
- *instr = _Py_MAKECODEUNIT(BINARY_OP, oparg);
+ _Py_SET_OPCODE(*instr, BINARY_OP);
return;
#endif
}
// counts for the unadaptive version and each of the different failure
// types):
#ifndef Py_STATS
- *instr = _Py_MAKECODEUNIT(COMPARE_OP, oparg);
+ _Py_SET_OPCODE(*instr, COMPARE_OP);
return;
#endif
if (next_opcode == EXTENDED_ARG) {
goto failure;
}
if (PyFloat_CheckExact(lhs)) {
- *instr = _Py_MAKECODEUNIT(COMPARE_OP_FLOAT_JUMP, oparg);
+ _Py_SET_OPCODE(*instr, COMPARE_OP_FLOAT_JUMP);
cache->mask = when_to_jump_mask;
goto success;
}
if (PyLong_CheckExact(lhs)) {
if (Py_ABS(Py_SIZE(lhs)) <= 1 && Py_ABS(Py_SIZE(rhs)) <= 1) {
- *instr = _Py_MAKECODEUNIT(COMPARE_OP_INT_JUMP, oparg);
+ _Py_SET_OPCODE(*instr, COMPARE_OP_INT_JUMP);
cache->mask = when_to_jump_mask;
goto success;
}
goto failure;
}
else {
- *instr = _Py_MAKECODEUNIT(COMPARE_OP_STR_JUMP, oparg);
+ _Py_SET_OPCODE(*instr, COMPARE_OP_STR_JUMP);
cache->mask = (when_to_jump_mask & 2) == 0;
goto success;
}
goto failure;
}
if (PyTuple_GET_SIZE(seq) == 2) {
- *instr = _Py_MAKECODEUNIT(UNPACK_SEQUENCE_TWO_TUPLE, oparg);
+ _Py_SET_OPCODE(*instr, UNPACK_SEQUENCE_TWO_TUPLE);
goto success;
}
- *instr = _Py_MAKECODEUNIT(UNPACK_SEQUENCE_TUPLE, oparg);
+ _Py_SET_OPCODE(*instr, UNPACK_SEQUENCE_TUPLE);
goto success;
}
if (PyList_CheckExact(seq)) {
SPECIALIZATION_FAIL(UNPACK_SEQUENCE, SPEC_FAIL_EXPECTED_ERROR);
goto failure;
}
- *instr = _Py_MAKECODEUNIT(UNPACK_SEQUENCE_LIST, oparg);
+ _Py_SET_OPCODE(*instr, UNPACK_SEQUENCE_LIST);
goto success;
}
SPECIALIZATION_FAIL(UNPACK_SEQUENCE, unpack_sequence_fail_kind(seq));