| // This file contains instruction definitions. |
| // It is read by generators stored in Tools/cases_generator/ |
| // to generate Python/generated_cases.c.h and others. |
| // Note that there is some dummy C code at the top and bottom of the file |
| // to fool text editors like VS Code into believing this is valid C code. |
| // The actual instruction definitions start at // BEGIN BYTECODES //. |
| // See Tools/cases_generator/README.md for more information. |
| |
| #include "Python.h" |
| #include "pycore_abstract.h" // _PyIndex_Check() |
| #include "pycore_audit.h" // _PySys_Audit() |
| #include "pycore_backoff.h" |
| #include "pycore_cell.h" // PyCell_GetRef() |
| #include "pycore_code.h" |
| #include "pycore_emscripten_signal.h" // _Py_CHECK_EMSCRIPTEN_SIGNALS |
| #include "pycore_function.h" |
| #include "pycore_instruments.h" |
| #include "pycore_interpolation.h" // _PyInterpolation_Build() |
| #include "pycore_intrinsics.h" |
| #include "pycore_long.h" // _PyLong_ExactDealloc(), _PyLong_GetZero() |
| #include "pycore_moduleobject.h" // PyModuleObject |
| #include "pycore_object.h" // _PyObject_GC_TRACK() |
| #include "pycore_opcode_metadata.h" // uop names |
| #include "pycore_opcode_utils.h" // MAKE_FUNCTION_* |
| #include "pycore_pyatomic_ft_wrappers.h" // FT_ATOMIC_* |
| #include "pycore_pyerrors.h" // _PyErr_GetRaisedException() |
| #include "pycore_pystate.h" // _PyInterpreterState_GET() |
| #include "pycore_range.h" // _PyRangeIterObject |
| #include "pycore_setobject.h" // _PySet_NextEntry() |
| #include "pycore_sliceobject.h" // _PyBuildSlice_ConsumeRefs |
| #include "pycore_stackref.h" |
| #include "pycore_template.h" // _PyTemplate_Build() |
| #include "pycore_tuple.h" // _PyTuple_ITEMS() |
| #include "pycore_typeobject.h" // _PySuper_Lookup() |
| |
| #include "pycore_dict.h" |
| #include "dictobject.h" |
| #include "pycore_frame.h" |
| #include "opcode.h" |
| #include "optimizer.h" |
| #include "pydtrace.h" |
| #include "setobject.h" |
| |
| |
| #define USE_COMPUTED_GOTOS 0 |
| #include "ceval_macros.h" |
| |
| /* Flow control macros */ |
| |
| #define inst(name, ...) case name: |
| #define op(name, ...) /* NAME is ignored */ |
| #define macro(name) static int MACRO_##name |
| #define super(name) static int SUPER_##name |
| #define family(name, ...) static int family_##name |
| #define pseudo(name) static int pseudo_##name |
| #define label(name) name: |
| |
| /* Annotations */ |
| #define guard |
| #define override |
| #define specializing |
| #define replicate(TIMES) |
| #define tier1 |
| #define no_save_ip |
| |
| // Dummy variables for stack effects. |
| static PyObject *value, *value1, *value2, *left, *right, *res, *sum, *prod, *sub; |
| static PyObject *container, *start, *stop, *v, *lhs, *rhs, *res2; |
| static PyObject *list, *tuple, *dict, *owner, *set, *str, *tup, *map, *keys; |
| static PyObject *exit_func, *lasti, *val, *retval, *obj, *iter, *exhausted; |
| static PyObject *aiter, *awaitable, *iterable, *w, *exc_value, *bc, *locals; |
| static PyObject *orig, *excs, *update, *b, *fromlist, *level, *from; |
| static PyObject **pieces, **values; |
| static size_t jump; |
| // Dummy variables for cache effects |
| static uint16_t invert, counter, index, hint; |
| #define unused 0 // Used in a macro def, can't be static |
| static uint32_t type_version; |
| static _PyExecutorObject *current_executor; |
| |
| static PyObject * |
| dummy_func( |
| PyThreadState *tstate, |
| _PyInterpreterFrame *frame, |
| unsigned char opcode, |
| unsigned int oparg, |
| _Py_CODEUNIT *next_instr, |
| PyObject **stack_pointer, |
| int throwflag, |
| PyObject *args[] |
| ) |
| { |
| // Dummy labels. |
| pop_1_error: |
| // Dummy locals. |
| PyObject *dummy; |
| _Py_CODEUNIT *this_instr; |
| PyObject *attr; |
| PyObject *attrs; |
| PyObject *bottom; |
| PyObject *callable; |
| PyObject *callargs; |
| PyObject *codeobj; |
| PyObject *cond; |
| PyObject *descr; |
| PyObject *exc; |
| PyObject *exit; |
| PyObject *fget; |
| PyObject *fmt_spec; |
| PyObject *func; |
| uint32_t func_version; |
| PyObject *getattribute; |
| PyObject *kwargs; |
| PyObject *kwdefaults; |
| PyObject *len_o; |
| PyObject *match; |
| PyObject *match_type; |
| PyObject *method; |
| PyObject *mgr; |
| Py_ssize_t min_args; |
| PyObject *names; |
| PyObject *new_exc; |
| PyObject *next; |
| PyObject *none; |
| PyObject *null; |
| PyObject *prev_exc; |
| PyObject *receiver; |
| PyObject *rest; |
| int result; |
| PyObject *self; |
| PyObject *seq; |
| PyObject *slice; |
| PyObject *step; |
| PyObject *subject; |
| PyObject *top; |
| PyObject *type; |
| PyObject *typevars; |
| PyObject *val0; |
| PyObject *val1; |
| int values_or_none; |
| |
| switch (opcode) { |
| |
| // BEGIN BYTECODES // |
| |
| // Override an op |
| override op(_CHECK_PERIODIC_IF_NOT_YIELD_FROM, (--)) { |
| Test_EvalFrame_Resumes++; |
| if ((oparg & RESUME_OPARG_LOCATION_MASK) < RESUME_AFTER_YIELD_FROM) { |
| int err = check_periodics(tstate); |
| ERROR_IF(err != 0); |
| } |
| } |
| |
| // Override an inst |
| override inst(LOAD_CONST, (-- value)) { |
| Test_EvalFrame_Loads++; |
| PyObject *obj = GETITEM(FRAME_CO_CONSTS, oparg); |
| value = PyStackRef_FromPyObjectBorrow(obj); |
| } |
| |
| |
| // END BYTECODES // |
| |
| } |
| dispatch_opcode: |
| error: |
| exception_unwind: |
| exit_unwind: |
| handle_eval_breaker: |
| resume_frame: |
| start_frame: |
| unbound_local_error: |
| ; |
| } |
| |
| // Future families go below this point // |