cpython: 17d3bbde60d2 (original) (raw)
--- a/Include/opcode.h +++ b/Include/opcode.h @@ -37,12 +37,21 @@ extern "C" { #define SLICE 30 /* Also uses 31-33 / +#define SLICE_1 31 +#define SLICE_2 32 +#define SLICE_3 33 #define STORE_SLICE 40 / Also uses 41-43 / +#define STORE_SLICE_1 41 +#define STORE_SLICE_2 42 +#define STORE_SLICE_3 43 #define DELETE_SLICE 50 / Also uses 51-53 */ +#define DELETE_SLICE_1 51 +#define DELETE_SLICE_2 52 +#define DELETE_SLICE_3 53 #define STORE_MAP 54 #define INPLACE_ADD 55
--- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -300,6 +300,16 @@ ASDLGEN= $(srcdir)/Parser/asdl_c.py ##########################################################################
Python
+ +OPCODETARGETS_H= [](#l2.8) + $(srcdir)/Python/opcode_targets.h + +OPCODETARGETGEN= [](#l2.11) + $(srcdir)/Python/makeopcodetargets.py + +OPCODETARGETGEN_FILES= [](#l2.14) + (OPCODETARGETGEN)(OPCODETARGETGEN) (OPCODETARGETGEN)(srcdir)/Lib/opcode.py + PYTHON_OBJS= [](#l2.17) Python/_warnings.o [](#l2.18) Python/Python-ast.o [](#l2.19) @@ -671,6 +681,11 @@ Objects/bytearrayobject.o: $(srcdir)/Obj Objects/stringobject.o: $(srcdir)/Objects/stringobject.c [](#l2.21) $(STRINGLIB_HEADERS) +$(OPCODETARGETS_H): $(OPCODETARGETGEN_FILES)
- (OPCODETARGETGEN)(OPCODETARGETGEN) (OPCODETARGETGEN)(OPCODETARGETS_H) + +Python/ceval.o: $(OPCODETARGETS_H) + Python/formatter_unicode.o: $(srcdir)/Python/formatter_unicode.c [](#l2.29) $(STRINGLIB_HEADERS)
--- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ What's New in Python 2.7.11? Core and Builtins ----------------- +- Issue #4753: On compilers where it is supported, use "computed gotos" for
--- a/Python/ceval.c +++ b/Python/ceval.c @@ -688,6 +688,100 @@ PyEval_EvalFrame(PyFrameObject *f) { PyObject * PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) { +#ifdef DYNAMIC_EXECUTION_PROFILE
+#endif +#ifdef HAVE_COMPUTED_GOTOS
- #if defined(USE_COMPUTED_GOTOS) && USE_COMPUTED_GOTOS
- #error "Computed gotos are not supported on this compiler."
- #endif
- #undef USE_COMPUTED_GOTOS
- #define USE_COMPUTED_GOTOS 0
+#endif +#if USE_COMPUTED_GOTOS +/* Import the static jump table */ +#include "opcode_targets.h" +
- /* This macro is used when several opcodes defer to the same implementation
- (e.g. SETUP_LOOP, SETUP_FINALLY) */ +#define TARGET_WITH_IMPL(op, impl) [](#l4.27)
TARGET_##op: \[](#l4.28)
opcode = op; \[](#l4.29)
oparg = NEXTARG(); \[](#l4.30)
case op: \[](#l4.31)
goto impl; \[](#l4.32)
+
+#define TARGET_WITH_IMPL_NOARG(op, impl) [](#l4.34)
+ TARGET_##op: [](#l4.35)
+ opcode = op; [](#l4.36)
+ case op: [](#l4.37)
+ goto impl; [](#l4.38)
+
+#define TARGET_NOARG(op) [](#l4.40)
+ TARGET_##op: [](#l4.41)
+ opcode = op; [](#l4.42)
+ case op:[](#l4.43)
+
+#define TARGET(op) [](#l4.45)
+ TARGET_##op: [](#l4.46)
+ opcode = op; [](#l4.47)
+ oparg = NEXTARG(); [](#l4.48)
+ case op:[](#l4.49)
+
+
+#define DISPATCH() [](#l4.52)
+ { [](#l4.53)
+ int tick = Py_Ticker - 1; [](#l4.54)
+ Py_Ticker = tick; [](#l4.55)
+ if (tick >= 0) { [](#l4.56)
+ FAST_DISPATCH(); [](#l4.57)
+ } [](#l4.58)
+ continue; [](#l4.59)
+ }
+
+#ifdef LLTRACE
+#define FAST_DISPATCH() [](#l4.63)
+ { [](#l4.64)
+ if (!lltrace && !Py_TracingPossible) { [](#l4.65)
+ f->f_lasti = INSTR_OFFSET(); [](#l4.66)
+ goto *opcode_targets[*next_instr++]; [](#l4.67)
+ } [](#l4.68)
+ goto fast_next_opcode; [](#l4.69)
+ }
+#else
+#define FAST_DISPATCH() { [](#l4.72)
+ if (!Py_TracingPossible) { [](#l4.73)
+ f->f_lasti = INSTR_OFFSET(); [](#l4.74)
+ goto *opcode_targets[next_instr++]; [](#l4.75)
+ } [](#l4.76)
+ goto fast_next_opcode;[](#l4.77)
+}
+#endif
+
+#else
+#define TARGET(op) [](#l4.82)
+ case op:
+#define TARGET_WITH_IMPL(op, impl) [](#l4.84)
+ / silence compiler warnings about impl
unused */ [](#l4.85)
+ if (0) goto impl; [](#l4.86)
+ case op:[](#l4.87)
+
+#define TARGET_NOARG(op) [](#l4.89)
+ case op:[](#l4.90)
+
+#define TARGET_WITH_IMPL_NOARG(op, impl) [](#l4.92)
+ if (0) goto impl; [](#l4.93)
+ case op:[](#l4.94)
+
+#define DISPATCH() continue
+#define FAST_DISPATCH() goto fast_next_opcode
+#endif
+
+
#ifdef DXPAIRS
int lastopcode = 0;
#endif
@@ -805,14 +899,23 @@ PyEval_EvalFrameEx(PyFrameObject *f, int
counter updates for both opcodes.
*/
+
+// Next opcode prediction is also enabled for Computed Gotos as well.
#ifdef DYNAMIC_EXECUTION_PROFILE
-#define PREDICT(op) if (0) goto PRED##op
+#define PREDICT(op) //if (0) goto PRED##op
+#define PREDICTED(op)
+#define PREDICTED_WITH_ARG(op)
#else
#define PREDICT(op) if (*next_instr == op) goto PRED##op
+#define PREDICTED(op) PRED##op: next_instr++
+#ifdef USE_COMPUTED_GOTOS
+#define PREDICTED_WITH_ARG(op) PRED##op: next_instr++
+#else
+#define PREDICTED_WITH_ARG(op) PRED##op: oparg = PEEKARG(); next_instr += 3
#endif
-
-#define PREDICTED(op) PRED##op: next_instr++
-#define PREDICTED_WITH_ARG(op) PRED_##op: oparg = PEEKARG(); next_instr += 3
+#endif
+
+
/* Stack manipulation macros */
@@ -1108,55 +1211,70 @@ PyEval_EvalFrameEx(PyFrameObject f, int
/ case STOP_CODE: this is an error! */
case NOP:[](#l4.136)
goto fast_next_opcode;[](#l4.137)
case LOAD_FAST:[](#l4.139)
TARGET_NOARG(NOP)[](#l4.140)
{[](#l4.141)
FAST_DISPATCH();[](#l4.142)
}[](#l4.143)
TARGET(LOAD_FAST)[](#l4.145)
{[](#l4.146) x = GETLOCAL(oparg);[](#l4.147) if (x != NULL) {[](#l4.148) Py_INCREF(x);[](#l4.149) PUSH(x);[](#l4.150)
goto fast_next_opcode;[](#l4.151)
FAST_DISPATCH();[](#l4.152) }[](#l4.153) format_exc_check_arg(PyExc_UnboundLocalError,[](#l4.154) UNBOUNDLOCAL_ERROR_MSG,[](#l4.155) PyTuple_GetItem(co->co_varnames, oparg));[](#l4.156) break;[](#l4.157)
case LOAD_CONST:[](#l4.159)
}[](#l4.160)
TARGET(LOAD_CONST)[](#l4.162)
{[](#l4.163) x = GETITEM(consts, oparg);[](#l4.164) Py_INCREF(x);[](#l4.165) PUSH(x);[](#l4.166)
goto fast_next_opcode;[](#l4.167)
FAST_DISPATCH();[](#l4.168)
}[](#l4.169)
PREDICTED_WITH_ARG(STORE_FAST);
case STORE_FAST:[](#l4.172)
TARGET(STORE_FAST)[](#l4.173)
{[](#l4.174) v = POP();[](#l4.175) SETLOCAL(oparg, v);[](#l4.176)
goto fast_next_opcode;[](#l4.177)
case POP_TOP:[](#l4.179)
FAST_DISPATCH();[](#l4.180)
}[](#l4.181)
TARGET_NOARG(POP_TOP)[](#l4.183)
{[](#l4.184) v = POP();[](#l4.185) Py_DECREF(v);[](#l4.186)
goto fast_next_opcode;[](#l4.187)
case ROT_TWO:[](#l4.189)
FAST_DISPATCH();[](#l4.190)
}[](#l4.191)
TARGET_NOARG(ROT_TWO)[](#l4.193)
{[](#l4.194) v = TOP();[](#l4.195) w = SECOND();[](#l4.196) SET_TOP(w);[](#l4.197) SET_SECOND(v);[](#l4.198)
goto fast_next_opcode;[](#l4.199)
case ROT_THREE:[](#l4.201)
FAST_DISPATCH();[](#l4.202)
}[](#l4.203)
TARGET_NOARG(ROT_THREE)[](#l4.205)
{[](#l4.206) v = TOP();[](#l4.207) w = SECOND();[](#l4.208) x = THIRD();[](#l4.209) SET_TOP(w);[](#l4.210) SET_SECOND(x);[](#l4.211) SET_THIRD(v);[](#l4.212)
goto fast_next_opcode;[](#l4.213)
case ROT_FOUR:[](#l4.215)
FAST_DISPATCH();[](#l4.216)
}[](#l4.217)
TARGET_NOARG(ROT_FOUR)[](#l4.219)
{[](#l4.220) u = TOP();[](#l4.221) v = SECOND();[](#l4.222) w = THIRD();[](#l4.223)
@@ -1165,15 +1283,21 @@ PyEval_EvalFrameEx(PyFrameObject *f, int SET_SECOND(w); SET_THIRD(x); SET_FOURTH(u);
goto fast_next_opcode;[](#l4.228)
case DUP_TOP:[](#l4.230)
FAST_DISPATCH();[](#l4.231)
}[](#l4.232)
[](#l4.234)
TARGET_NOARG(DUP_TOP)[](#l4.235)
{[](#l4.236) v = TOP();[](#l4.237) Py_INCREF(v);[](#l4.238) PUSH(v);[](#l4.239)
goto fast_next_opcode;[](#l4.240)
case DUP_TOPX:[](#l4.242)
FAST_DISPATCH();[](#l4.243)
}[](#l4.244)
TARGET(DUP_TOPX)[](#l4.247)
{[](#l4.248) if (oparg == 2) {[](#l4.249) x = TOP();[](#l4.250) Py_INCREF(x);[](#l4.251)
@@ -1182,7 +1306,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int STACKADJ(2); SET_TOP(x); SET_SECOND(w);
goto fast_next_opcode;[](#l4.256)
FAST_DISPATCH();[](#l4.257) } else if (oparg == 3) {[](#l4.258) x = TOP();[](#l4.259) Py_INCREF(x);[](#l4.260)
@@ -1194,84 +1318,100 @@ PyEval_EvalFrameEx(PyFrameObject *f, int SET_TOP(x); SET_SECOND(w); SET_THIRD(v);
goto fast_next_opcode;[](#l4.265)
FAST_DISPATCH();[](#l4.266) }[](#l4.267) Py_FatalError("invalid argument to DUP_TOPX"[](#l4.268) " (bytecode corruption?)");[](#l4.269) /* Never returns, so don't bother to set why. */[](#l4.270) break;[](#l4.271)
case UNARY_POSITIVE:[](#l4.273)
}[](#l4.274)
TARGET_NOARG(UNARY_POSITIVE)[](#l4.276)
{[](#l4.277) v = TOP();[](#l4.278) x = PyNumber_Positive(v);[](#l4.279) Py_DECREF(v);[](#l4.280) SET_TOP(x);[](#l4.281)
if (x != NULL) continue;[](#l4.282)
if (x != NULL) DISPATCH();[](#l4.283) break;[](#l4.284)
case UNARY_NEGATIVE:[](#l4.286)
}[](#l4.287)
TARGET_NOARG( UNARY_NEGATIVE)[](#l4.289)
{[](#l4.290) v = TOP();[](#l4.291) x = PyNumber_Negative(v);[](#l4.292) Py_DECREF(v);[](#l4.293) SET_TOP(x);[](#l4.294)
if (x != NULL) continue;[](#l4.295)
if (x != NULL) DISPATCH();[](#l4.296) break;[](#l4.297)
case UNARY_NOT:[](#l4.299)
}[](#l4.300)
TARGET_NOARG(UNARY_NOT)[](#l4.302)
{[](#l4.303) v = TOP();[](#l4.304) err = PyObject_IsTrue(v);[](#l4.305) Py_DECREF(v);[](#l4.306) if (err == 0) {[](#l4.307) Py_INCREF(Py_True);[](#l4.308) SET_TOP(Py_True);[](#l4.309)
continue;[](#l4.310)
DISPATCH();[](#l4.311) }[](#l4.312) else if (err > 0) {[](#l4.313) Py_INCREF(Py_False);[](#l4.314) SET_TOP(Py_False);[](#l4.315) err = 0;[](#l4.316)
continue;[](#l4.317)
DISPATCH();[](#l4.318) }[](#l4.319) STACKADJ(-1);[](#l4.320) break;[](#l4.321)
case UNARY_CONVERT:[](#l4.323)
}[](#l4.324)
TARGET_NOARG(UNARY_CONVERT)[](#l4.326)
{[](#l4.327) v = TOP();[](#l4.328) x = PyObject_Repr(v);[](#l4.329) Py_DECREF(v);[](#l4.330) SET_TOP(x);[](#l4.331)
if (x != NULL) continue;[](#l4.332)
if (x != NULL) DISPATCH();[](#l4.333) break;[](#l4.334)
case UNARY_INVERT:[](#l4.336)
}[](#l4.337)
TARGET_NOARG(UNARY_INVERT)[](#l4.339)
{[](#l4.340) v = TOP();[](#l4.341) x = PyNumber_Invert(v);[](#l4.342) Py_DECREF(v);[](#l4.343) SET_TOP(x);[](#l4.344)
if (x != NULL) continue;[](#l4.345)
if (x != NULL) DISPATCH();[](#l4.346) break;[](#l4.347)
case BINARY_POWER:[](#l4.349)
}[](#l4.350)
TARGET_NOARG(BINARY_POWER)[](#l4.352)
{[](#l4.353) w = POP();[](#l4.354) v = TOP();[](#l4.355) x = PyNumber_Power(v, w, Py_None);[](#l4.356) Py_DECREF(v);[](#l4.357) Py_DECREF(w);[](#l4.358) SET_TOP(x);[](#l4.359)
if (x != NULL) continue;[](#l4.360)
if (x != NULL) DISPATCH();[](#l4.361) break;[](#l4.362)
case BINARY_MULTIPLY:[](#l4.364)
}[](#l4.365)
TARGET_NOARG(BINARY_MULTIPLY)[](#l4.367)
{[](#l4.368) w = POP();[](#l4.369) v = TOP();[](#l4.370) x = PyNumber_Multiply(v, w);[](#l4.371) Py_DECREF(v);[](#l4.372) Py_DECREF(w);[](#l4.373) SET_TOP(x);[](#l4.374)
if (x != NULL) continue;[](#l4.375)
if(x!=NULL) DISPATCH();[](#l4.376) break;[](#l4.377)
case BINARY_DIVIDE:[](#l4.379)
}[](#l4.380)
TARGET_NOARG(BINARY_DIVIDE)[](#l4.382)
{[](#l4.383) if (!_Py_QnewFlag) {[](#l4.384) w = POP();[](#l4.385) v = TOP();[](#l4.386)
@@ -1279,32 +1419,37 @@ PyEval_EvalFrameEx(PyFrameObject *f, int Py_DECREF(v); Py_DECREF(w); SET_TOP(x);
if (x != NULL) continue;[](#l4.391)
if (x != NULL) DISPATCH();[](#l4.392) break;[](#l4.393) }[](#l4.394)
/* -Qnew is in effect: fall through to[](#l4.395)
BINARY_TRUE_DIVIDE */[](#l4.396)
case BINARY_TRUE_DIVIDE:[](#l4.397)
}[](#l4.398)
/* -Qnew is in effect: fall through to BINARY_TRUE_DIVIDE */[](#l4.399)
TARGET_NOARG(BINARY_TRUE_DIVIDE)[](#l4.400)
{[](#l4.401) w = POP();[](#l4.402) v = TOP();[](#l4.403) x = PyNumber_TrueDivide(v, w);[](#l4.404) Py_DECREF(v);[](#l4.405) Py_DECREF(w);[](#l4.406) SET_TOP(x);[](#l4.407)
if (x != NULL) continue;[](#l4.408)
if (x != NULL) DISPATCH();[](#l4.409) break;[](#l4.410)
case BINARY_FLOOR_DIVIDE:[](#l4.412)
}[](#l4.413)
TARGET_NOARG(BINARY_FLOOR_DIVIDE)[](#l4.415)
{[](#l4.416) w = POP();[](#l4.417) v = TOP();[](#l4.418) x = PyNumber_FloorDivide(v, w);[](#l4.419) Py_DECREF(v);[](#l4.420) Py_DECREF(w);[](#l4.421) SET_TOP(x);[](#l4.422)
if (x != NULL) continue;[](#l4.423)
if (x != NULL) DISPATCH();[](#l4.424) break;[](#l4.425)
case BINARY_MODULO:[](#l4.427)
}[](#l4.428)
TARGET_NOARG(BINARY_MODULO)[](#l4.430)
{[](#l4.431) w = POP();[](#l4.432) v = TOP();[](#l4.433) if (PyString_CheckExact(v))[](#l4.434)
@@ -1314,10 +1459,12 @@ PyEval_EvalFrameEx(PyFrameObject *f, int Py_DECREF(v); Py_DECREF(w); SET_TOP(x);
if (x != NULL) continue;[](#l4.439)
if (x != NULL) DISPATCH();[](#l4.440) break;[](#l4.441)
case BINARY_ADD:[](#l4.443)
}[](#l4.444)
TARGET_NOARG(BINARY_ADD)[](#l4.446)
{[](#l4.447) w = POP();[](#l4.448) v = TOP();[](#l4.449) if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {[](#l4.450)
@@ -1346,10 +1493,12 @@ PyEval_EvalFrameEx(PyFrameObject *f, int skip_decref_vx: Py_DECREF(w); SET_TOP(x);
if (x != NULL) continue;[](#l4.455)
if (x != NULL) DISPATCH();[](#l4.456) break;[](#l4.457)
case BINARY_SUBTRACT:[](#l4.459)
}[](#l4.460)
TARGET_NOARG(BINARY_SUBTRACT)[](#l4.462)
{[](#l4.463) w = POP();[](#l4.464) v = TOP();[](#l4.465) if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {[](#l4.466)
@@ -1371,10 +1520,12 @@ PyEval_EvalFrameEx(PyFrameObject *f, int Py_DECREF(v); Py_DECREF(w); SET_TOP(x);
if (x != NULL) continue;[](#l4.471)
if (x != NULL) DISPATCH();[](#l4.472) break;[](#l4.473)
case BINARY_SUBSCR:[](#l4.475)
}[](#l4.476)
TARGET_NOARG(BINARY_SUBSCR)[](#l4.478)
{[](#l4.479) w = POP();[](#l4.480) v = TOP();[](#l4.481) if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {[](#l4.482)
@@ -1395,102 +1546,122 @@ PyEval_EvalFrameEx(PyFrameObject *f, int Py_DECREF(v); Py_DECREF(w); SET_TOP(x);
if (x != NULL) continue;[](#l4.487)
if (x != NULL) DISPATCH();[](#l4.488) break;[](#l4.489)
case BINARY_LSHIFT:[](#l4.491)
}[](#l4.492)
TARGET_NOARG(BINARY_LSHIFT)[](#l4.494)
{[](#l4.495) w = POP();[](#l4.496) v = TOP();[](#l4.497) x = PyNumber_Lshift(v, w);[](#l4.498) Py_DECREF(v);[](#l4.499) Py_DECREF(w);[](#l4.500) SET_TOP(x);[](#l4.501)
if (x != NULL) continue;[](#l4.502)
if (x != NULL) DISPATCH();[](#l4.503) break;[](#l4.504)
case BINARY_RSHIFT:[](#l4.506)
}[](#l4.507)
TARGET_NOARG(BINARY_RSHIFT)[](#l4.509)
{[](#l4.510) w = POP();[](#l4.511) v = TOP();[](#l4.512) x = PyNumber_Rshift(v, w);[](#l4.513) Py_DECREF(v);[](#l4.514) Py_DECREF(w);[](#l4.515) SET_TOP(x);[](#l4.516)
if (x != NULL) continue;[](#l4.517)
if (x != NULL) DISPATCH();[](#l4.518) break;[](#l4.519)
case BINARY_AND:[](#l4.521)
}[](#l4.522)
TARGET_NOARG(BINARY_AND)[](#l4.524)
{[](#l4.525) w = POP();[](#l4.526) v = TOP();[](#l4.527) x = PyNumber_And(v, w);[](#l4.528) Py_DECREF(v);[](#l4.529) Py_DECREF(w);[](#l4.530) SET_TOP(x);[](#l4.531)
if (x != NULL) continue;[](#l4.532)
if (x != NULL) DISPATCH();[](#l4.533) break;[](#l4.534)
case BINARY_XOR:[](#l4.536)
}[](#l4.537)
TARGET_NOARG(BINARY_XOR)[](#l4.539)
{[](#l4.540) w = POP();[](#l4.541) v = TOP();[](#l4.542) x = PyNumber_Xor(v, w);[](#l4.543) Py_DECREF(v);[](#l4.544) Py_DECREF(w);[](#l4.545) SET_TOP(x);[](#l4.546)
if (x != NULL) continue;[](#l4.547)
if (x != NULL) DISPATCH();[](#l4.548) break;[](#l4.549)
case BINARY_OR:[](#l4.551)
}[](#l4.552)
TARGET_NOARG(BINARY_OR)[](#l4.554)
{[](#l4.555) w = POP();[](#l4.556) v = TOP();[](#l4.557) x = PyNumber_Or(v, w);[](#l4.558) Py_DECREF(v);[](#l4.559) Py_DECREF(w);[](#l4.560) SET_TOP(x);[](#l4.561)
if (x != NULL) continue;[](#l4.562)
if (x != NULL) DISPATCH();[](#l4.563) break;[](#l4.564)
case LIST_APPEND:[](#l4.566)
}[](#l4.567)
TARGET(LIST_APPEND)[](#l4.569)
{[](#l4.570) w = POP();[](#l4.571) v = PEEK(oparg);[](#l4.572) err = PyList_Append(v, w);[](#l4.573) Py_DECREF(w);[](#l4.574) if (err == 0) {[](#l4.575) PREDICT(JUMP_ABSOLUTE);[](#l4.576)
continue;[](#l4.577)
DISPATCH();[](#l4.578) }[](#l4.579) break;[](#l4.580)
case SET_ADD:[](#l4.582)
}[](#l4.583)
TARGET(SET_ADD)[](#l4.585)
{[](#l4.586) w = POP();[](#l4.587) v = stack_pointer[-oparg];[](#l4.588) err = PySet_Add(v, w);[](#l4.589) Py_DECREF(w);[](#l4.590) if (err == 0) {[](#l4.591) PREDICT(JUMP_ABSOLUTE);[](#l4.592)
continue;[](#l4.593)
DISPATCH();[](#l4.594) }[](#l4.595) break;[](#l4.596)
case INPLACE_POWER:[](#l4.598)
}[](#l4.599)
TARGET_NOARG(INPLACE_POWER)[](#l4.601)
{[](#l4.602) w = POP();[](#l4.603) v = TOP();[](#l4.604) x = PyNumber_InPlacePower(v, w, Py_None);[](#l4.605) Py_DECREF(v);[](#l4.606) Py_DECREF(w);[](#l4.607) SET_TOP(x);[](#l4.608)
if (x != NULL) continue;[](#l4.609)
if (x != NULL) DISPATCH();[](#l4.610) break;[](#l4.611)
case INPLACE_MULTIPLY:[](#l4.613)
}[](#l4.614)
TARGET_NOARG(INPLACE_MULTIPLY)[](#l4.616)
{[](#l4.617) w = POP();[](#l4.618) v = TOP();[](#l4.619) x = PyNumber_InPlaceMultiply(v, w);[](#l4.620) Py_DECREF(v);[](#l4.621) Py_DECREF(w);[](#l4.622) SET_TOP(x);[](#l4.623)
if (x != NULL) continue;[](#l4.624)
if (x != NULL) DISPATCH();[](#l4.625) break;[](#l4.626)
case INPLACE_DIVIDE:[](#l4.628)
}[](#l4.629)
TARGET_NOARG(INPLACE_DIVIDE)[](#l4.631)
{[](#l4.632) if (!_Py_QnewFlag) {[](#l4.633) w = POP();[](#l4.634) v = TOP();[](#l4.635)
@@ -1498,42 +1669,50 @@ PyEval_EvalFrameEx(PyFrameObject *f, int Py_DECREF(v); Py_DECREF(w); SET_TOP(x);
if (x != NULL) continue;[](#l4.640)
if (x != NULL) DISPATCH();[](#l4.641) break;[](#l4.642) }[](#l4.643)
}[](#l4.644) /* -Qnew is in effect: fall through to[](#l4.645) INPLACE_TRUE_DIVIDE */[](#l4.646)
case INPLACE_TRUE_DIVIDE:[](#l4.647)
TARGET_NOARG(INPLACE_TRUE_DIVIDE)[](#l4.648)
{[](#l4.649) w = POP();[](#l4.650) v = TOP();[](#l4.651) x = PyNumber_InPlaceTrueDivide(v, w);[](#l4.652) Py_DECREF(v);[](#l4.653) Py_DECREF(w);[](#l4.654) SET_TOP(x);[](#l4.655)
if (x != NULL) continue;[](#l4.656)
if (x != NULL) DISPATCH();[](#l4.657) break;[](#l4.658)
case INPLACE_FLOOR_DIVIDE:[](#l4.660)
}[](#l4.661)
TARGET_NOARG(INPLACE_FLOOR_DIVIDE)[](#l4.663)
{[](#l4.664) w = POP();[](#l4.665) v = TOP();[](#l4.666) x = PyNumber_InPlaceFloorDivide(v, w);[](#l4.667) Py_DECREF(v);[](#l4.668) Py_DECREF(w);[](#l4.669) SET_TOP(x);[](#l4.670)
if (x != NULL) continue;[](#l4.671)
if (x != NULL) DISPATCH();[](#l4.672) break;[](#l4.673)
case INPLACE_MODULO:[](#l4.675)
}[](#l4.676)
TARGET_NOARG(INPLACE_MODULO)[](#l4.678)
{[](#l4.679) w = POP();[](#l4.680) v = TOP();[](#l4.681) x = PyNumber_InPlaceRemainder(v, w);[](#l4.682) Py_DECREF(v);[](#l4.683) Py_DECREF(w);[](#l4.684) SET_TOP(x);[](#l4.685)
if (x != NULL) continue;[](#l4.686)
if (x != NULL) DISPATCH();[](#l4.687) break;[](#l4.688)
case INPLACE_ADD:[](#l4.690)
}[](#l4.691)
TARGET_NOARG(INPLACE_ADD)[](#l4.693)
{[](#l4.694) w = POP();[](#l4.695) v = TOP();[](#l4.696) if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {[](#l4.697)
@@ -1560,10 +1739,12 @@ PyEval_EvalFrameEx(PyFrameObject *f, int skip_decref_v: Py_DECREF(w); SET_TOP(x);
if (x != NULL) continue;[](#l4.702)
if (x != NULL) DISPATCH();[](#l4.703) break;[](#l4.704)
case INPLACE_SUBTRACT:[](#l4.706)
}[](#l4.707)
TARGET_NOARG(INPLACE_SUBTRACT)[](#l4.709)
{[](#l4.710) w = POP();[](#l4.711) v = TOP();[](#l4.712) if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {[](#l4.713)
@@ -1583,63 +1764,78 @@ PyEval_EvalFrameEx(PyFrameObject *f, int Py_DECREF(v); Py_DECREF(w); SET_TOP(x);
if (x != NULL) continue;[](#l4.718)
if (x != NULL) DISPATCH();[](#l4.719) break;[](#l4.720)
case INPLACE_LSHIFT:[](#l4.722)
}[](#l4.723)
TARGET_NOARG(INPLACE_LSHIFT)[](#l4.725)
{[](#l4.726) w = POP();[](#l4.727) v = TOP();[](#l4.728) x = PyNumber_InPlaceLshift(v, w);[](#l4.729) Py_DECREF(v);[](#l4.730) Py_DECREF(w);[](#l4.731) SET_TOP(x);[](#l4.732)
if (x != NULL) continue;[](#l4.733)
if (x != NULL) DISPATCH();[](#l4.734) break;[](#l4.735)
case INPLACE_RSHIFT:[](#l4.737)
}[](#l4.738)
TARGET_NOARG(INPLACE_RSHIFT)[](#l4.740)
{[](#l4.741) w = POP();[](#l4.742) v = TOP();[](#l4.743) x = PyNumber_InPlaceRshift(v, w);[](#l4.744) Py_DECREF(v);[](#l4.745) Py_DECREF(w);[](#l4.746) SET_TOP(x);[](#l4.747)
if (x != NULL) continue;[](#l4.748)
if (x != NULL) DISPATCH();[](#l4.749) break;[](#l4.750)
case INPLACE_AND:[](#l4.752)
}[](#l4.753)
TARGET_NOARG(INPLACE_AND)[](#l4.755)
{[](#l4.756) w = POP();[](#l4.757) v = TOP();[](#l4.758) x = PyNumber_InPlaceAnd(v, w);[](#l4.759) Py_DECREF(v);[](#l4.760) Py_DECREF(w);[](#l4.761) SET_TOP(x);[](#l4.762)
if (x != NULL) continue;[](#l4.763)
if (x != NULL) DISPATCH();[](#l4.764) break;[](#l4.765)
case INPLACE_XOR:[](#l4.767)
}[](#l4.768)
TARGET_NOARG(INPLACE_XOR)[](#l4.770)
{[](#l4.771) w = POP();[](#l4.772) v = TOP();[](#l4.773) x = PyNumber_InPlaceXor(v, w);[](#l4.774) Py_DECREF(v);[](#l4.775) Py_DECREF(w);[](#l4.776) SET_TOP(x);[](#l4.777)
if (x != NULL) continue;[](#l4.778)
if (x != NULL) DISPATCH();[](#l4.779) break;[](#l4.780)
case INPLACE_OR:[](#l4.782)
}[](#l4.783)
TARGET_NOARG(INPLACE_OR)[](#l4.785)
{[](#l4.786) w = POP();[](#l4.787) v = TOP();[](#l4.788) x = PyNumber_InPlaceOr(v, w);[](#l4.789) Py_DECREF(v);[](#l4.790) Py_DECREF(w);[](#l4.791) SET_TOP(x);[](#l4.792)
if (x != NULL) continue;[](#l4.793)
if (x != NULL) DISPATCH();[](#l4.794) break;[](#l4.795)
case SLICE+0:[](#l4.797)
case SLICE+1:[](#l4.798)
case SLICE+2:[](#l4.799)
case SLICE+3:[](#l4.800)
}[](#l4.801)
[](#l4.804)
TARGET_WITH_IMPL_NOARG(SLICE, _slice)[](#l4.805)
TARGET_WITH_IMPL_NOARG(SLICE_1, _slice)[](#l4.806)
TARGET_WITH_IMPL_NOARG(SLICE_2, _slice)[](#l4.807)
TARGET_WITH_IMPL_NOARG(SLICE_3, _slice)[](#l4.808)
_slice:[](#l4.809)
{[](#l4.810) if ((opcode-SLICE) & 2)[](#l4.811) w = POP();[](#l4.812) else[](#l4.813)
@@ -1654,13 +1850,17 @@ PyEval_EvalFrameEx(PyFrameObject *f, int Py_XDECREF(v); Py_XDECREF(w); SET_TOP(x);
if (x != NULL) continue;[](#l4.818)
if (x != NULL) DISPATCH();[](#l4.819) break;[](#l4.820)
case STORE_SLICE+0:[](#l4.822)
case STORE_SLICE+1:[](#l4.823)
case STORE_SLICE+2:[](#l4.824)
case STORE_SLICE+3:[](#l4.825)
}[](#l4.826)
[](#l4.828)
TARGET_WITH_IMPL_NOARG(STORE_SLICE, _store_slice)[](#l4.829)
TARGET_WITH_IMPL_NOARG(STORE_SLICE_1, _store_slice)[](#l4.830)
TARGET_WITH_IMPL_NOARG(STORE_SLICE_2, _store_slice)[](#l4.831)
TARGET_WITH_IMPL_NOARG(STORE_SLICE_3, _store_slice)[](#l4.832)
_store_slice:[](#l4.833)
{[](#l4.834) if ((opcode-STORE_SLICE) & 2)[](#l4.835) w = POP();[](#l4.836) else[](#l4.837)
@@ -1676,13 +1876,17 @@ PyEval_EvalFrameEx(PyFrameObject *f, int Py_DECREF(u); Py_XDECREF(v); Py_XDECREF(w);
if (err == 0) continue;[](#l4.842)
if (err == 0) DISPATCH();[](#l4.843) break;[](#l4.844)
case DELETE_SLICE+0:[](#l4.846)
case DELETE_SLICE+1:[](#l4.847)
case DELETE_SLICE+2:[](#l4.848)
case DELETE_SLICE+3:[](#l4.849)
}[](#l4.850)
TARGET_WITH_IMPL_NOARG(DELETE_SLICE, _delete_slice)[](#l4.853)
TARGET_WITH_IMPL_NOARG(DELETE_SLICE_1, _delete_slice)[](#l4.854)
TARGET_WITH_IMPL_NOARG(DELETE_SLICE_2, _delete_slice)[](#l4.855)
TARGET_WITH_IMPL_NOARG(DELETE_SLICE_3, _delete_slice)[](#l4.856)
_delete_slice:[](#l4.857)
{[](#l4.858) if ((opcode-DELETE_SLICE) & 2)[](#l4.859) w = POP();[](#l4.860) else[](#l4.861)
@@ -1697,10 +1901,12 @@ PyEval_EvalFrameEx(PyFrameObject *f, int Py_DECREF(u); Py_XDECREF(v); Py_XDECREF(w);
if (err == 0) continue;[](#l4.866)
if (err == 0) DISPATCH();[](#l4.867) break;[](#l4.868)
case STORE_SUBSCR:[](#l4.870)
}[](#l4.871)
TARGET_NOARG(STORE_SUBSCR)[](#l4.873)
{[](#l4.874) w = TOP();[](#l4.875) v = SECOND();[](#l4.876) u = THIRD();[](#l4.877)
@@ -1710,10 +1916,12 @@ PyEval_EvalFrameEx(PyFrameObject *f, int Py_DECREF(u); Py_DECREF(v); Py_DECREF(w);
if (err == 0) continue;[](#l4.882)
if (err == 0) DISPATCH();[](#l4.883) break;[](#l4.884)
case DELETE_SUBSCR:[](#l4.886)
}[](#l4.887)
TARGET_NOARG(DELETE_SUBSCR)[](#l4.889)
{[](#l4.890) w = TOP();[](#l4.891) v = SECOND();[](#l4.892) STACKADJ(-2);[](#l4.893)
@@ -1721,10 +1929,12 @@ PyEval_EvalFrameEx(PyFrameObject *f, int err = PyObject_DelItem(v, w); Py_DECREF(v); Py_DECREF(w);
if (err == 0) continue;[](#l4.898)
if (err == 0) DISPATCH();[](#l4.899) break;[](#l4.900)
case PRINT_EXPR:[](#l4.902)
}[](#l4.903)
TARGET_NOARG(PRINT_EXPR)[](#l4.905)
{[](#l4.906) v = POP();[](#l4.907) w = PySys_GetObject("displayhook");[](#l4.908) if (w == NULL) {[](#l4.909)
@@ -1747,12 +1957,16 @@ PyEval_EvalFrameEx(PyFrameObject *f, int Py_DECREF(v); Py_XDECREF(x); break; -
case PRINT_ITEM_TO:[](#l4.915)
}[](#l4.916)
TARGET_NOARG(PRINT_ITEM_TO)[](#l4.918)
{[](#l4.919) w = stream = POP();[](#l4.920) /* fall through to PRINT_ITEM */[](#l4.921)
case PRINT_ITEM:[](#l4.923)
}[](#l4.924)
TARGET_NOARG(PRINT_ITEM)[](#l4.926)
{[](#l4.927) v = POP();[](#l4.928) if (stream == NULL || stream == Py_None) {[](#l4.929) w = PySys_GetObject("stdout");[](#l4.930)
@@ -1798,16 +2012,20 @@ PyEval_EvalFrameEx(PyFrameObject *f, int Py_DECREF(v); Py_XDECREF(stream); stream = NULL;
if (err == 0)[](#l4.935)
continue;[](#l4.936)
if (err == 0) DISPATCH();[](#l4.937) break;[](#l4.938)
case PRINT_NEWLINE_TO:[](#l4.940)
}[](#l4.941)
TARGET_NOARG(PRINT_NEWLINE_TO)[](#l4.943)
{[](#l4.944) w = stream = POP();[](#l4.945) /* fall through to PRINT_NEWLINE */[](#l4.946)
case PRINT_NEWLINE:[](#l4.948)
if (stream == NULL || stream == Py_None) {[](#l4.949)
}[](#l4.950)
TARGET_NOARG(PRINT_NEWLINE)[](#l4.952)
{[](#l4.953)
if (stream == NULL || stream == Py_None)[](#l4.954)
{[](#l4.955) w = PySys_GetObject("stdout");[](#l4.956) if (w == NULL) {[](#l4.957) PyErr_SetString(PyExc_RuntimeError,[](#l4.958)
@@ -1827,12 +2045,14 @@ PyEval_EvalFrameEx(PyFrameObject *f, int Py_XDECREF(stream); stream = NULL; break; -
}[](#l4.964)
#ifdef CASE_TOO_BIG default: switch (opcode) { #endif
case RAISE_VARARGS:[](#l4.969)
TARGET(RAISE_VARARGS)[](#l4.971)
{[](#l4.972) u = v = w = NULL;[](#l4.973) switch (oparg) {[](#l4.974) case 3:[](#l4.975)
@@ -1853,28 +2073,37 @@ PyEval_EvalFrameEx(PyFrameObject *f, int break; } break; -
case LOAD_LOCALS:[](#l4.981)
if ((x = f->f_locals) != NULL) {[](#l4.982)
}[](#l4.983)
TARGET_NOARG(LOAD_LOCALS)[](#l4.985)
{[](#l4.986)
if ((x = f->f_locals) != NULL)[](#l4.987)
{[](#l4.988) Py_INCREF(x);[](#l4.989) PUSH(x);[](#l4.990)
continue;[](#l4.991)
DISPATCH();[](#l4.992) }[](#l4.993) PyErr_SetString(PyExc_SystemError, "no locals");[](#l4.994) break;[](#l4.995)
case RETURN_VALUE:[](#l4.997)
}[](#l4.998)
TARGET_NOARG(RETURN_VALUE)[](#l4.1000)
{[](#l4.1001) retval = POP();[](#l4.1002) why = WHY_RETURN;[](#l4.1003) goto fast_block_end;[](#l4.1004)
case YIELD_VALUE:[](#l4.1006)
}[](#l4.1007)
TARGET_NOARG(YIELD_VALUE)[](#l4.1009)
{[](#l4.1010) retval = POP();[](#l4.1011) f->f_stacktop = stack_pointer;[](#l4.1012) why = WHY_YIELD;[](#l4.1013) goto fast_yield;[](#l4.1014)
case EXEC_STMT:[](#l4.1016)
}[](#l4.1017)
TARGET_NOARG(EXEC_STMT)[](#l4.1019)
{[](#l4.1020) w = TOP();[](#l4.1021) v = SECOND();[](#l4.1022) u = THIRD();[](#l4.1023)
@@ -1886,8 +2115,10 @@ PyEval_EvalFrameEx(PyFrameObject *f, int Py_DECREF(v); Py_DECREF(w); break; -
case POP_BLOCK:[](#l4.1029)
}[](#l4.1030)
TARGET_NOARG(POP_BLOCK)[](#l4.1032)
{[](#l4.1033) {[](#l4.1034) PyTryBlock *b = PyFrame_BlockPop(f);[](#l4.1035) while (STACK_LEVEL() > b->b_level) {[](#l4.1036)
@@ -1895,10 +2126,12 @@ PyEval_EvalFrameEx(PyFrameObject *f, int Py_DECREF(v); } }
continue;[](#l4.1041)
DISPATCH();[](#l4.1042)
}[](#l4.1043)
case END_FINALLY:[](#l4.1046)
TARGET_NOARG(END_FINALLY)[](#l4.1047)
{[](#l4.1048) v = POP();[](#l4.1049) if (PyInt_Check(v)) {[](#l4.1050) why = (enum why_code) PyInt_AS_LONG(v);[](#l4.1051)
@@ -1922,8 +2155,10 @@ PyEval_EvalFrameEx(PyFrameObject *f, int } Py_DECREF(v); break; -
case BUILD_CLASS:[](#l4.1057)
}[](#l4.1058)
TARGET_NOARG(BUILD_CLASS)[](#l4.1060)
{[](#l4.1061) u = TOP();[](#l4.1062) v = SECOND();[](#l4.1063) w = THIRD();[](#l4.1064)
@@ -1934,8 +2169,10 @@ PyEval_EvalFrameEx(PyFrameObject *f, int Py_DECREF(v); Py_DECREF(w); break; -
case STORE_NAME:[](#l4.1070)
}[](#l4.1071)
TARGET(STORE_NAME)[](#l4.1073)
{[](#l4.1074) w = GETITEM(names, oparg);[](#l4.1075) v = POP();[](#l4.1076) if ((x = f->f_locals) != NULL) {[](#l4.1077)
@@ -1944,7 +2181,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int else err = PyObject_SetItem(x, w, v); Py_DECREF(v);
if (err == 0) continue;[](#l4.1082)
if (err == 0) DISPATCH();[](#l4.1083) break;[](#l4.1084) }[](#l4.1085) t = PyObject_Repr(w);[](#l4.1086)
@@ -1955,8 +2192,10 @@ PyEval_EvalFrameEx(PyFrameObject *f, int PyString_AS_STRING(t)); Py_DECREF(t); break; -
case DELETE_NAME:[](#l4.1092)
}[](#l4.1093)
TARGET(DELETE_NAME)[](#l4.1095)
{[](#l4.1096) w = GETITEM(names, oparg);[](#l4.1097) if ((x = f->f_locals) != NULL) {[](#l4.1098) if ((err = PyObject_DelItem(x, w)) != 0)[](#l4.1099)
@@ -1973,9 +2212,11 @@ PyEval_EvalFrameEx(PyFrameObject *f, int PyString_AS_STRING(w)); Py_DECREF(t); break;
}[](#l4.1104)
PREDICTED_WITH_ARG(UNPACK_SEQUENCE);
case UNPACK_SEQUENCE:[](#l4.1107)
TARGET(UNPACK_SEQUENCE)[](#l4.1108)
{[](#l4.1109) v = POP();[](#l4.1110) if (PyTuple_CheckExact(v) &&[](#l4.1111) PyTuple_GET_SIZE(v) == oparg) {[](#l4.1112)
@@ -1987,7 +2228,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int PUSH(w); } Py_DECREF(v);
continue;[](#l4.1117)
DISPATCH();[](#l4.1118) } else if (PyList_CheckExact(v) &&[](#l4.1119) PyList_GET_SIZE(v) == oparg) {[](#l4.1120) PyObject **items = \[](#l4.1121)
@@ -2006,8 +2247,11 @@ PyEval_EvalFrameEx(PyFrameObject *f, int } Py_DECREF(v); break; -
case STORE_ATTR:[](#l4.1127)
}[](#l4.1128)
TARGET(STORE_ATTR)[](#l4.1131)
{[](#l4.1132) w = GETITEM(names, oparg);[](#l4.1133) v = TOP();[](#l4.1134) u = SECOND();[](#l4.1135)
@@ -2015,33 +2259,42 @@ PyEval_EvalFrameEx(PyFrameObject f, int err = PyObject_SetAttr(v, w, u); / v.w = u */ Py_DECREF(v); Py_DECREF(u);
if (err == 0) continue;[](#l4.1140)
if (err == 0) DISPATCH();[](#l4.1141) break;[](#l4.1142)
case DELETE_ATTR:[](#l4.1144)
}[](#l4.1145)
TARGET(DELETE_ATTR)[](#l4.1147)
{[](#l4.1148) w = GETITEM(names, oparg);[](#l4.1149) v = POP();[](#l4.1150) err = PyObject_SetAttr(v, w, (PyObject *)NULL);[](#l4.1151) /* del v.w */[](#l4.1152) Py_DECREF(v);[](#l4.1153) break;[](#l4.1154)
case STORE_GLOBAL:[](#l4.1156)
}[](#l4.1157)
TARGET(STORE_GLOBAL)[](#l4.1160)
{[](#l4.1161) w = GETITEM(names, oparg);[](#l4.1162) v = POP();[](#l4.1163) err = PyDict_SetItem(f->f_globals, w, v);[](#l4.1164) Py_DECREF(v);[](#l4.1165)
if (err == 0) continue;[](#l4.1166)
if (err == 0) DISPATCH();[](#l4.1167) break;[](#l4.1168)
case DELETE_GLOBAL:[](#l4.1170)
}[](#l4.1171)
TARGET(DELETE_GLOBAL)[](#l4.1173)
{[](#l4.1174) w = GETITEM(names, oparg);[](#l4.1175) if ((err = PyDict_DelItem(f->f_globals, w)) != 0)[](#l4.1176) format_exc_check_arg([](#l4.1177) PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);[](#l4.1178) break;[](#l4.1179)
case LOAD_NAME:[](#l4.1181)
}[](#l4.1182)
TARGET(LOAD_NAME)[](#l4.1184)
{[](#l4.1185) w = GETITEM(names, oparg);[](#l4.1186) if ((v = f->f_locals) == NULL) {[](#l4.1187) why = WHY_EXCEPTION;[](#l4.1188)
@@ -2081,9 +2334,11 @@ PyEval_EvalFrameEx(PyFrameObject *f, int Py_INCREF(x); } PUSH(x);
continue;[](#l4.1193)
case LOAD_GLOBAL:[](#l4.1195)
DISPATCH();[](#l4.1196)
}[](#l4.1197)
TARGET(LOAD_GLOBAL)[](#l4.1199)
{[](#l4.1200) w = GETITEM(names, oparg);[](#l4.1201) if (PyString_CheckExact(w)) {[](#l4.1202) /* Inline the PyDict_GetItem() calls.[](#l4.1203)
@@ -2103,7 +2358,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int if (x != NULL) { Py_INCREF(x); PUSH(x);
continue;[](#l4.1208)
DISPATCH();[](#l4.1209) }[](#l4.1210) d = (PyDictObject *)(f->f_builtins);[](#l4.1211) e = d->ma_lookup(d, w, hash);[](#l4.1212)
@@ -2115,7 +2370,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int if (x != NULL) { Py_INCREF(x); PUSH(x);
continue;[](#l4.1217)
DISPATCH();[](#l4.1218) }[](#l4.1219) goto load_global_error;[](#l4.1220) }[](#l4.1221)
@@ -2134,13 +2389,15 @@ PyEval_EvalFrameEx(PyFrameObject *f, int } Py_INCREF(x); PUSH(x);
continue;[](#l4.1226)
case DELETE_FAST:[](#l4.1228)
DISPATCH();[](#l4.1229)
}[](#l4.1230)
TARGET(DELETE_FAST)[](#l4.1232)
{[](#l4.1233) x = GETLOCAL(oparg);[](#l4.1234) if (x != NULL) {[](#l4.1235) SETLOCAL(oparg, NULL);[](#l4.1236)
continue;[](#l4.1237)
DISPATCH();[](#l4.1238) }[](#l4.1239) format_exc_check_arg([](#l4.1240) PyExc_UnboundLocalError,[](#l4.1241)
@@ -2148,20 +2405,24 @@ PyEval_EvalFrameEx(PyFrameObject *f, int PyTuple_GetItem(co->co_varnames, oparg) ); break; -
case LOAD_CLOSURE:[](#l4.1247)
}[](#l4.1248)
TARGET(LOAD_CLOSURE)[](#l4.1250)
{[](#l4.1251) x = freevars[oparg];[](#l4.1252) Py_INCREF(x);[](#l4.1253) PUSH(x);[](#l4.1254)
if (x != NULL) continue;[](#l4.1255)
if (x != NULL) DISPATCH();[](#l4.1256) break;[](#l4.1257)
case LOAD_DEREF:[](#l4.1259)
}[](#l4.1260)
TARGET(LOAD_DEREF)[](#l4.1262)
{[](#l4.1263) x = freevars[oparg];[](#l4.1264) w = PyCell_Get(x);[](#l4.1265) if (w != NULL) {[](#l4.1266) PUSH(w);[](#l4.1267)
continue;[](#l4.1268)
DISPATCH();[](#l4.1269) }[](#l4.1270) err = -1;[](#l4.1271) /* Don't stomp existing exception */[](#l4.1272)
@@ -2181,15 +2442,19 @@ PyEval_EvalFrameEx(PyFrameObject *f, int UNBOUNDFREE_ERROR_MSG, v); } break; -
case STORE_DEREF:[](#l4.1278)
}[](#l4.1279)
TARGET(STORE_DEREF)[](#l4.1281)
{[](#l4.1282) w = POP();[](#l4.1283) x = freevars[oparg];[](#l4.1284) PyCell_Set(x, w);[](#l4.1285) Py_DECREF(w);[](#l4.1286)
continue;[](#l4.1287)
case BUILD_TUPLE:[](#l4.1289)
DISPATCH();[](#l4.1290)
}[](#l4.1291)
TARGET(BUILD_TUPLE)[](#l4.1293)
{[](#l4.1294) x = PyTuple_New(oparg);[](#l4.1295) if (x != NULL) {[](#l4.1296) for (; --oparg >= 0;) {[](#l4.1297)
@@ -2197,11 +2462,13 @@ PyEval_EvalFrameEx(PyFrameObject *f, int PyTuple_SET_ITEM(x, oparg, w); } PUSH(x);
continue;[](#l4.1302)
DISPATCH();[](#l4.1303) }[](#l4.1304) break;[](#l4.1305)
case BUILD_LIST:[](#l4.1307)
}[](#l4.1308)
TARGET(BUILD_LIST)[](#l4.1310)
{[](#l4.1311) x = PyList_New(oparg);[](#l4.1312) if (x != NULL) {[](#l4.1313) for (; --oparg >= 0;) {[](#l4.1314)
@@ -2209,11 +2476,13 @@ PyEval_EvalFrameEx(PyFrameObject *f, int PyList_SET_ITEM(x, oparg, w); } PUSH(x);
continue;[](#l4.1319)
DISPATCH();[](#l4.1320) }[](#l4.1321) break;[](#l4.1322)
case BUILD_SET:[](#l4.1324)
}[](#l4.1325)
TARGET(BUILD_SET)[](#l4.1327)
{[](#l4.1328) x = PySet_New(NULL);[](#l4.1329) if (x != NULL) {[](#l4.1330) for (; --oparg >= 0;) {[](#l4.1331)
@@ -2227,18 +2496,21 @@ PyEval_EvalFrameEx(PyFrameObject *f, int break; } PUSH(x);
continue;[](#l4.1336)
DISPATCH();[](#l4.1337) }[](#l4.1338) break;[](#l4.1339)
case BUILD_MAP:[](#l4.1342)
}[](#l4.1343)
TARGET(BUILD_MAP)[](#l4.1345)
{[](#l4.1346) x = _PyDict_NewPresized((Py_ssize_t)oparg);[](#l4.1347) PUSH(x);[](#l4.1348)
if (x != NULL) continue;[](#l4.1349)
if (x != NULL) DISPATCH();[](#l4.1350) break;[](#l4.1351)
case STORE_MAP:[](#l4.1353)
}[](#l4.1354)
TARGET_NOARG(STORE_MAP)[](#l4.1356)
{[](#l4.1357) w = TOP(); /* key */[](#l4.1358) u = SECOND(); /* value */[](#l4.1359) v = THIRD(); /* dict */[](#l4.1360)
@@ -2247,10 +2519,12 @@ PyEval_EvalFrameEx(PyFrameObject f, int err = PyDict_SetItem(v, w, u); / v[w] = u */ Py_DECREF(u); Py_DECREF(w);
if (err == 0) continue;[](#l4.1365)
if (err == 0) DISPATCH();[](#l4.1366) break;[](#l4.1367)
case MAP_ADD:[](#l4.1369)
}[](#l4.1370)
TARGET(MAP_ADD)[](#l4.1372)
{[](#l4.1373) w = TOP(); /* key */[](#l4.1374) u = SECOND(); /* value */[](#l4.1375) STACKADJ(-2);[](#l4.1376)
@@ -2261,20 +2535,24 @@ PyEval_EvalFrameEx(PyFrameObject *f, int Py_DECREF(w); if (err == 0) { PREDICT(JUMP_ABSOLUTE);
continue;[](#l4.1381)
DISPATCH();[](#l4.1382) }[](#l4.1383) break;[](#l4.1384)
case LOAD_ATTR:[](#l4.1386)
}[](#l4.1387)
TARGET(LOAD_ATTR)[](#l4.1389)
{[](#l4.1390) w = GETITEM(names, oparg);[](#l4.1391) v = TOP();[](#l4.1392) x = PyObject_GetAttr(v, w);[](#l4.1393) Py_DECREF(v);[](#l4.1394) SET_TOP(x);[](#l4.1395)
if (x != NULL) continue;[](#l4.1396)
if (x != NULL) DISPATCH();[](#l4.1397) break;[](#l4.1398)
case COMPARE_OP:[](#l4.1400)
}[](#l4.1401)
TARGET(COMPARE_OP)[](#l4.1403)
{[](#l4.1404) w = POP();[](#l4.1405) v = TOP();[](#l4.1406) if (PyInt_CheckExact(w) && PyInt_CheckExact(v)) {[](#l4.1407)
@@ -2307,9 +2585,11 @@ PyEval_EvalFrameEx(PyFrameObject *f, int if (x == NULL) break; PREDICT(POP_JUMP_IF_FALSE); PREDICT(POP_JUMP_IF_TRUE);
continue;[](#l4.1412)
case IMPORT_NAME:[](#l4.1414)
DISPATCH();[](#l4.1415)
}[](#l4.1416)
TARGET(IMPORT_NAME)[](#l4.1418)
{[](#l4.1419) w = GETITEM(names, oparg);[](#l4.1420) x = PyDict_GetItemString(f->f_builtins, "__import__");[](#l4.1421) if (x == NULL) {[](#l4.1422)
@@ -2350,10 +2630,12 @@ PyEval_EvalFrameEx(PyFrameObject *f, int READ_TIMESTAMP(intr1); Py_DECREF(w); SET_TOP(x);
if (x != NULL) continue;[](#l4.1427)
if (x != NULL) DISPATCH();[](#l4.1428) break;[](#l4.1429)
case IMPORT_STAR:[](#l4.1431)
}[](#l4.1432)
TARGET_NOARG(IMPORT_STAR)[](#l4.1434)
{[](#l4.1435) v = POP();[](#l4.1436) PyFrame_FastToLocals(f);[](#l4.1437) if ((x = f->f_locals) == NULL) {[](#l4.1438)
@@ -2366,34 +2648,40 @@ PyEval_EvalFrameEx(PyFrameObject *f, int READ_TIMESTAMP(intr1); PyFrame_LocalsToFast(f, 0); Py_DECREF(v);
if (err == 0) continue;[](#l4.1443)
if (err == 0) DISPATCH();[](#l4.1444) break;[](#l4.1445)
case IMPORT_FROM:[](#l4.1447)
}[](#l4.1448)
TARGET(IMPORT_FROM)[](#l4.1450)
{[](#l4.1451) w = GETITEM(names, oparg);[](#l4.1452) v = TOP();[](#l4.1453) READ_TIMESTAMP(intr0);[](#l4.1454) x = import_from(v, w);[](#l4.1455) READ_TIMESTAMP(intr1);[](#l4.1456) PUSH(x);[](#l4.1457)
if (x != NULL) continue;[](#l4.1458)
if (x != NULL) DISPATCH();[](#l4.1459) break;[](#l4.1460)
case JUMP_FORWARD:[](#l4.1462)
}[](#l4.1463)
TARGET(JUMP_FORWARD)[](#l4.1465)
{[](#l4.1466) JUMPBY(oparg);[](#l4.1467)
goto fast_next_opcode;[](#l4.1468)
FAST_DISPATCH();[](#l4.1469)
}[](#l4.1470)
PREDICTED_WITH_ARG(POP_JUMP_IF_FALSE);
case POP_JUMP_IF_FALSE:[](#l4.1473)
TARGET(POP_JUMP_IF_FALSE)[](#l4.1474)
{[](#l4.1475) w = POP();[](#l4.1476) if (w == Py_True) {[](#l4.1477) Py_DECREF(w);[](#l4.1478)
goto fast_next_opcode;[](#l4.1479)
FAST_DISPATCH();[](#l4.1480) }[](#l4.1481) if (w == Py_False) {[](#l4.1482) Py_DECREF(w);[](#l4.1483) JUMPTO(oparg);[](#l4.1484)
goto fast_next_opcode;[](#l4.1485)
FAST_DISPATCH();[](#l4.1486) }[](#l4.1487) err = PyObject_IsTrue(w);[](#l4.1488) Py_DECREF(w);[](#l4.1489)
@@ -2403,19 +2691,21 @@ PyEval_EvalFrameEx(PyFrameObject *f, int JUMPTO(oparg); else break;
continue;[](#l4.1494)
DISPATCH();[](#l4.1495)
}[](#l4.1496)
PREDICTED_WITH_ARG(POP_JUMP_IF_TRUE);
case POP_JUMP_IF_TRUE:[](#l4.1499)
TARGET(POP_JUMP_IF_TRUE)[](#l4.1500)
{[](#l4.1501) w = POP();[](#l4.1502) if (w == Py_False) {[](#l4.1503) Py_DECREF(w);[](#l4.1504)
goto fast_next_opcode;[](#l4.1505)
FAST_DISPATCH();[](#l4.1506) }[](#l4.1507) if (w == Py_True) {[](#l4.1508) Py_DECREF(w);[](#l4.1509) JUMPTO(oparg);[](#l4.1510)
goto fast_next_opcode;[](#l4.1511)
FAST_DISPATCH();[](#l4.1512) }[](#l4.1513) err = PyObject_IsTrue(w);[](#l4.1514) Py_DECREF(w);[](#l4.1515)
@@ -2427,18 +2717,20 @@ PyEval_EvalFrameEx(PyFrameObject *f, int ; else break;
continue;[](#l4.1520)
case JUMP_IF_FALSE_OR_POP:[](#l4.1522)
DISPATCH();[](#l4.1523)
}[](#l4.1524)
TARGET(JUMP_IF_FALSE_OR_POP)[](#l4.1526)
{[](#l4.1527) w = TOP();[](#l4.1528) if (w == Py_True) {[](#l4.1529) STACKADJ(-1);[](#l4.1530) Py_DECREF(w);[](#l4.1531)
goto fast_next_opcode;[](#l4.1532)
FAST_DISPATCH();[](#l4.1533) }[](#l4.1534) if (w == Py_False) {[](#l4.1535) JUMPTO(oparg);[](#l4.1536)
goto fast_next_opcode;[](#l4.1537)
FAST_DISPATCH();[](#l4.1538) }[](#l4.1539) err = PyObject_IsTrue(w);[](#l4.1540) if (err > 0) {[](#l4.1541)
@@ -2450,18 +2742,20 @@ PyEval_EvalFrameEx(PyFrameObject *f, int JUMPTO(oparg); else break;
continue;[](#l4.1546)
case JUMP_IF_TRUE_OR_POP:[](#l4.1548)
DISPATCH();[](#l4.1549)
}[](#l4.1550)
TARGET(JUMP_IF_TRUE_OR_POP)[](#l4.1552)
{[](#l4.1553) w = TOP();[](#l4.1554) if (w == Py_False) {[](#l4.1555) STACKADJ(-1);[](#l4.1556) Py_DECREF(w);[](#l4.1557)
goto fast_next_opcode;[](#l4.1558)
FAST_DISPATCH();[](#l4.1559) }[](#l4.1560) if (w == Py_True) {[](#l4.1561) JUMPTO(oparg);[](#l4.1562)
goto fast_next_opcode;[](#l4.1563)
FAST_DISPATCH();[](#l4.1564) }[](#l4.1565) err = PyObject_IsTrue(w);[](#l4.1566) if (err > 0) {[](#l4.1567)
@@ -2474,10 +2768,12 @@ PyEval_EvalFrameEx(PyFrameObject *f, int } else break;
continue;[](#l4.1572)
DISPATCH();[](#l4.1573)
}[](#l4.1574)
PREDICTED_WITH_ARG(JUMP_ABSOLUTE);
case JUMP_ABSOLUTE:[](#l4.1577)
TARGET(JUMP_ABSOLUTE)[](#l4.1578)
{[](#l4.1579) JUMPTO(oparg);[](#l4.1580)
#if FAST_LOOPS /* Enabling this path speeds-up all while and for-loops by bypassing @@ -2489,10 +2785,12 @@ PyEval_EvalFrameEx(PyFrameObject *f, int */ goto fast_next_opcode; #else
continue;[](#l4.1587)
DISPATCH();[](#l4.1588)
case GET_ITER:[](#l4.1591)
}[](#l4.1592)
TARGET_NOARG(GET_ITER)[](#l4.1594)
{[](#l4.1595) /* before: [obj]; after [getiter(obj)] */[](#l4.1596) v = TOP();[](#l4.1597) x = PyObject_GetIter(v);[](#l4.1598)
@@ -2500,13 +2798,15 @@ PyEval_EvalFrameEx(PyFrameObject *f, int if (x != NULL) { SET_TOP(x); PREDICT(FOR_ITER);
continue;[](#l4.1603)
DISPATCH();[](#l4.1604) }[](#l4.1605) STACKADJ(-1);[](#l4.1606) break;[](#l4.1607)
}[](#l4.1608)
case FOR_ITER:[](#l4.1611)
TARGET(FOR_ITER)[](#l4.1612)
{[](#l4.1613) /* before: [iter]; after: [iter, iter()] *or* [] */[](#l4.1614) v = TOP();[](#l4.1615) x = (*v->ob_type->tp_iternext)(v);[](#l4.1616)
@@ -2514,7 +2814,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int PUSH(x); PREDICT(STORE_FAST); PREDICT(UNPACK_SEQUENCE);
continue;[](#l4.1621)
DISPATCH();[](#l4.1622) }[](#l4.1623) if (PyErr_Occurred()) {[](#l4.1624) if (!PyErr_ExceptionMatches([](#l4.1625)
@@ -2526,13 +2826,17 @@ PyEval_EvalFrameEx(PyFrameObject *f, int x = v = POP(); Py_DECREF(v); JUMPBY(oparg);
continue;[](#l4.1630)
case BREAK_LOOP:[](#l4.1632)
DISPATCH();[](#l4.1633)
}[](#l4.1634)
TARGET_NOARG(BREAK_LOOP)[](#l4.1636)
{[](#l4.1637) why = WHY_BREAK;[](#l4.1638) goto fast_block_end;[](#l4.1639)
case CONTINUE_LOOP:[](#l4.1641)
}[](#l4.1642)
TARGET(CONTINUE_LOOP)[](#l4.1644)
{[](#l4.1645) retval = PyInt_FromLong(oparg);[](#l4.1646) if (!retval) {[](#l4.1647) x = NULL;[](#l4.1648)
@@ -2540,10 +2844,13 @@ PyEval_EvalFrameEx(PyFrameObject *f, int } why = WHY_CONTINUE; goto fast_block_end; -
case SETUP_LOOP:[](#l4.1654)
case SETUP_EXCEPT:[](#l4.1655)
case SETUP_FINALLY:[](#l4.1656)
}[](#l4.1657)
TARGET_WITH_IMPL(SETUP_LOOP, _setup_finally)[](#l4.1659)
TARGET_WITH_IMPL(SETUP_EXCEPT, _setup_finally)[](#l4.1660)
TARGET(SETUP_FINALLY)[](#l4.1661)
_setup_finally:[](#l4.1662)
{[](#l4.1663) /* NOTE: If you add any new block-setup opcodes that[](#l4.1664) are not try/except/finally handlers, you may need[](#l4.1665) to update the PyGen_NeedsFinalizing() function.[](#l4.1666)
@@ -2551,9 +2858,13 @@ PyEval_EvalFrameEx(PyFrameObject *f, int PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg, STACK_LEVEL());
continue;[](#l4.1671)
case SETUP_WITH:[](#l4.1673)
DISPATCH();[](#l4.1674)
}[](#l4.1675)
TARGET(SETUP_WITH)[](#l4.1679)
{[](#l4.1680) {[](#l4.1681) static PyObject *exit, *enter;[](#l4.1682) w = TOP();[](#l4.1683)
@@ -2579,10 +2890,11 @@ PyEval_EvalFrameEx(PyFrameObject *f, int STACK_LEVEL()); PUSH(x);
continue;[](#l4.1688)
DISPATCH();[](#l4.1689)
}[](#l4.1690) }[](#l4.1691)
case WITH_CLEANUP:[](#l4.1693)
TARGET_NOARG(WITH_CLEANUP)[](#l4.1694) {[](#l4.1695) /* At the top of the stack are 1-3 values indicating[](#l4.1696) how/why we entered the finally clause:[](#l4.1697)
@@ -2670,7 +2982,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int break; }
case CALL_FUNCTION:[](#l4.1702)
TARGET(CALL_FUNCTION)[](#l4.1703) {[](#l4.1704) PyObject **sp;[](#l4.1705) PCALL(PCALL_ALL);[](#l4.1706)
@@ -2682,14 +2994,14 @@ PyEval_EvalFrameEx(PyFrameObject *f, int #endif stack_pointer = sp; PUSH(x);
if (x != NULL)[](#l4.1711)
continue;[](#l4.1712)
if (x != NULL) DISPATCH();[](#l4.1713) break;[](#l4.1714) }[](#l4.1715)
case CALL_FUNCTION_VAR:[](#l4.1717)
case CALL_FUNCTION_KW:[](#l4.1718)
case CALL_FUNCTION_VAR_KW:[](#l4.1719)
TARGET_WITH_IMPL(CALL_FUNCTION_VAR, _call_function_var_kw)[](#l4.1720)
TARGET_WITH_IMPL(CALL_FUNCTION_KW, _call_function_var_kw)[](#l4.1721)
TARGET(CALL_FUNCTION_VAR_KW)[](#l4.1722)
_call_function_var_kw:[](#l4.1723) {[](#l4.1724) int na = oparg & 0xff;[](#l4.1725) int nk = (oparg>>8) & 0xff;[](#l4.1726)
@@ -2727,12 +3039,13 @@ PyEval_EvalFrameEx(PyFrameObject *f, int Py_DECREF(w); } PUSH(x);
if (x != NULL)[](#l4.1731)
continue;[](#l4.1732)
if (x != NULL) DISPATCH();[](#l4.1733) break;[](#l4.1734) }[](#l4.1735)
case MAKE_FUNCTION:[](#l4.1737)
TARGET(MAKE_FUNCTION)[](#l4.1739)
{[](#l4.1740) v = POP(); /* code object */[](#l4.1741) x = PyFunction_New(v, f->f_globals);[](#l4.1742) Py_DECREF(v);[](#l4.1743)
@@ -2753,8 +3066,9 @@ PyEval_EvalFrameEx(PyFrameObject *f, int } PUSH(x); break; -
case MAKE_CLOSURE:[](#l4.1749)
}[](#l4.1750)
TARGET(MAKE_CLOSURE)[](#l4.1752) {[](#l4.1753) v = POP(); /* code object */[](#l4.1754) x = PyFunction_New(v, f->f_globals);[](#l4.1755)
@@ -2789,7 +3103,8 @@ PyEval_EvalFrameEx(PyFrameObject *f, int break; }
case BUILD_SLICE:[](#l4.1760)
TARGET(BUILD_SLICE)[](#l4.1761)
{[](#l4.1762) if (oparg == 3)[](#l4.1763) w = POP();[](#l4.1764) else[](#l4.1765)
@@ -2801,14 +3116,20 @@ PyEval_EvalFrameEx(PyFrameObject *f, int Py_DECREF(v); Py_XDECREF(w); SET_TOP(x);
if (x != NULL) continue;[](#l4.1770)
if (x != NULL) DISPATCH();[](#l4.1771) break;[](#l4.1772)
case EXTENDED_ARG:[](#l4.1774)
}[](#l4.1775)
TARGET(EXTENDED_ARG)[](#l4.1777)
{[](#l4.1778) opcode = NEXTOP();[](#l4.1779) oparg = oparg<<16 | NEXTARG();[](#l4.1780) goto dispatch_opcode;[](#l4.1781)
}[](#l4.1783)
_unknown_opcode:[](#l4.1786)
+#endif default: fprintf(stderr, "XXX lineno: %d, opcode: %d\n",
new file mode 100755 --- /dev/null +++ b/Python/makeopcodetargets.py @@ -0,0 +1,45 @@ +#! /usr/bin/env python +"""Generate C code for the jump table of the threaded code interpreter +(for compilers supporting computed gotos or "labels-as-values", such as gcc). +""" + +# This code should stay compatible with Python 2.3, at least while +# some of the buildbots have Python 2.3 as their system Python. + +import imp +import os + + +def find_module(modname):
- """Finds and returns a module in the local dist/checkout.
- """
- modpath = os.path.join(
os.path.dirname(os.path.dirname(__file__)), "Lib")[](#l5.21)
- return imp.load_module(modname, *imp.find_module(modname, [modpath]))
- """Write C code contents to the target file object.
- """
- opcode = find_module("opcode")
- targets = ['_unknown_opcode'] * 256
- for opname, op in opcode.opmap.items():
if opname == "STOP_CODE":[](#l5.30)
continue[](#l5.31)
targets[op] = "TARGET_%s" % opname.replace("+0", " ").replace("+", "_")[](#l5.32)
- f.write("static void *opcode_targets[256] = {\n")
- f.write(",\n".join([" &&%s" % s for s in targets]))
- f.write("\n};\n")
- import sys
- assert len(sys.argv) < 3, "Too many arguments"
- if len(sys.argv) == 2:
target = sys.argv[1][](#l5.42)
- else:
target = "Python/opcode_targets.h"[](#l5.44)
- f = open(target, "w")
- try:
write_contents(f)[](#l5.47)
- finally:
f.close()[](#l5.49)
new file mode 100644 --- /dev/null +++ b/Python/opcode_targets.h @@ -0,0 +1,258 @@ +static void *opcode_targets[256] = {
- &&_unknown_opcode,
- &&TARGET_POP_TOP,
- &&TARGET_ROT_TWO,
- &&TARGET_ROT_THREE,
- &&TARGET_DUP_TOP,
- &&TARGET_ROT_FOUR,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&TARGET_NOP,
- &&TARGET_UNARY_POSITIVE,
- &&TARGET_UNARY_NEGATIVE,
- &&TARGET_UNARY_NOT,
- &&TARGET_UNARY_CONVERT,
- &&_unknown_opcode,
- &&TARGET_UNARY_INVERT,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&TARGET_BINARY_POWER,
- &&TARGET_BINARY_MULTIPLY,
- &&TARGET_BINARY_DIVIDE,
- &&TARGET_BINARY_MODULO,
- &&TARGET_BINARY_ADD,
- &&TARGET_BINARY_SUBTRACT,
- &&TARGET_BINARY_SUBSCR,
- &&TARGET_BINARY_FLOOR_DIVIDE,
- &&TARGET_BINARY_TRUE_DIVIDE,
- &&TARGET_INPLACE_FLOOR_DIVIDE,
- &&TARGET_INPLACE_TRUE_DIVIDE,
- &&TARGET_SLICE ,
- &&TARGET_SLICE_1,
- &&TARGET_SLICE_2,
- &&TARGET_SLICE_3,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&TARGET_STORE_SLICE ,
- &&TARGET_STORE_SLICE_1,
- &&TARGET_STORE_SLICE_2,
- &&TARGET_STORE_SLICE_3,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&TARGET_DELETE_SLICE ,
- &&TARGET_DELETE_SLICE_1,
- &&TARGET_DELETE_SLICE_2,
- &&TARGET_DELETE_SLICE_3,
- &&TARGET_STORE_MAP,
- &&TARGET_INPLACE_ADD,
- &&TARGET_INPLACE_SUBTRACT,
- &&TARGET_INPLACE_MULTIPLY,
- &&TARGET_INPLACE_DIVIDE,
- &&TARGET_INPLACE_MODULO,
- &&TARGET_STORE_SUBSCR,
- &&TARGET_DELETE_SUBSCR,
- &&TARGET_BINARY_LSHIFT,
- &&TARGET_BINARY_RSHIFT,
- &&TARGET_BINARY_AND,
- &&TARGET_BINARY_XOR,
- &&TARGET_BINARY_OR,
- &&TARGET_INPLACE_POWER,
- &&TARGET_GET_ITER,
- &&_unknown_opcode,
- &&TARGET_PRINT_EXPR,
- &&TARGET_PRINT_ITEM,
- &&TARGET_PRINT_NEWLINE,
- &&TARGET_PRINT_ITEM_TO,
- &&TARGET_PRINT_NEWLINE_TO,
- &&TARGET_INPLACE_LSHIFT,
- &&TARGET_INPLACE_RSHIFT,
- &&TARGET_INPLACE_AND,
- &&TARGET_INPLACE_XOR,
- &&TARGET_INPLACE_OR,
- &&TARGET_BREAK_LOOP,
- &&TARGET_WITH_CLEANUP,
- &&TARGET_LOAD_LOCALS,
- &&TARGET_RETURN_VALUE,
- &&TARGET_IMPORT_STAR,
- &&TARGET_EXEC_STMT,
- &&TARGET_YIELD_VALUE,
- &&TARGET_POP_BLOCK,
- &&TARGET_END_FINALLY,
- &&TARGET_BUILD_CLASS,
- &&TARGET_STORE_NAME,
- &&TARGET_DELETE_NAME,
- &&TARGET_UNPACK_SEQUENCE,
- &&TARGET_FOR_ITER,
- &&TARGET_LIST_APPEND,
- &&TARGET_STORE_ATTR,
- &&TARGET_DELETE_ATTR,
- &&TARGET_STORE_GLOBAL,
- &&TARGET_DELETE_GLOBAL,
- &&TARGET_DUP_TOPX,
- &&TARGET_LOAD_CONST,
- &&TARGET_LOAD_NAME,
- &&TARGET_BUILD_TUPLE,
- &&TARGET_BUILD_LIST,
- &&TARGET_BUILD_SET,
- &&TARGET_BUILD_MAP,
- &&TARGET_LOAD_ATTR,
- &&TARGET_COMPARE_OP,
- &&TARGET_IMPORT_NAME,
- &&TARGET_IMPORT_FROM,
- &&TARGET_JUMP_FORWARD,
- &&TARGET_JUMP_IF_FALSE_OR_POP,
- &&TARGET_JUMP_IF_TRUE_OR_POP,
- &&TARGET_JUMP_ABSOLUTE,
- &&TARGET_POP_JUMP_IF_FALSE,
- &&TARGET_POP_JUMP_IF_TRUE,
- &&TARGET_LOAD_GLOBAL,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&TARGET_CONTINUE_LOOP,
- &&TARGET_SETUP_LOOP,
- &&TARGET_SETUP_EXCEPT,
- &&TARGET_SETUP_FINALLY,
- &&_unknown_opcode,
- &&TARGET_LOAD_FAST,
- &&TARGET_STORE_FAST,
- &&TARGET_DELETE_FAST,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&TARGET_RAISE_VARARGS,
- &&TARGET_CALL_FUNCTION,
- &&TARGET_MAKE_FUNCTION,
- &&TARGET_BUILD_SLICE,
- &&TARGET_MAKE_CLOSURE,
- &&TARGET_LOAD_CLOSURE,
- &&TARGET_LOAD_DEREF,
- &&TARGET_STORE_DEREF,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&TARGET_CALL_FUNCTION_VAR,
- &&TARGET_CALL_FUNCTION_KW,
- &&TARGET_CALL_FUNCTION_VAR_KW,
- &&TARGET_SETUP_WITH,
- &&_unknown_opcode,
- &&TARGET_EXTENDED_ARG,
- &&TARGET_SET_ADD,
- &&TARGET_MAP_ADD,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode,
- &&_unknown_opcode
--- a/configure +++ b/configure @@ -811,6 +811,7 @@ with_libm with_libc enable_big_digits enable_unicode +with_computed_gotos with_ensurepip ' ac_precious_vars='build_alias @@ -1494,6 +1495,9 @@ Optional Packages: --with-fpectl enable SIGFPE catching --with-libm=STRING math library --with-libc=STRING C library
- --with(out)-computed-gotos
Use computed gotos in evaluation loop (enabled by[](#l7.16)
--with(out)-ensurepip=[=OPTION] "install" or "upgrade" using bundled pip, default is "no"default on supported compilers)[](#l7.17)
@@ -14685,6 +14689,85 @@ for dir in $SRCDIRS; do mkdir $dir fi done + +# BEGIN_COMPUTED_GOTO +# Check for --with-computed-gotos +{ asecho"as_echo "asecho"as_me:${as_lineno-$LINENO}: checking for --with-computed-gotos" >&5 +$as_echo_n "checking for --with-computed-gotos... " >&6; } + +# Check whether --with-computed-gotos was given. +if test "${with_computed_gotos+set}" = set; then :
- withval=$with_computed_gotos; +if test "$withval" = yes +then + +$as_echo "#define USE_COMPUTED_GOTOS 1" >>confdefs.h +
- { asecho"as_echo "asecho"as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +if test "$withval" = no +then + +$as_echo "#define USE_COMPUTED_GOTOS 0" >>confdefs.h +
- { asecho"as_echo "asecho"as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + +else
- { asecho"as_echo "asecho"as_me:${as_lineno-$LINENO}: result: no value specified" >&5 +$as_echo "no value specified" >&6; } +fi + + +{ asecho"as_echo "asecho"as_me:${as_lineno-$LINENO}: checking whether $CC supports computed gotos" >&5 +$as_echo_n "checking whether $CC supports computed gotos... " >&6; } +if ${ac_cv_computed_gotos+:} false; then :
- $as_echo_n "(cached) " >&6 +else
- if test "$cross_compiling" = yes; then :
- if test "${with_computed_gotos+set}" = set; then
- ac_cv_computed_gotos="$with_computed_gotos -- configured --with(out)-computed-gotos"
- else
- ac_cv_computed_gotos=no
- fi +else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int main(int argc, char **argv) +{
- static void *targets[1] = { &&LABEL1 };
- goto LABEL2;
+} + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then :
- ac_cv_computed_gotos=yes +else
- ac_cv_computed_gotos=no +fi +rm -f core .core core.conftest. gmon.out bb.out conftest$ac_exeext [](#l7.89)
- conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi + +{ asecho"as_echo "asecho"as_me:${as_lineno-$LINENO}: result: $ac_cv_computed_gotos" >&5 +$as_echo "$ac_cv_computed_gotos" >&6; } +case "$ac_cv_computed_gotos" in yes*) + +$as_echo "#define HAVE_COMPUTED_GOTOS 1" >>confdefs.h + +esac +# END_COMPUTED_GOTO + { asecho"as_echo "asecho"as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; }
--- a/configure.ac +++ b/configure.ac @@ -4557,6 +4557,57 @@ for dir in $SRCDIRS; do mkdir $dir fi done + +# BEGIN_COMPUTED_GOTO +# Check for --with-computed-gotos +AC_MSG_CHECKING(for --with-computed-gotos) +AC_ARG_WITH(computed-gotos,
AS_HELP_STRING([--with(out)-computed-gotos],[](#l8.12)
[Use computed gotos in evaluation loop (enabled by default on supported compilers)]),[](#l8.13)
+[ +if test "$withval" = yes +then
- AC_DEFINE(USE_COMPUTED_GOTOS, 1,
- [Define if you want to use computed gotos in ceval.c.])
- AC_MSG_RESULT(yes) +fi +if test "$withval" = no +then
- AC_DEFINE(USE_COMPUTED_GOTOS, 0,
- [Define if you want to use computed gotos in ceval.c.])
- AC_MSG_RESULT(no) +fi +], +[AC_MSG_RESULT(no value specified)]) + +AC_MSG_CHECKING(whether $CC supports computed gotos) +AC_CACHE_VAL(ac_cv_computed_gotos, +AC_RUN_IFELSE([AC_LANG_SOURCE([[[ +int main(int argc, char **argv) +{
- static void *targets[1] = { &&LABEL1 };
- goto LABEL2;
+} +]]])], +[ac_cv_computed_gotos=yes], +[ac_cv_computed_gotos=no], +[if test "${with_computed_gotos+set}" = set; then
- ac_cv_computed_gotos="$with_computed_gotos -- configured --with(out)-computed-gotos"
- else
- ac_cv_computed_gotos=no
- fi])) +AC_MSG_RESULT($ac_cv_computed_gotos) +case "$ac_cv_computed_gotos" in yes*)
- AC_DEFINE(HAVE_COMPUTED_GOTOS, 1,
- [Define if the C compiler supports computed gotos.]) +esac +# END_COMPUTED_GOTO + AC_MSG_RESULT(done)
ensurepip option
--- a/pyconfig.h.in
+++ b/pyconfig.h.in
@@ -118,6 +118,9 @@
/* Define to 1 if you have the clock' function. */[](#l9.4) #undef HAVE_CLOCK[](#l9.5) [](#l9.6) +/* Define if the C compiler supports computed gotos. */[](#l9.7) +#undef HAVE_COMPUTED_GOTOS[](#l9.8) +[](#l9.9) /* Define to 1 if you have the
confstr' function. /
#undef HAVE_CONFSTR
@@ -1069,6 +1072,9 @@
/ Define to 1 if your <sys/time.h> declares `struct tm'. /
#undef TM_IN_SYS_TIME
+/ Define if you want to use computed gotos in ceval.c. /
+#undef USE_COMPUTED_GOTOS
+
/ Enable extensions on AIX 3, Interix. */
#ifndef _ALL_SOURCE