mirror of
https://github.com/python/cpython.git
synced 2025-09-03 23:41:18 +00:00
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:
parent
1a511dc92d
commit
4f51fa9e2d
6 changed files with 133 additions and 20 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue