Skip to content

Instantly share code, notes, and snippets.

@airportyh
Created December 15, 2020 19:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save airportyh/641b2a7e3412237a5970ca8ce64e7770 to your computer and use it in GitHub Desktop.
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.
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);
}
>>> 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