Created
December 15, 2020 19:20
-
-
Save airportyh/641b2a7e3412237a5970ca8ce64e7770 to your computer and use it in GitHub Desktop.
I modified the Python interpreter (ceval.c) to look the state of the stack before each bytecode instruction.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/Python/ceval.c b/Python/ceval.c | |
index 9de925780e..99ca5d6265 100644 | |
--- a/Python/ceval.c | |
+++ b/Python/ceval.c | |
@@ -144,6 +144,50 @@ is_tstate_valid(PyThreadState *tstate) | |
} | |
#endif | |
+void printObject(PyObject *obj) { | |
+ PyObject *type = PyObject_Type(obj); | |
+ if (type == &PyUnicode_Type || type == &_PyNone_Type || | |
+ type == &PyLong_Type || type == &PyBool_Type) { | |
+ PyObject_Print(obj, stdout, 0); | |
+ } else { | |
+ PyObject *typeName = PyObject_GetAttr(type, PyUnicode_FromString("__name__")); | |
+ if (PyObject_RichCompareBool(typeName, PyUnicode_FromString("builtin_function_or_method"), Py_EQ) || | |
+ PyObject_RichCompareBool(typeName, PyUnicode_FromString("function"), Py_EQ) || | |
+ PyObject_RichCompareBool(typeName, PyUnicode_FromString("method_descriptor"), Py_EQ)) { | |
+ PyObject *methodName = PyObject_GetAttr(obj, PyUnicode_FromString("__qualname__")); | |
+ printf("<"); | |
+ PyObject_Print(typeName, stdout, Py_PRINT_RAW); | |
+ printf(" "); | |
+ PyObject_Print(methodName, stdout, Py_PRINT_RAW); | |
+ printf("()"); | |
+ printf(">"); | |
+ } else { | |
+ printf("<object "); | |
+ PyObject_Print(typeName, stdout, Py_PRINT_RAW); | |
+ printf(">"); | |
+ } | |
+ } | |
+} | |
+ | |
+void printStack(PyObject **stack_pointer, int level) { | |
+ printf(" Stack(%d): [", level); | |
+ for (int i = 1; i <= level; i++) { | |
+ PyObject *obj = stack_pointer[-i]; | |
+ if (i != 1) { | |
+ printf(", "); | |
+ } | |
+ if (obj) { | |
+ printObject(obj); | |
+ } | |
+ } | |
+ printf("]\n"); | |
+} | |
+ | |
+void logOp(char *label, PyObject **stack_pointer, int level, PyFrameObject *frame, int oparg) { | |
+ int lineNo = PyFrame_GetLineNumber(frame); | |
+ printStack(stack_pointer, level); | |
+ printf("%s(%d) on #%d\n", label, oparg, lineNo); | |
+} | |
/* This can set eval_breaker to 0 even though gil_drop_request became | |
1. We believe this is all right because the eval loop will release | |
@@ -1499,6 +1543,26 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
assert(!_PyErr_Occurred(tstate)); | |
#endif | |
+ printf("PUSH_FRAME "); | |
+ printf("names: "); | |
+ PyObject_Print(names, stdout, 0); | |
+ printf(" consts: "); | |
+ PyObject_Print(consts, stdout, 0); | |
+ printf(" locals: ("); | |
+ PyObject **valuestack = f->f_valuestack; | |
+ for (PyObject **p = f->f_localsplus; p < valuestack; p++) { | |
+ if (p != f->f_localsplus) { | |
+ printf(", "); | |
+ } | |
+ PyObject *obj = *p; | |
+ if (obj != NULL) { | |
+ printObject(obj); | |
+ } | |
+ } | |
+ printf(")"); | |
+ | |
+ printf("\n"); | |
+ | |
main_loop: | |
for (;;) { | |
assert(stack_pointer >= f->f_valuestack); /* else underflow */ | |
@@ -1597,7 +1661,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
} | |
#endif | |
- | |
switch (opcode) { | |
/* BEWARE! | |
@@ -1605,10 +1668,12 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
and that all operation that succeed call [FAST_]DISPATCH() ! */ | |
case TARGET(NOP): { | |
+ logOp("NOP", stack_pointer, STACK_LEVEL(), f, oparg); | |
FAST_DISPATCH(); | |
} | |
case TARGET(LOAD_FAST): { | |
+ logOp("LOAD_FAST", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *value = GETLOCAL(oparg); | |
if (value == NULL) { | |
format_exc_check_arg(tstate, PyExc_UnboundLocalError, | |
@@ -1622,6 +1687,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(LOAD_CONST): { | |
+ logOp("LOAD_CONST", stack_pointer, STACK_LEVEL(), f, oparg); | |
PREDICTED(LOAD_CONST); | |
PyObject *value = GETITEM(consts, oparg); | |
Py_INCREF(value); | |
@@ -1630,6 +1696,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(STORE_FAST): { | |
+ logOp("STORE_FAST", stack_pointer, STACK_LEVEL(), f, oparg); | |
PREDICTED(STORE_FAST); | |
PyObject *value = POP(); | |
SETLOCAL(oparg, value); | |
@@ -1637,12 +1704,14 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(POP_TOP): { | |
+ logOp("POP_TOP", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *value = POP(); | |
Py_DECREF(value); | |
FAST_DISPATCH(); | |
} | |
case TARGET(ROT_TWO): { | |
+ logOp("ROT_TWO", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *top = TOP(); | |
PyObject *second = SECOND(); | |
SET_TOP(second); | |
@@ -1651,6 +1720,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(ROT_THREE): { | |
+ logOp("ROT_THREE", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *top = TOP(); | |
PyObject *second = SECOND(); | |
PyObject *third = THIRD(); | |
@@ -1661,6 +1731,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(ROT_FOUR): { | |
+ logOp("ROT_FOUR", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *top = TOP(); | |
PyObject *second = SECOND(); | |
PyObject *third = THIRD(); | |
@@ -1673,6 +1744,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(DUP_TOP): { | |
+ logOp("DUP_TOP", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *top = TOP(); | |
Py_INCREF(top); | |
PUSH(top); | |
@@ -1680,6 +1752,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(DUP_TOP_TWO): { | |
+ logOp("DUP_TOP_TWO", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *top = TOP(); | |
PyObject *second = SECOND(); | |
Py_INCREF(top); | |
@@ -1691,6 +1764,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(UNARY_POSITIVE): { | |
+ logOp("UNARY_POSITIVE", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *value = TOP(); | |
PyObject *res = PyNumber_Positive(value); | |
Py_DECREF(value); | |
@@ -1701,6 +1775,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(UNARY_NEGATIVE): { | |
+ logOp("UNARY_NEGATIVE", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *value = TOP(); | |
PyObject *res = PyNumber_Negative(value); | |
Py_DECREF(value); | |
@@ -1711,6 +1786,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(UNARY_NOT): { | |
+ logOp("UNARY_NOT", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *value = TOP(); | |
int err = PyObject_IsTrue(value); | |
Py_DECREF(value); | |
@@ -1729,6 +1805,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(UNARY_INVERT): { | |
+ logOp("UNARY_INVERT", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *value = TOP(); | |
PyObject *res = PyNumber_Invert(value); | |
Py_DECREF(value); | |
@@ -1739,6 +1816,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(BINARY_POWER): { | |
+ logOp("BINARY_POWER", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *exp = POP(); | |
PyObject *base = TOP(); | |
PyObject *res = PyNumber_Power(base, exp, Py_None); | |
@@ -1751,6 +1829,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(BINARY_MULTIPLY): { | |
+ logOp("BINARY_MULTIPLY", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *right = POP(); | |
PyObject *left = TOP(); | |
PyObject *res = PyNumber_Multiply(left, right); | |
@@ -1763,6 +1842,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(BINARY_MATRIX_MULTIPLY): { | |
+ logOp("BINARY_MATRIX_MULTIPLY", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *right = POP(); | |
PyObject *left = TOP(); | |
PyObject *res = PyNumber_MatrixMultiply(left, right); | |
@@ -1775,6 +1855,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(BINARY_TRUE_DIVIDE): { | |
+ logOp("BINARY_TRUE_DIVIDE", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *divisor = POP(); | |
PyObject *dividend = TOP(); | |
PyObject *quotient = PyNumber_TrueDivide(dividend, divisor); | |
@@ -1787,6 +1868,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(BINARY_FLOOR_DIVIDE): { | |
+ logOp("BINARY_FLOOR_DIVIDE", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *divisor = POP(); | |
PyObject *dividend = TOP(); | |
PyObject *quotient = PyNumber_FloorDivide(dividend, divisor); | |
@@ -1799,6 +1881,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(BINARY_MODULO): { | |
+ logOp("BINARY_MODULO", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *divisor = POP(); | |
PyObject *dividend = TOP(); | |
PyObject *res; | |
@@ -1819,6 +1902,8 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(BINARY_ADD): { | |
+ logOp("BINARY_ADD", stack_pointer, STACK_LEVEL(), f, oparg); | |
+ | |
PyObject *right = POP(); | |
PyObject *left = TOP(); | |
PyObject *sum; | |
@@ -1845,6 +1930,8 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(BINARY_SUBTRACT): { | |
+ logOp("BINARY_SUBTRACT", stack_pointer, STACK_LEVEL(), f, oparg); | |
+ | |
PyObject *right = POP(); | |
PyObject *left = TOP(); | |
PyObject *diff = PyNumber_Subtract(left, right); | |
@@ -1857,6 +1944,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(BINARY_SUBSCR): { | |
+ logOp("BINARY_SUBSCR", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *sub = POP(); | |
PyObject *container = TOP(); | |
PyObject *res = PyObject_GetItem(container, sub); | |
@@ -1869,6 +1957,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(BINARY_LSHIFT): { | |
+ logOp("BINARY_LSHIFT", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *right = POP(); | |
PyObject *left = TOP(); | |
PyObject *res = PyNumber_Lshift(left, right); | |
@@ -1881,6 +1970,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(BINARY_RSHIFT): { | |
+ logOp("BINARY_RSHIFT", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *right = POP(); | |
PyObject *left = TOP(); | |
PyObject *res = PyNumber_Rshift(left, right); | |
@@ -1893,6 +1983,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(BINARY_AND): { | |
+ logOp("BINARY_AND", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *right = POP(); | |
PyObject *left = TOP(); | |
PyObject *res = PyNumber_And(left, right); | |
@@ -1905,6 +1996,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(BINARY_XOR): { | |
+ logOp("BINARY_XOR", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *right = POP(); | |
PyObject *left = TOP(); | |
PyObject *res = PyNumber_Xor(left, right); | |
@@ -1917,6 +2009,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(BINARY_OR): { | |
+ logOp("BINARY_OR", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *right = POP(); | |
PyObject *left = TOP(); | |
PyObject *res = PyNumber_Or(left, right); | |
@@ -1929,6 +2022,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(LIST_APPEND): { | |
+ logOp("LIST_APPEND", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *v = POP(); | |
PyObject *list = PEEK(oparg); | |
int err; | |
@@ -1941,6 +2035,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(SET_ADD): { | |
+ logOp("SET_ADD", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *v = POP(); | |
PyObject *set = PEEK(oparg); | |
int err; | |
@@ -1953,6 +2048,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(INPLACE_POWER): { | |
+ logOp("INPLACE_POWER", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *exp = POP(); | |
PyObject *base = TOP(); | |
PyObject *res = PyNumber_InPlacePower(base, exp, Py_None); | |
@@ -1965,6 +2061,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(INPLACE_MULTIPLY): { | |
+ logOp("INPLACE_MULTIPLY", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *right = POP(); | |
PyObject *left = TOP(); | |
PyObject *res = PyNumber_InPlaceMultiply(left, right); | |
@@ -1977,6 +2074,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(INPLACE_MATRIX_MULTIPLY): { | |
+ logOp("INPLACE_MATRIX_MULTIPLY", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *right = POP(); | |
PyObject *left = TOP(); | |
PyObject *res = PyNumber_InPlaceMatrixMultiply(left, right); | |
@@ -1989,6 +2087,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(INPLACE_TRUE_DIVIDE): { | |
+ logOp("INPLACE_TRUE_DIVIDE", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *divisor = POP(); | |
PyObject *dividend = TOP(); | |
PyObject *quotient = PyNumber_InPlaceTrueDivide(dividend, divisor); | |
@@ -2001,6 +2100,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(INPLACE_FLOOR_DIVIDE): { | |
+ logOp("INPLACE_FLOOR_DIVIDE", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *divisor = POP(); | |
PyObject *dividend = TOP(); | |
PyObject *quotient = PyNumber_InPlaceFloorDivide(dividend, divisor); | |
@@ -2013,6 +2113,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(INPLACE_MODULO): { | |
+ logOp("INPLACE_MODULO", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *right = POP(); | |
PyObject *left = TOP(); | |
PyObject *mod = PyNumber_InPlaceRemainder(left, right); | |
@@ -2025,6 +2126,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(INPLACE_ADD): { | |
+ logOp("INPLACE_ADD", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *right = POP(); | |
PyObject *left = TOP(); | |
PyObject *sum; | |
@@ -2044,6 +2146,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(INPLACE_SUBTRACT): { | |
+ logOp("INPLACE_SUBTRACT", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *right = POP(); | |
PyObject *left = TOP(); | |
PyObject *diff = PyNumber_InPlaceSubtract(left, right); | |
@@ -2056,6 +2159,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(INPLACE_LSHIFT): { | |
+ logOp("INPLACE_LSHIFT", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *right = POP(); | |
PyObject *left = TOP(); | |
PyObject *res = PyNumber_InPlaceLshift(left, right); | |
@@ -2068,6 +2172,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(INPLACE_RSHIFT): { | |
+ logOp("INPLACE_RSHIFT", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *right = POP(); | |
PyObject *left = TOP(); | |
PyObject *res = PyNumber_InPlaceRshift(left, right); | |
@@ -2080,6 +2185,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(INPLACE_AND): { | |
+ logOp("INPLACE_AND", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *right = POP(); | |
PyObject *left = TOP(); | |
PyObject *res = PyNumber_InPlaceAnd(left, right); | |
@@ -2092,6 +2198,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(INPLACE_XOR): { | |
+ logOp("INPLACE_XOR", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *right = POP(); | |
PyObject *left = TOP(); | |
PyObject *res = PyNumber_InPlaceXor(left, right); | |
@@ -2104,6 +2211,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(INPLACE_OR): { | |
+ logOp("INPLACE_OR", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *right = POP(); | |
PyObject *left = TOP(); | |
PyObject *res = PyNumber_InPlaceOr(left, right); | |
@@ -2116,6 +2224,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(STORE_SUBSCR): { | |
+ logOp("STORE_SUBSCR", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *sub = TOP(); | |
PyObject *container = SECOND(); | |
PyObject *v = THIRD(); | |
@@ -2132,6 +2241,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(DELETE_SUBSCR): { | |
+ logOp("DELETE_SUBSCR", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *sub = TOP(); | |
PyObject *container = SECOND(); | |
int err; | |
@@ -2146,6 +2256,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(PRINT_EXPR): { | |
+ logOp("PRINT_EXPR", stack_pointer, STACK_LEVEL(), f, oparg); | |
_Py_IDENTIFIER(displayhook); | |
PyObject *value = POP(); | |
PyObject *hook = _PySys_GetObjectId(&PyId_displayhook); | |
@@ -2165,6 +2276,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(RAISE_VARARGS): { | |
+ logOp("RAISE_VARARGS", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *cause = NULL, *exc = NULL; | |
switch (oparg) { | |
case 2: | |
@@ -2187,6 +2299,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(RETURN_VALUE): { | |
+ logOp("RETURN_VALUE", stack_pointer, STACK_LEVEL(), f, oparg); | |
retval = POP(); | |
assert(f->f_iblock == 0); | |
assert(EMPTY()); | |
@@ -2196,6 +2309,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(GET_AITER): { | |
+ logOp("GET_AITER", stack_pointer, STACK_LEVEL(), f, oparg); | |
unaryfunc getter = NULL; | |
PyObject *iter = NULL; | |
PyObject *obj = TOP(); | |
@@ -2240,6 +2354,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(GET_ANEXT): { | |
+ logOp("GET_ANEXT", stack_pointer, STACK_LEVEL(), f, oparg); | |
unaryfunc getter = NULL; | |
PyObject *next_iter = NULL; | |
PyObject *awaitable = NULL; | |
@@ -2291,6 +2406,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(GET_AWAITABLE): { | |
+ logOp("GET_AWAITABLE", stack_pointer, STACK_LEVEL(), f, oparg); | |
PREDICTED(GET_AWAITABLE); | |
PyObject *iterable = TOP(); | |
PyObject *iter = _PyCoro_GetAwaitableIter(iterable); | |
@@ -2332,6 +2448,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(YIELD_FROM): { | |
+ logOp("YIELD_FROM", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *v = POP(); | |
PyObject *receiver = TOP(); | |
PySendResult gen_status; | |
@@ -2384,6 +2501,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(YIELD_VALUE): { | |
+ logOp("YIELD_VALUE", stack_pointer, STACK_LEVEL(), f, oparg); | |
retval = POP(); | |
if (co->co_flags & CO_ASYNC_GENERATOR) { | |
@@ -2401,6 +2519,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(POP_EXCEPT): { | |
+ logOp("POP_EXCEPT", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *type, *value, *traceback; | |
_PyErr_StackItem *exc_info; | |
PyTryBlock *b = PyFrame_BlockPop(f); | |
@@ -2425,11 +2544,13 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(POP_BLOCK): { | |
+ logOp("POP_BLOCK", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyFrame_BlockPop(f); | |
DISPATCH(); | |
} | |
case TARGET(RERAISE): { | |
+ logOp("RERAISE", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *exc = POP(); | |
PyObject *val = POP(); | |
PyObject *tb = POP(); | |
@@ -2439,6 +2560,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(END_ASYNC_FOR): { | |
+ logOp("END_ASYNC_FOR", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *exc = POP(); | |
assert(PyExceptionClass_Check(exc)); | |
if (PyErr_GivenExceptionMatches(exc, PyExc_StopAsyncIteration)) { | |
@@ -2459,6 +2581,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(LOAD_ASSERTION_ERROR): { | |
+ logOp("LOAD_ASSERTION_ERROR", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *value = PyExc_AssertionError; | |
Py_INCREF(value); | |
PUSH(value); | |
@@ -2466,6 +2589,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(LOAD_BUILD_CLASS): { | |
+ logOp("LOAD_BUILD_CLASS", stack_pointer, STACK_LEVEL(), f, oparg); | |
_Py_IDENTIFIER(__build_class__); | |
PyObject *bc; | |
@@ -2497,6 +2621,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(STORE_NAME): { | |
+ logOp("STORE_NAME", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *name = GETITEM(names, oparg); | |
PyObject *v = POP(); | |
PyObject *ns = f->f_locals; | |
@@ -2518,6 +2643,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(DELETE_NAME): { | |
+ logOp("DELETE_NAME", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *name = GETITEM(names, oparg); | |
PyObject *ns = f->f_locals; | |
int err; | |
@@ -2537,6 +2663,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(UNPACK_SEQUENCE): { | |
+ logOp("UNPACK_SEQUENCE", stack_pointer, STACK_LEVEL(), f, oparg); | |
PREDICTED(UNPACK_SEQUENCE); | |
PyObject *seq = POP(), *item, **items; | |
if (PyTuple_CheckExact(seq) && | |
@@ -2568,6 +2695,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(UNPACK_EX): { | |
+ logOp("UNPACK_EX", stack_pointer, STACK_LEVEL(), f, oparg); | |
int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8); | |
PyObject *seq = POP(); | |
@@ -2583,6 +2711,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(STORE_ATTR): { | |
+ logOp("STORE_ATTR", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *name = GETITEM(names, oparg); | |
PyObject *owner = TOP(); | |
PyObject *v = SECOND(); | |
@@ -2597,6 +2726,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(DELETE_ATTR): { | |
+ logOp("DELETE_ATTR", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *name = GETITEM(names, oparg); | |
PyObject *owner = POP(); | |
int err; | |
@@ -2608,6 +2738,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(STORE_GLOBAL): { | |
+ logOp("STORE_GLOBAL", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *name = GETITEM(names, oparg); | |
PyObject *v = POP(); | |
int err; | |
@@ -2619,6 +2750,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(DELETE_GLOBAL): { | |
+ logOp("DELETE_GLOBAL", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *name = GETITEM(names, oparg); | |
int err; | |
err = PyDict_DelItem(f->f_globals, name); | |
@@ -2633,6 +2765,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(LOAD_NAME): { | |
+ logOp("LOAD_NAME", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *name = GETITEM(names, oparg); | |
PyObject *locals = f->f_locals; | |
PyObject *v; | |
@@ -2697,6 +2830,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(LOAD_GLOBAL): { | |
+ logOp("LOAD_GLOBAL", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *name; | |
PyObject *v; | |
if (PyDict_CheckExact(f->f_globals) | |
@@ -2783,6 +2917,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(DELETE_FAST): { | |
+ logOp("DELETE_FAST", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *v = GETLOCAL(oparg); | |
if (v != NULL) { | |
SETLOCAL(oparg, NULL); | |
@@ -2797,6 +2932,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(DELETE_DEREF): { | |
+ logOp("DELETE_DEREF", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *cell = freevars[oparg]; | |
PyObject *oldobj = PyCell_GET(cell); | |
if (oldobj != NULL) { | |
@@ -2809,6 +2945,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(LOAD_CLOSURE): { | |
+ logOp("LOAD_CLOSURE", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *cell = freevars[oparg]; | |
Py_INCREF(cell); | |
PUSH(cell); | |
@@ -2816,6 +2953,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(LOAD_CLASSDEREF): { | |
+ logOp("LOAD_CLASSDEREF", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *name, *value, *locals = f->f_locals; | |
Py_ssize_t idx; | |
assert(locals); | |
@@ -2855,6 +2993,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(LOAD_DEREF): { | |
+ logOp("LOAD_DEREF", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *cell = freevars[oparg]; | |
PyObject *value = PyCell_GET(cell); | |
if (value == NULL) { | |
@@ -2867,6 +3006,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(STORE_DEREF): { | |
+ logOp("STORE_DEREF", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *v = POP(); | |
PyObject *cell = freevars[oparg]; | |
PyObject *oldobj = PyCell_GET(cell); | |
@@ -2876,6 +3016,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(BUILD_STRING): { | |
+ logOp("BUILD_STRING", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *str; | |
PyObject *empty = PyUnicode_New(0, 0); | |
if (empty == NULL) { | |
@@ -2894,6 +3035,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(BUILD_TUPLE): { | |
+ logOp("BUILD_TUPLE", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *tup = PyTuple_New(oparg); | |
if (tup == NULL) | |
goto error; | |
@@ -2906,6 +3048,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(BUILD_LIST): { | |
+ logOp("BUILD_LIST", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *list = PyList_New(oparg); | |
if (list == NULL) | |
goto error; | |
@@ -2918,6 +3061,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(LIST_TO_TUPLE): { | |
+ logOp("LIST_TO_TUPLE", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *list = POP(); | |
PyObject *tuple = PyList_AsTuple(list); | |
Py_DECREF(list); | |
@@ -2929,6 +3073,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(LIST_EXTEND): { | |
+ logOp("LIST_EXTEND", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *iterable = POP(); | |
PyObject *list = PEEK(oparg); | |
PyObject *none_val = _PyList_Extend((PyListObject *)list, iterable); | |
@@ -2950,6 +3095,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(SET_UPDATE): { | |
+ logOp("SET_UPDATE", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *iterable = POP(); | |
PyObject *set = PEEK(oparg); | |
int err = _PySet_Update(set, iterable); | |
@@ -2961,6 +3107,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(BUILD_SET): { | |
+ logOp("BUILD_SET", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *set = PySet_New(NULL); | |
int err = 0; | |
int i; | |
@@ -2982,6 +3129,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(BUILD_MAP): { | |
+ logOp("BUILD_MAP", stack_pointer, STACK_LEVEL(), f, oparg); | |
Py_ssize_t i; | |
PyObject *map = _PyDict_NewPresized((Py_ssize_t)oparg); | |
if (map == NULL) | |
@@ -3006,6 +3154,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(SETUP_ANNOTATIONS): { | |
+ logOp("SETUP_ANNOTATIONS", stack_pointer, STACK_LEVEL(), f, oparg); | |
_Py_IDENTIFIER(__annotations__); | |
int err; | |
PyObject *ann_dict; | |
@@ -3065,6 +3214,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(BUILD_CONST_KEY_MAP): { | |
+ logOp("BUILD_CONST_KEY_MAP", stack_pointer, STACK_LEVEL(), f, oparg); | |
Py_ssize_t i; | |
PyObject *map; | |
PyObject *keys = TOP(); | |
@@ -3098,6 +3248,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(DICT_UPDATE): { | |
+ logOp("DICT_UPDATE", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *update = POP(); | |
PyObject *dict = PEEK(oparg); | |
if (PyDict_Update(dict, update) < 0) { | |
@@ -3114,6 +3265,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(DICT_MERGE): { | |
+ logOp("DICT_MERGE", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *update = POP(); | |
PyObject *dict = PEEK(oparg); | |
@@ -3128,6 +3280,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(MAP_ADD): { | |
+ logOp("MAP_ADD", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *value = TOP(); | |
PyObject *key = SECOND(); | |
PyObject *map; | |
@@ -3145,6 +3298,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(LOAD_ATTR): { | |
+ logOp("LOAD_ATTR", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *name = GETITEM(names, oparg); | |
PyObject *owner = TOP(); | |
@@ -3277,6 +3431,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(COMPARE_OP): { | |
+ logOp("COMPARE_OP", stack_pointer, STACK_LEVEL(), f, oparg); | |
assert(oparg <= Py_GE); | |
PyObject *right = POP(); | |
PyObject *left = TOP(); | |
@@ -3292,6 +3447,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(IS_OP): { | |
+ logOp("IS_OP", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *right = POP(); | |
PyObject *left = TOP(); | |
int res = (left == right)^oparg; | |
@@ -3306,6 +3462,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(CONTAINS_OP): { | |
+ logOp("CONTAINS_OP", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *right = POP(); | |
PyObject *left = POP(); | |
int res = PySequence_Contains(right, left); | |
@@ -3326,6 +3483,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
"BaseException is not allowed" | |
case TARGET(JUMP_IF_NOT_EXC_MATCH): { | |
+ logOp("JUMP_IF_NOT_EXC_MATCH", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *right = POP(); | |
PyObject *left = POP(); | |
if (PyTuple_Check(right)) { | |
@@ -3367,6 +3525,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(IMPORT_NAME): { | |
+ logOp("IMPORT_NAME", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *name = GETITEM(names, oparg); | |
PyObject *fromlist = POP(); | |
PyObject *level = TOP(); | |
@@ -3381,6 +3540,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(IMPORT_STAR): { | |
+ logOp("IMPORT_STAR", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *from = POP(), *locals; | |
int err; | |
if (PyFrame_FastToLocalsWithError(f) < 0) { | |
@@ -3404,6 +3564,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(IMPORT_FROM): { | |
+ logOp("IMPORT_FROM", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *name = GETITEM(names, oparg); | |
PyObject *from = TOP(); | |
PyObject *res; | |
@@ -3415,11 +3576,13 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(JUMP_FORWARD): { | |
+ logOp("JUMP_FORWARD", stack_pointer, STACK_LEVEL(), f, oparg); | |
JUMPBY(oparg); | |
FAST_DISPATCH(); | |
} | |
case TARGET(POP_JUMP_IF_FALSE): { | |
+ logOp("POP_JUMP_IF_FALSE", stack_pointer, STACK_LEVEL(), f, oparg); | |
PREDICTED(POP_JUMP_IF_FALSE); | |
PyObject *cond = POP(); | |
int err; | |
@@ -3444,6 +3607,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(POP_JUMP_IF_TRUE): { | |
+ logOp("POP_JUMP_IF_TRUE", stack_pointer, STACK_LEVEL(), f, oparg); | |
PREDICTED(POP_JUMP_IF_TRUE); | |
PyObject *cond = POP(); | |
int err; | |
@@ -3469,6 +3633,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(JUMP_IF_FALSE_OR_POP): { | |
+ logOp("JUMP_IF_FALSE_OR_POP", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *cond = TOP(); | |
int err; | |
if (cond == Py_True) { | |
@@ -3493,6 +3658,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(JUMP_IF_TRUE_OR_POP): { | |
+ logOp("JUMP_IF_TRUE_OR_POP", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *cond = TOP(); | |
int err; | |
if (cond == Py_False) { | |
@@ -3518,6 +3684,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(JUMP_ABSOLUTE): { | |
+ logOp("JUMP_ABSOLUTE", stack_pointer, STACK_LEVEL(), f, oparg); | |
PREDICTED(JUMP_ABSOLUTE); | |
JUMPTO(oparg); | |
#if FAST_LOOPS | |
@@ -3535,6 +3702,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(GET_ITER): { | |
+ logOp("GET_ITER", stack_pointer, STACK_LEVEL(), f, oparg); | |
/* before: [obj]; after [getiter(obj)] */ | |
PyObject *iterable = TOP(); | |
PyObject *iter = PyObject_GetIter(iterable); | |
@@ -3548,6 +3716,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(GET_YIELD_FROM_ITER): { | |
+ logOp("GET_YIELD_FROM_ITER", stack_pointer, STACK_LEVEL(), f, oparg); | |
/* before: [obj]; after [getiter(obj)] */ | |
PyObject *iterable = TOP(); | |
PyObject *iter; | |
@@ -3577,6 +3746,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(FOR_ITER): { | |
+ logOp("FOR_ITER", stack_pointer, STACK_LEVEL(), f, oparg); | |
PREDICTED(FOR_ITER); | |
/* before: [iter]; after: [iter, iter()] *or* [] */ | |
PyObject *iter = TOP(); | |
@@ -3604,12 +3774,14 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(SETUP_FINALLY): { | |
+ logOp("SETUP_FINALLY", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyFrame_BlockSetup(f, SETUP_FINALLY, INSTR_OFFSET() + oparg, | |
STACK_LEVEL()); | |
DISPATCH(); | |
} | |
case TARGET(BEFORE_ASYNC_WITH): { | |
+ logOp("BEFORE_ASYNC_WITH", stack_pointer, STACK_LEVEL(), f, oparg); | |
_Py_IDENTIFIER(__aenter__); | |
_Py_IDENTIFIER(__aexit__); | |
PyObject *mgr = TOP(); | |
@@ -3635,6 +3807,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(SETUP_ASYNC_WITH): { | |
+ logOp("SETUP_ASYNC_WITH", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *res = POP(); | |
/* Setup the finally block before pushing the result | |
of __aenter__ on the stack. */ | |
@@ -3645,6 +3818,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(SETUP_WITH): { | |
+ logOp("SETUP_WITH", stack_pointer, STACK_LEVEL(), f, oparg); | |
_Py_IDENTIFIER(__enter__); | |
_Py_IDENTIFIER(__exit__); | |
PyObject *mgr = TOP(); | |
@@ -3674,6 +3848,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(WITH_EXCEPT_START): { | |
+ logOp("WITH_EXCEPT_START", stack_pointer, STACK_LEVEL(), f, oparg); | |
/* At the top of the stack are 7 values: | |
- (TOP, SECOND, THIRD) = exc_info() | |
- (FOURTH, FIFTH, SIXTH) = previous exception for EXCEPT_HANDLER | |
@@ -3702,6 +3877,11 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(LOAD_METHOD): { | |
+ logOp("LOAD_METHOD", stack_pointer, STACK_LEVEL(), f, oparg); | |
+ int lineNo = PyFrame_GetLineNumber(f); | |
+ if (lineNo == 17) { | |
+ printf("Found our list.append call\n"); | |
+ } | |
/* Designed to work in tandem with CALL_METHOD. */ | |
PyObject *name = GETITEM(names, oparg); | |
PyObject *obj = TOP(); | |
@@ -3715,6 +3895,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
if (meth_found) { | |
+ | |
/* We can bypass temporary bound method object. | |
meth is unbound method and obj is self. | |
@@ -3739,6 +3920,11 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(CALL_METHOD): { | |
+ logOp("CALL_METHOD", stack_pointer, STACK_LEVEL(), f, oparg); | |
+ int lineNo = PyFrame_GetLineNumber(f); | |
+ if (lineNo == 17) { | |
+ printf("Found our list.append call\n"); | |
+ } | |
/* Designed to work in tamdem with LOAD_METHOD. */ | |
PyObject **sp, *res, *meth; | |
@@ -3788,6 +3974,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(CALL_FUNCTION): { | |
+ logOp("CALL_FUNCTION", stack_pointer, STACK_LEVEL(), f, oparg); | |
PREDICTED(CALL_FUNCTION); | |
PyObject **sp, *res; | |
sp = stack_pointer; | |
@@ -3801,6 +3988,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(CALL_FUNCTION_KW): { | |
+ logOp("CALL_FUNCTION_KW", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject **sp, *res, *names; | |
names = POP(); | |
@@ -3820,6 +4008,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(CALL_FUNCTION_EX): { | |
+ logOp("CALL_FUNCTION_EX", stack_pointer, STACK_LEVEL(), f, oparg); | |
PREDICTED(CALL_FUNCTION_EX); | |
PyObject *func, *callargs, *kwargs = NULL, *result; | |
if (oparg & 0x01) { | |
@@ -3866,6 +4055,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(MAKE_FUNCTION): { | |
+ logOp("MAKE_FUNCTION", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *qualname = POP(); | |
PyObject *codeobj = POP(); | |
PyFunctionObject *func = (PyFunctionObject *) | |
@@ -3899,6 +4089,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(BUILD_SLICE): { | |
+ logOp("BUILD_SLICE", stack_pointer, STACK_LEVEL(), f, oparg); | |
PyObject *start, *stop, *step, *slice; | |
if (oparg == 3) | |
step = POP(); | |
@@ -3917,6 +4108,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(FORMAT_VALUE): { | |
+ logOp("FORMAT_VALUE", stack_pointer, STACK_LEVEL(), f, oparg); | |
/* Handles f-string value formatting. */ | |
PyObject *result; | |
PyObject *fmt_spec; | |
@@ -3977,6 +4169,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
} | |
case TARGET(EXTENDED_ARG): { | |
+ logOp("EXTENDED_ARG", stack_pointer, STACK_LEVEL(), f, oparg); | |
int oldoparg = oparg; | |
NEXTOPARG(); | |
oparg |= oldoparg << 8; | |
@@ -4116,7 +4309,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag) | |
dtrace_function_return(f); | |
_Py_LeaveRecursiveCall(tstate); | |
tstate->frame = f->f_back; | |
- | |
return _Py_CheckFunctionResult(tstate, NULL, retval, __func__); | |
} | |
@@ -5349,7 +5541,7 @@ call_function(PyThreadState *tstate, PyObject ***pp_stack, Py_ssize_t oparg, PyO | |
Py_ssize_t nkwargs = (kwnames == NULL) ? 0 : PyTuple_GET_SIZE(kwnames); | |
Py_ssize_t nargs = oparg - nkwargs; | |
PyObject **stack = (*pp_stack) - nargs - nkwargs; | |
- | |
+ | |
if (tstate->use_tracing) { | |
x = trace_call_function(tstate, func, stack, nargs, kwnames); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
>>> l = [1] | |
PUSH_FRAME names: ('l',) consts: (1, None) locals: () | |
Stack(0): [] | |
LOAD_CONST(0) on #1 | |
Stack(1): [1] | |
BUILD_LIST(1) on #1 | |
Stack(1): [<object list>] | |
STORE_NAME(0) on #1 | |
Stack(0): [] | |
LOAD_CONST(1) on #1 | |
Stack(1): [None] | |
RETURN_VALUE(0) on #1 | |
>>> l.append(3) | |
PUSH_FRAME names: ('l', 'append') consts: (3, None) locals: () | |
Stack(0): [] | |
LOAD_NAME(0) on #1 | |
Stack(1): [<object list>] | |
LOAD_METHOD(1) on #1 | |
Stack(2): [<object list>, <method_descriptor list.append()>] | |
LOAD_CONST(0) on #1 | |
Stack(3): [3, <object list>, <method_descriptor list.append()>] | |
CALL_METHOD(1) on #1 | |
Stack(1): [None] | |
PRINT_EXPR(0) on #1 | |
Stack(0): [] | |
LOAD_CONST(1) on #1 | |
Stack(1): [None] | |
RETURN_VALUE(0) on #1 | |
>>> append = l.append | |
PUSH_FRAME names: ('l', 'append') consts: (None,) locals: () | |
Stack(0): [] | |
LOAD_NAME(0) on #1 | |
Stack(1): [<object list>] | |
LOAD_ATTR(1) on #1 | |
Stack(1): [<builtin_function_or_method list.append()>] | |
STORE_NAME(1) on #1 | |
Stack(0): [] | |
LOAD_CONST(0) on #1 | |
Stack(1): [None] | |
RETURN_VALUE(0) on #1 | |
>>> append(4) | |
PUSH_FRAME names: ('append',) consts: (4, None) locals: () | |
Stack(0): [] | |
LOAD_NAME(0) on #1 | |
Stack(1): [<builtin_function_or_method list.append()>] | |
LOAD_CONST(0) on #1 | |
Stack(2): [4, <builtin_function_or_method list.append()>] | |
CALL_FUNCTION(1) on #1 | |
Stack(1): [None] | |
PRINT_EXPR(0) on #1 | |
Stack(0): [] | |
LOAD_CONST(1) on #1 | |
Stack(1): [None] | |
RETURN_VALUE(0) on #1 | |
>>> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment