bpo-44900: Add five superinstructions. (GH-27741)

* LOAD_FAST LOAD_FAST
* STORE_FAST LOAD_FAST
* LOAD_FAST LOAD_CONST
* LOAD_CONST LOAD_FAST
* STORE_FAST STORE_FAST
This commit is contained in:
Mark Shannon 2021-08-16 12:23:13 +01:00 committed by GitHub
parent 1a511dc92d
commit 4f51fa9e2d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 133 additions and 20 deletions

View file

@ -1266,16 +1266,21 @@ eval_frame_handle_pending(PyThreadState *tstate)
#define PRE_DISPATCH_GOTO() do { LLTRACE_INSTR(); RECORD_DXPROFILE(); } while (0)
#endif
#define NOTRACE_DISPATCH() \
{ \
frame->f_lasti = INSTR_OFFSET(); \
NEXTOPARG(); \
PRE_DISPATCH_GOTO(); \
DISPATCH_GOTO(); \
}
/* Do interpreter dispatch accounting for tracing and instrumentation */
#define DISPATCH() \
{ \
if (cframe.use_tracing OR_DTRACE_LINE) { \
goto tracing_dispatch; \
} \
frame->f_lasti = INSTR_OFFSET(); \
NEXTOPARG(); \
PRE_DISPATCH_GOTO(); \
DISPATCH_GOTO(); \
NOTRACE_DISPATCH(); \
}
#define CHECK_EVAL_BREAKER() \
@ -1682,11 +1687,7 @@ check_eval_breaker:
TARGET(LOAD_FAST): {
PyObject *value = GETLOCAL(oparg);
if (value == NULL) {
format_exc_check_arg(tstate, PyExc_UnboundLocalError,
UNBOUNDLOCAL_ERROR_MSG,
PyTuple_GetItem(co->co_localsplusnames,
oparg));
goto error;
goto unbound_local_error;
}
Py_INCREF(value);
PUSH(value);
@ -1708,6 +1709,73 @@ check_eval_breaker:
DISPATCH();
}
TARGET(LOAD_FAST__LOAD_FAST): {
PyObject *value = GETLOCAL(oparg);
if (value == NULL) {
goto unbound_local_error;
}
NEXTOPARG();
Py_INCREF(value);
PUSH(value);
value = GETLOCAL(oparg);
if (value == NULL) {
goto unbound_local_error;
}
Py_INCREF(value);
PUSH(value);
NOTRACE_DISPATCH();
}
TARGET(LOAD_FAST__LOAD_CONST): {
PyObject *value = GETLOCAL(oparg);
if (value == NULL) {
goto unbound_local_error;
}
NEXTOPARG();
Py_INCREF(value);
PUSH(value);
value = GETITEM(consts, oparg);
Py_INCREF(value);
PUSH(value);
NOTRACE_DISPATCH();
}
TARGET(STORE_FAST__LOAD_FAST): {
PyObject *value = POP();
SETLOCAL(oparg, value);
NEXTOPARG();
value = GETLOCAL(oparg);
if (value == NULL) {
goto unbound_local_error;
}
Py_INCREF(value);
PUSH(value);
NOTRACE_DISPATCH();
}
TARGET(STORE_FAST__STORE_FAST): {
PyObject *value = POP();
SETLOCAL(oparg, value);
NEXTOPARG();
value = POP();
SETLOCAL(oparg, value);
NOTRACE_DISPATCH();
}
TARGET(LOAD_CONST__LOAD_FAST): {
PyObject *value = GETITEM(consts, oparg);
NEXTOPARG();
Py_INCREF(value);
PUSH(value);
value = GETLOCAL(oparg);
if (value == NULL) {
goto unbound_local_error;
}
Py_INCREF(value);
PUSH(value);
NOTRACE_DISPATCH();
}
TARGET(POP_TOP): {
PyObject *value = POP();
Py_DECREF(value);
@ -4592,6 +4660,15 @@ binary_subscr_dict_error:
goto error;
}
unbound_local_error:
{
format_exc_check_arg(tstate, PyExc_UnboundLocalError,
UNBOUNDLOCAL_ERROR_MSG,
PyTuple_GetItem(co->co_localsplusnames, oparg)
);
goto error;
}
error:
/* Double-check exception status. */
#ifdef NDEBUG