From e02375cc7f25c2210acd441f107f196af7e78b94 Mon Sep 17 00:00:00 2001 From: Mikhail Borisov Date: Sat, 8 Jun 2019 19:21:15 +0300 Subject: [PATCH 1/2] Always pass module_globals dict to linecache methods to support PEP-302 loaders. Without `module_globals`, getline()/getlines() only try to load source from filesystem. In order to find source for non-filesystem modules, `module_globals` should be passed, which allows linecache to query module loader (found via `__loader__` global name in module). --- src/hunter/_event.c | 368 ++++++++++++++++++++++++------------------ src/hunter/_event.pyx | 10 +- src/hunter/event.py | 10 +- 3 files changed, 225 insertions(+), 163 deletions(-) diff --git a/src/hunter/_event.c b/src/hunter/_event.c index 78ef8ab3..bb1b381d 100644 --- a/src/hunter/_event.c +++ b/src/hunter/_event.c @@ -809,7 +809,7 @@ static const char *__pyx_f[] = { "src/hunter/_event.pyx", "stringsource", "src/hunter/_event.pxd", - ".tox/cythonize/lib/python3.6/site-packages/Cython/Includes/cpython/type.pxd", + ".tox/cythonize/lib/python3.5/site-packages/Cython/Includes/cpython/type.pxd", "src/hunter/_tracer.pxd", }; @@ -869,7 +869,7 @@ struct __pyx_obj_6hunter_6_event_Event { /* "hunter/_event.pyx":214 * * - * def yield_lines(filename, start, list collector, # <<<<<<<<<<<<<< + * def yield_lines(filename, module_globals, start, list collector, # <<<<<<<<<<<<<< * limit=10): * dedent = None */ @@ -881,6 +881,7 @@ struct __pyx_obj_6hunter_6_event___pyx_scope_struct__yield_lines { PyObject *__pyx_v_filename; PyObject *__pyx_v_limit; PyObject *__pyx_v_line; + PyObject *__pyx_v_module_globals; PyObject *__pyx_v_start; PyObject *__pyx_t_0; Py_ssize_t __pyx_t_1; @@ -1800,6 +1801,7 @@ static const char __pyx_k_hunter__event[] = "hunter._event"; static const char __pyx_k_pkg_resources[] = "pkg_resources"; static const char __pyx_k_reduce_cython[] = "__reduce_cython__"; static const char __pyx_k_current_thread[] = "current_thread"; +static const char __pyx_k_module_globals[] = "module_globals"; static const char __pyx_k_raw_fullsource[] = "_raw_fullsource"; static const char __pyx_k_generate_tokens[] = "generate_tokens"; static const char __pyx_k_get_main_thread[] = "get_main_thread"; @@ -1872,6 +1874,7 @@ static PyObject *__pyx_n_s_main; static PyObject *__pyx_n_s_main_thread; static PyObject *__pyx_n_s_module; static PyObject *__pyx_kp_s_module_2; +static PyObject *__pyx_n_s_module_globals; static PyObject *__pyx_n_s_name; static PyObject *__pyx_n_s_name_2; static PyObject *__pyx_n_s_next; @@ -1934,7 +1937,7 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_5calls___get__(struct __pyx_obj static PyObject *__pyx_pf_6hunter_6_event_5Event_6tracer___get__(struct __pyx_obj_6hunter_6_event_Event *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_6hunter_6_event_5Event_4__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_6hunter_6_event_Event *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_6hunter_6_event_5Event_6__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_6hunter_6_event_Event *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state); /* proto */ -static PyObject *__pyx_pf_6hunter_6_event_yield_lines(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_filename, PyObject *__pyx_v_start, PyObject *__pyx_v_collector, PyObject *__pyx_v_limit); /* proto */ +static PyObject *__pyx_pf_6hunter_6_event_yield_lines(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_filename, PyObject *__pyx_v_module_globals, PyObject *__pyx_v_start, PyObject *__pyx_v_collector, PyObject *__pyx_v_limit); /* proto */ static PyObject *__pyx_tp_new_6hunter_6_event_Event(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ static PyObject *__pyx_tp_new_6hunter_6_event___pyx_scope_struct__yield_lines(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ static PyObject *__pyx_int_1; @@ -4560,7 +4563,7 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_6source___get__(struct __pyx_ob * if self.filename.endswith(('.so', '.pyd')): * self._source = "??? NO SOURCE: not reading {} file".format(splitext(basename(self.filename))[1]) # <<<<<<<<<<<<<< * try: - * self._source = getline(self.filename, self.lineno) + * self._source = getline(self.filename, self.lineno, self.frame.f_globals) */ __Pyx_TraceLine(184,0,__PYX_ERR(0, 184, __pyx_L1_error)) __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_NO_SOURCE_not_reading_file, __pyx_n_s_format); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 184, __pyx_L1_error) @@ -4641,7 +4644,7 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_6source___get__(struct __pyx_ob * if self.filename.endswith(('.so', '.pyd')): * self._source = "??? NO SOURCE: not reading {} file".format(splitext(basename(self.filename))[1]) * try: # <<<<<<<<<<<<<< - * self._source = getline(self.filename, self.lineno) + * self._source = getline(self.filename, self.lineno, self.frame.f_globals) * except Exception as exc: */ __Pyx_TraceLine(185,0,__PYX_ERR(0, 185, __pyx_L1_error)) @@ -4657,7 +4660,7 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_6source___get__(struct __pyx_ob /* "hunter/_event.pyx":186 * self._source = "??? NO SOURCE: not reading {} file".format(splitext(basename(self.filename))[1]) * try: - * self._source = getline(self.filename, self.lineno) # <<<<<<<<<<<<<< + * self._source = getline(self.filename, self.lineno, self.frame.f_globals) # <<<<<<<<<<<<<< * except Exception as exc: * self._source = "??? NO SOURCE: {!r}".format(exc) */ @@ -4682,8 +4685,8 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_6source___get__(struct __pyx_ob } #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_5)) { - PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_t_6, __pyx_t_4}; - __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_14, 2+__pyx_t_14); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 186, __pyx_L5_error) + PyObject *__pyx_temp[4] = {__pyx_t_7, __pyx_t_6, __pyx_t_4, __pyx_v_self->frame->f_globals}; + __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_14, 3+__pyx_t_14); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 186, __pyx_L5_error) __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; @@ -4692,8 +4695,8 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_6source___get__(struct __pyx_ob #endif #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) { - PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_t_6, __pyx_t_4}; - __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_14, 2+__pyx_t_14); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 186, __pyx_L5_error) + PyObject *__pyx_temp[4] = {__pyx_t_7, __pyx_t_6, __pyx_t_4, __pyx_v_self->frame->f_globals}; + __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_14, 3+__pyx_t_14); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 186, __pyx_L5_error) __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; @@ -4701,7 +4704,7 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_6source___get__(struct __pyx_ob } else #endif { - __pyx_t_8 = PyTuple_New(2+__pyx_t_14); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 186, __pyx_L5_error) + __pyx_t_8 = PyTuple_New(3+__pyx_t_14); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 186, __pyx_L5_error) __Pyx_GOTREF(__pyx_t_8); if (__pyx_t_7) { __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_7); __pyx_t_7 = NULL; @@ -4710,6 +4713,9 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_6source___get__(struct __pyx_ob PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_14, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_14, __pyx_t_4); + __Pyx_INCREF(__pyx_v_self->frame->f_globals); + __Pyx_GIVEREF(__pyx_v_self->frame->f_globals); + PyTuple_SET_ITEM(__pyx_t_8, 2+__pyx_t_14, __pyx_v_self->frame->f_globals); __pyx_t_6 = 0; __pyx_t_4 = 0; __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_8, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 186, __pyx_L5_error) @@ -4727,7 +4733,7 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_6source___get__(struct __pyx_ob * if self.filename.endswith(('.so', '.pyd')): * self._source = "??? NO SOURCE: not reading {} file".format(splitext(basename(self.filename))[1]) * try: # <<<<<<<<<<<<<< - * self._source = getline(self.filename, self.lineno) + * self._source = getline(self.filename, self.lineno, self.frame.f_globals) * except Exception as exc: */ } @@ -4747,7 +4753,7 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_6source___get__(struct __pyx_ob /* "hunter/_event.pyx":187 * try: - * self._source = getline(self.filename, self.lineno) + * self._source = getline(self.filename, self.lineno, self.frame.f_globals) * except Exception as exc: # <<<<<<<<<<<<<< * self._source = "??? NO SOURCE: {!r}".format(exc) * @@ -4765,7 +4771,7 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_6source___get__(struct __pyx_ob /*try:*/ { /* "hunter/_event.pyx":188 - * self._source = getline(self.filename, self.lineno) + * self._source = getline(self.filename, self.lineno, self.frame.f_globals) * except Exception as exc: * self._source = "??? NO SOURCE: {!r}".format(exc) # <<<<<<<<<<<<<< * @@ -4798,7 +4804,7 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_6source___get__(struct __pyx_ob /* "hunter/_event.pyx":187 * try: - * self._source = getline(self.filename, self.lineno) + * self._source = getline(self.filename, self.lineno, self.frame.f_globals) * except Exception as exc: # <<<<<<<<<<<<<< * self._source = "??? NO SOURCE: {!r}".format(exc) * @@ -4861,7 +4867,7 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_6source___get__(struct __pyx_ob * if self.filename.endswith(('.so', '.pyd')): * self._source = "??? NO SOURCE: not reading {} file".format(splitext(basename(self.filename))[1]) * try: # <<<<<<<<<<<<<< - * self._source = getline(self.filename, self.lineno) + * self._source = getline(self.filename, self.lineno, self.frame.f_globals) * except Exception as exc: */ __Pyx_XGIVEREF(__pyx_t_11); @@ -5041,7 +5047,7 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_15_raw_fullsource___get__(struc * try: * for _, token, _, _, line in generate_tokens(partial( # <<<<<<<<<<<<<< * next, - * yield_lines(self.filename, self.lineno - 1, lines) + * yield_lines(self.filename, self.frame.f_globals, self.lineno - 1, lines) */ __Pyx_TraceLine(199,0,__PYX_ERR(0, 199, __pyx_L6_error)) __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_generate_tokens); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 199, __pyx_L6_error) @@ -5053,7 +5059,7 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_15_raw_fullsource___get__(struc * try: * for _, token, _, _, line in generate_tokens(partial( * next, # <<<<<<<<<<<<<< - * yield_lines(self.filename, self.lineno - 1, lines) + * yield_lines(self.filename, self.frame.f_globals, self.lineno - 1, lines) * )): */ __Pyx_TraceLine(200,0,__PYX_ERR(0, 200, __pyx_L6_error)) @@ -5063,7 +5069,7 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_15_raw_fullsource___get__(struc /* "hunter/_event.pyx":201 * for _, token, _, _, line in generate_tokens(partial( * next, - * yield_lines(self.filename, self.lineno - 1, lines) # <<<<<<<<<<<<<< + * yield_lines(self.filename, self.frame.f_globals, self.lineno - 1, lines) # <<<<<<<<<<<<<< * )): * if token in ("def", "class", "lambda"): */ @@ -5091,8 +5097,8 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_15_raw_fullsource___get__(struc } #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_13)) { - PyObject *__pyx_temp[4] = {__pyx_t_15, __pyx_t_14, __pyx_t_16, __pyx_v_lines}; - __pyx_t_12 = __Pyx_PyFunction_FastCall(__pyx_t_13, __pyx_temp+1-__pyx_t_17, 3+__pyx_t_17); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 201, __pyx_L6_error) + PyObject *__pyx_temp[5] = {__pyx_t_15, __pyx_t_14, __pyx_v_self->frame->f_globals, __pyx_t_16, __pyx_v_lines}; + __pyx_t_12 = __Pyx_PyFunction_FastCall(__pyx_t_13, __pyx_temp+1-__pyx_t_17, 4+__pyx_t_17); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 201, __pyx_L6_error) __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0; __Pyx_GOTREF(__pyx_t_12); __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; @@ -5101,8 +5107,8 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_15_raw_fullsource___get__(struc #endif #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_13)) { - PyObject *__pyx_temp[4] = {__pyx_t_15, __pyx_t_14, __pyx_t_16, __pyx_v_lines}; - __pyx_t_12 = __Pyx_PyCFunction_FastCall(__pyx_t_13, __pyx_temp+1-__pyx_t_17, 3+__pyx_t_17); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 201, __pyx_L6_error) + PyObject *__pyx_temp[5] = {__pyx_t_15, __pyx_t_14, __pyx_v_self->frame->f_globals, __pyx_t_16, __pyx_v_lines}; + __pyx_t_12 = __Pyx_PyCFunction_FastCall(__pyx_t_13, __pyx_temp+1-__pyx_t_17, 4+__pyx_t_17); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 201, __pyx_L6_error) __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0; __Pyx_GOTREF(__pyx_t_12); __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; @@ -5110,18 +5116,21 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_15_raw_fullsource___get__(struc } else #endif { - __pyx_t_18 = PyTuple_New(3+__pyx_t_17); if (unlikely(!__pyx_t_18)) __PYX_ERR(0, 201, __pyx_L6_error) + __pyx_t_18 = PyTuple_New(4+__pyx_t_17); if (unlikely(!__pyx_t_18)) __PYX_ERR(0, 201, __pyx_L6_error) __Pyx_GOTREF(__pyx_t_18); if (__pyx_t_15) { __Pyx_GIVEREF(__pyx_t_15); PyTuple_SET_ITEM(__pyx_t_18, 0, __pyx_t_15); __pyx_t_15 = NULL; } __Pyx_GIVEREF(__pyx_t_14); PyTuple_SET_ITEM(__pyx_t_18, 0+__pyx_t_17, __pyx_t_14); + __Pyx_INCREF(__pyx_v_self->frame->f_globals); + __Pyx_GIVEREF(__pyx_v_self->frame->f_globals); + PyTuple_SET_ITEM(__pyx_t_18, 1+__pyx_t_17, __pyx_v_self->frame->f_globals); __Pyx_GIVEREF(__pyx_t_16); - PyTuple_SET_ITEM(__pyx_t_18, 1+__pyx_t_17, __pyx_t_16); + PyTuple_SET_ITEM(__pyx_t_18, 2+__pyx_t_17, __pyx_t_16); __Pyx_INCREF(__pyx_v_lines); __Pyx_GIVEREF(__pyx_v_lines); - PyTuple_SET_ITEM(__pyx_t_18, 2+__pyx_t_17, __pyx_v_lines); + PyTuple_SET_ITEM(__pyx_t_18, 3+__pyx_t_17, __pyx_v_lines); __pyx_t_14 = 0; __pyx_t_16 = 0; __pyx_t_12 = __Pyx_PyObject_Call(__pyx_t_13, __pyx_t_18, NULL); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 201, __pyx_L6_error) @@ -5200,7 +5209,7 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_15_raw_fullsource___get__(struc * try: * for _, token, _, _, line in generate_tokens(partial( # <<<<<<<<<<<<<< * next, - * yield_lines(self.filename, self.lineno - 1, lines) + * yield_lines(self.filename, self.frame.f_globals, self.lineno - 1, lines) */ __Pyx_TraceLine(199,0,__PYX_ERR(0, 199, __pyx_L6_error)) if (likely(PyList_CheckExact(__pyx_t_5)) || PyTuple_CheckExact(__pyx_t_5)) { @@ -5317,7 +5326,7 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_15_raw_fullsource___get__(struc __pyx_t_11 = 0; /* "hunter/_event.pyx":203 - * yield_lines(self.filename, self.lineno - 1, lines) + * yield_lines(self.filename, self.frame.f_globals, self.lineno - 1, lines) * )): * if token in ("def", "class", "lambda"): # <<<<<<<<<<<<<< * return ''.join(lines) @@ -5362,7 +5371,7 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_15_raw_fullsource___get__(struc goto __pyx_L10_try_return; /* "hunter/_event.pyx":203 - * yield_lines(self.filename, self.lineno - 1, lines) + * yield_lines(self.filename, self.frame.f_globals, self.lineno - 1, lines) * )): * if token in ("def", "class", "lambda"): # <<<<<<<<<<<<<< * return ''.join(lines) @@ -5375,7 +5384,7 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_15_raw_fullsource___get__(struc * try: * for _, token, _, _, line in generate_tokens(partial( # <<<<<<<<<<<<<< * next, - * yield_lines(self.filename, self.lineno - 1, lines) + * yield_lines(self.filename, self.frame.f_globals, self.lineno - 1, lines) */ __Pyx_TraceLine(199,0,__PYX_ERR(0, 199, __pyx_L6_error)) } @@ -5466,7 +5475,7 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_15_raw_fullsource___get__(struc /* "hunter/_event.pyx":208 * pass * - * return getline(self.filename, self.lineno) # <<<<<<<<<<<<<< + * return getline(self.filename, self.lineno, self.frame.f_globals) # <<<<<<<<<<<<<< * * def __getitem__(self, item): */ @@ -5492,8 +5501,8 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_15_raw_fullsource___get__(struc } #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_5)) { - PyObject *__pyx_temp[3] = {__pyx_t_18, __pyx_t_4, __pyx_t_12}; - __pyx_t_11 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_17, 2+__pyx_t_17); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 208, __pyx_L1_error) + PyObject *__pyx_temp[4] = {__pyx_t_18, __pyx_t_4, __pyx_t_12, __pyx_v_self->frame->f_globals}; + __pyx_t_11 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_17, 3+__pyx_t_17); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 208, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_18); __pyx_t_18 = 0; __Pyx_GOTREF(__pyx_t_11); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; @@ -5502,8 +5511,8 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_15_raw_fullsource___get__(struc #endif #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) { - PyObject *__pyx_temp[3] = {__pyx_t_18, __pyx_t_4, __pyx_t_12}; - __pyx_t_11 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_17, 2+__pyx_t_17); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 208, __pyx_L1_error) + PyObject *__pyx_temp[4] = {__pyx_t_18, __pyx_t_4, __pyx_t_12, __pyx_v_self->frame->f_globals}; + __pyx_t_11 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_17, 3+__pyx_t_17); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 208, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_18); __pyx_t_18 = 0; __Pyx_GOTREF(__pyx_t_11); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; @@ -5511,7 +5520,7 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_15_raw_fullsource___get__(struc } else #endif { - __pyx_t_10 = PyTuple_New(2+__pyx_t_17); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 208, __pyx_L1_error) + __pyx_t_10 = PyTuple_New(3+__pyx_t_17); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 208, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); if (__pyx_t_18) { __Pyx_GIVEREF(__pyx_t_18); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_18); __pyx_t_18 = NULL; @@ -5520,6 +5529,9 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_15_raw_fullsource___get__(struc PyTuple_SET_ITEM(__pyx_t_10, 0+__pyx_t_17, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_12); PyTuple_SET_ITEM(__pyx_t_10, 1+__pyx_t_17, __pyx_t_12); + __Pyx_INCREF(__pyx_v_self->frame->f_globals); + __Pyx_GIVEREF(__pyx_v_self->frame->f_globals); + PyTuple_SET_ITEM(__pyx_t_10, 2+__pyx_t_17, __pyx_v_self->frame->f_globals); __pyx_t_4 = 0; __pyx_t_12 = 0; __pyx_t_11 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_10, NULL); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 208, __pyx_L1_error) @@ -5566,7 +5578,7 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_15_raw_fullsource___get__(struc } /* "hunter/_event.pyx":210 - * return getline(self.filename, self.lineno) + * return getline(self.filename, self.lineno, self.frame.f_globals) * * def __getitem__(self, item): # <<<<<<<<<<<<<< * return getattr(self, item) @@ -5610,7 +5622,7 @@ static PyObject *__pyx_pf_6hunter_6_event_5Event_2__getitem__(struct __pyx_obj_6 goto __pyx_L0; /* "hunter/_event.pyx":210 - * return getline(self.filename, self.lineno) + * return getline(self.filename, self.lineno, self.frame.f_globals) * * def __getitem__(self, item): # <<<<<<<<<<<<<< * return getattr(self, item) @@ -6014,7 +6026,7 @@ static PyObject *__pyx_gb_6hunter_6_event_2generator(__pyx_CoroutineObject *__py /* "hunter/_event.pyx":214 * * - * def yield_lines(filename, start, list collector, # <<<<<<<<<<<<<< + * def yield_lines(filename, module_globals, start, list collector, # <<<<<<<<<<<<<< * limit=10): * dedent = None */ @@ -6024,6 +6036,7 @@ static PyObject *__pyx_pw_6hunter_6_event_1yield_lines(PyObject *__pyx_self, PyO static PyMethodDef __pyx_mdef_6hunter_6_event_1yield_lines = {"yield_lines", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6hunter_6_event_1yield_lines, METH_VARARGS|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_6hunter_6_event_1yield_lines(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_filename = 0; + PyObject *__pyx_v_module_globals = 0; PyObject *__pyx_v_start = 0; PyObject *__pyx_v_collector = 0; PyObject *__pyx_v_limit = 0; @@ -6031,13 +6044,15 @@ static PyObject *__pyx_pw_6hunter_6_event_1yield_lines(PyObject *__pyx_self, PyO __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("yield_lines (wrapper)", 0); { - static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_filename,&__pyx_n_s_start,&__pyx_n_s_collector,&__pyx_n_s_limit,0}; - PyObject* values[4] = {0,0,0,0}; - values[3] = ((PyObject *)__pyx_int_10); + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_filename,&__pyx_n_s_module_globals,&__pyx_n_s_start,&__pyx_n_s_collector,&__pyx_n_s_limit,0}; + PyObject* values[5] = {0,0,0,0,0}; + values[4] = ((PyObject *)__pyx_int_10); if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + CYTHON_FALLTHROUGH; case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); @@ -6056,21 +6071,27 @@ static PyObject *__pyx_pw_6hunter_6_event_1yield_lines(PyObject *__pyx_self, PyO else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: - if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_start)) != 0)) kw_args--; + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_module_globals)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("yield_lines", 0, 3, 4, 1); __PYX_ERR(0, 214, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("yield_lines", 0, 4, 5, 1); __PYX_ERR(0, 214, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: - if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_collector)) != 0)) kw_args--; + if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_start)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("yield_lines", 0, 3, 4, 2); __PYX_ERR(0, 214, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("yield_lines", 0, 4, 5, 2); __PYX_ERR(0, 214, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: + if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_collector)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("yield_lines", 0, 4, 5, 3); __PYX_ERR(0, 214, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_limit); - if (value) { values[3] = value; kw_args--; } + if (value) { values[4] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { @@ -6078,9 +6099,10 @@ static PyObject *__pyx_pw_6hunter_6_event_1yield_lines(PyObject *__pyx_self, PyO } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { - case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); CYTHON_FALLTHROUGH; - case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[0] = PyTuple_GET_ITEM(__pyx_args, 0); break; @@ -6088,20 +6110,21 @@ static PyObject *__pyx_pw_6hunter_6_event_1yield_lines(PyObject *__pyx_self, PyO } } __pyx_v_filename = values[0]; - __pyx_v_start = values[1]; - __pyx_v_collector = ((PyObject*)values[2]); - __pyx_v_limit = values[3]; + __pyx_v_module_globals = values[1]; + __pyx_v_start = values[2]; + __pyx_v_collector = ((PyObject*)values[3]); + __pyx_v_limit = values[4]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("yield_lines", 0, 3, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 214, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("yield_lines", 0, 4, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 214, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("hunter._event.yield_lines", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_collector), (&PyList_Type), 1, "collector", 1))) __PYX_ERR(0, 214, __pyx_L1_error) - __pyx_r = __pyx_pf_6hunter_6_event_yield_lines(__pyx_self, __pyx_v_filename, __pyx_v_start, __pyx_v_collector, __pyx_v_limit); + __pyx_r = __pyx_pf_6hunter_6_event_yield_lines(__pyx_self, __pyx_v_filename, __pyx_v_module_globals, __pyx_v_start, __pyx_v_collector, __pyx_v_limit); /* function exit code */ goto __pyx_L0; @@ -6112,7 +6135,7 @@ static PyObject *__pyx_pw_6hunter_6_event_1yield_lines(PyObject *__pyx_self, PyO return __pyx_r; } -static PyObject *__pyx_pf_6hunter_6_event_yield_lines(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_filename, PyObject *__pyx_v_start, PyObject *__pyx_v_collector, PyObject *__pyx_v_limit) { +static PyObject *__pyx_pf_6hunter_6_event_yield_lines(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_filename, PyObject *__pyx_v_module_globals, PyObject *__pyx_v_start, PyObject *__pyx_v_collector, PyObject *__pyx_v_limit) { struct __pyx_obj_6hunter_6_event___pyx_scope_struct__yield_lines *__pyx_cur_scope; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations @@ -6128,6 +6151,9 @@ static PyObject *__pyx_pf_6hunter_6_event_yield_lines(CYTHON_UNUSED PyObject *__ __pyx_cur_scope->__pyx_v_filename = __pyx_v_filename; __Pyx_INCREF(__pyx_cur_scope->__pyx_v_filename); __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_filename); + __pyx_cur_scope->__pyx_v_module_globals = __pyx_v_module_globals; + __Pyx_INCREF(__pyx_cur_scope->__pyx_v_module_globals); + __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_module_globals); __pyx_cur_scope->__pyx_v_start = __pyx_v_start; __Pyx_INCREF(__pyx_cur_scope->__pyx_v_start); __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_start); @@ -6162,13 +6188,14 @@ static PyObject *__pyx_gb_6hunter_6_event_2generator(__pyx_CoroutineObject *__py PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; - Py_ssize_t __pyx_t_4; - PyObject *(*__pyx_t_5)(PyObject *); - int __pyx_t_6; - int __pyx_t_7; - PyObject *__pyx_t_8 = NULL; - Py_ssize_t __pyx_t_9; - int __pyx_t_10; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + Py_ssize_t __pyx_t_6; + PyObject *(*__pyx_t_7)(PyObject *); + int __pyx_t_8; + int __pyx_t_9; + Py_ssize_t __pyx_t_10; + int __pyx_t_11; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("yield_lines", 0); __Pyx_TraceFrameInit(__pyx_codeobj__10) @@ -6185,11 +6212,11 @@ static PyObject *__pyx_gb_6hunter_6_event_2generator(__pyx_CoroutineObject *__py if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 214, __pyx_L1_error) /* "hunter/_event.pyx":216 - * def yield_lines(filename, start, list collector, + * def yield_lines(filename, module_globals, start, list collector, * limit=10): * dedent = None # <<<<<<<<<<<<<< * amount = 0 - * for line in getlines(filename)[start:start + limit]: + * for line in getlines(filename, module_globals)[start:start + limit]: */ __Pyx_TraceLine(216,0,__PYX_ERR(0, 216, __pyx_L1_error)) __Pyx_INCREF(Py_None); @@ -6200,7 +6227,7 @@ static PyObject *__pyx_gb_6hunter_6_event_2generator(__pyx_CoroutineObject *__py * limit=10): * dedent = None * amount = 0 # <<<<<<<<<<<<<< - * for line in getlines(filename)[start:start + limit]: + * for line in getlines(filename, module_globals)[start:start + limit]: * if dedent is None: */ __Pyx_TraceLine(217,0,__PYX_ERR(0, 217, __pyx_L1_error)) @@ -6209,7 +6236,7 @@ static PyObject *__pyx_gb_6hunter_6_event_2generator(__pyx_CoroutineObject *__py /* "hunter/_event.pyx":218 * dedent = None * amount = 0 - * for line in getlines(filename)[start:start + limit]: # <<<<<<<<<<<<<< + * for line in getlines(filename, module_globals)[start:start + limit]: # <<<<<<<<<<<<<< * if dedent is None: * dedent = LEADING_WHITESPACE_RE.findall(line) */ @@ -6217,6 +6244,7 @@ static PyObject *__pyx_gb_6hunter_6_event_2generator(__pyx_CoroutineObject *__py __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_getlines); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 218, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; + __pyx_t_4 = 0; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_3)) { @@ -6224,50 +6252,79 @@ static PyObject *__pyx_gb_6hunter_6_event_2generator(__pyx_CoroutineObject *__py __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); + __pyx_t_4 = 1; } } - __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_cur_scope->__pyx_v_filename) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_cur_scope->__pyx_v_filename); - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 218, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_cur_scope->__pyx_v_filename, __pyx_cur_scope->__pyx_v_module_globals}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_4, 2+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 218, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { + PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_cur_scope->__pyx_v_filename, __pyx_cur_scope->__pyx_v_module_globals}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_4, 2+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 218, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_1); + } else + #endif + { + __pyx_t_5 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 218, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + if (__pyx_t_3) { + __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3); __pyx_t_3 = NULL; + } + __Pyx_INCREF(__pyx_cur_scope->__pyx_v_filename); + __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_filename); + PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_4, __pyx_cur_scope->__pyx_v_filename); + __Pyx_INCREF(__pyx_cur_scope->__pyx_v_module_globals); + __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_module_globals); + PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_4, __pyx_cur_scope->__pyx_v_module_globals); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 218, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyNumber_Add(__pyx_cur_scope->__pyx_v_start, __pyx_cur_scope->__pyx_v_limit); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 218, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyObject_GetSlice(__pyx_t_1, 0, 0, &__pyx_cur_scope->__pyx_v_start, &__pyx_t_2, NULL, 0, 0, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 218, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyObject_GetSlice(__pyx_t_1, 0, 0, &__pyx_cur_scope->__pyx_v_start, &__pyx_t_2, NULL, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 218, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - if (likely(PyList_CheckExact(__pyx_t_3)) || PyTuple_CheckExact(__pyx_t_3)) { - __pyx_t_2 = __pyx_t_3; __Pyx_INCREF(__pyx_t_2); __pyx_t_4 = 0; - __pyx_t_5 = NULL; + if (likely(PyList_CheckExact(__pyx_t_5)) || PyTuple_CheckExact(__pyx_t_5)) { + __pyx_t_2 = __pyx_t_5; __Pyx_INCREF(__pyx_t_2); __pyx_t_6 = 0; + __pyx_t_7 = NULL; } else { - __pyx_t_4 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 218, __pyx_L1_error) + __pyx_t_6 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 218, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_5 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 218, __pyx_L1_error) + __pyx_t_7 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 218, __pyx_L1_error) } - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; for (;;) { - if (likely(!__pyx_t_5)) { + if (likely(!__pyx_t_7)) { if (likely(PyList_CheckExact(__pyx_t_2))) { - if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_2)) break; + if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_2)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_4); __Pyx_INCREF(__pyx_t_3); __pyx_t_4++; if (unlikely(0 < 0)) __PYX_ERR(0, 218, __pyx_L1_error) + __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_6); __Pyx_INCREF(__pyx_t_5); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 218, __pyx_L1_error) #else - __pyx_t_3 = PySequence_ITEM(__pyx_t_2, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 218, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 218, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); #endif } else { - if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_2)) break; + if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_2)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_4); __Pyx_INCREF(__pyx_t_3); __pyx_t_4++; if (unlikely(0 < 0)) __PYX_ERR(0, 218, __pyx_L1_error) + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_6); __Pyx_INCREF(__pyx_t_5); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 218, __pyx_L1_error) #else - __pyx_t_3 = PySequence_ITEM(__pyx_t_2, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 218, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 218, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); #endif } } else { - __pyx_t_3 = __pyx_t_5(__pyx_t_2); - if (unlikely(!__pyx_t_3)) { + __pyx_t_5 = __pyx_t_7(__pyx_t_2); + if (unlikely(!__pyx_t_5)) { PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); @@ -6275,27 +6332,27 @@ static PyObject *__pyx_gb_6hunter_6_event_2generator(__pyx_CoroutineObject *__py } break; } - __Pyx_GOTREF(__pyx_t_3); + __Pyx_GOTREF(__pyx_t_5); } __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_line); - __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_line, __pyx_t_3); - __Pyx_GIVEREF(__pyx_t_3); - __pyx_t_3 = 0; + __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_line, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; /* "hunter/_event.pyx":219 * amount = 0 - * for line in getlines(filename)[start:start + limit]: + * for line in getlines(filename, module_globals)[start:start + limit]: * if dedent is None: # <<<<<<<<<<<<<< * dedent = LEADING_WHITESPACE_RE.findall(line) * dedent = dedent[0] if dedent else "" */ __Pyx_TraceLine(219,0,__PYX_ERR(0, 219, __pyx_L1_error)) - __pyx_t_6 = (__pyx_cur_scope->__pyx_v_dedent == Py_None); - __pyx_t_7 = (__pyx_t_6 != 0); - if (__pyx_t_7) { + __pyx_t_8 = (__pyx_cur_scope->__pyx_v_dedent == Py_None); + __pyx_t_9 = (__pyx_t_8 != 0); + if (__pyx_t_9) { /* "hunter/_event.pyx":220 - * for line in getlines(filename)[start:start + limit]: + * for line in getlines(filename, module_globals)[start:start + limit]: * if dedent is None: * dedent = LEADING_WHITESPACE_RE.findall(line) # <<<<<<<<<<<<<< * dedent = dedent[0] if dedent else "" @@ -6304,28 +6361,28 @@ static PyObject *__pyx_gb_6hunter_6_event_2generator(__pyx_CoroutineObject *__py __Pyx_TraceLine(220,0,__PYX_ERR(0, 220, __pyx_L1_error)) __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_LEADING_WHITESPACE_RE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 220, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_findall); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 220, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_findall); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 220, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_8))) { - __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_8); + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_1)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_1); __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_8, function); + __Pyx_DECREF_SET(__pyx_t_3, function); } } - __pyx_t_3 = (__pyx_t_1) ? __Pyx_PyObject_Call2Args(__pyx_t_8, __pyx_t_1, __pyx_cur_scope->__pyx_v_line) : __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_cur_scope->__pyx_v_line); + __pyx_t_5 = (__pyx_t_1) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_1, __pyx_cur_scope->__pyx_v_line) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_cur_scope->__pyx_v_line); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 220, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 220, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_dedent); - __Pyx_DECREF_SET(__pyx_cur_scope->__pyx_v_dedent, __pyx_t_3); - __Pyx_GIVEREF(__pyx_t_3); - __pyx_t_3 = 0; + __Pyx_DECREF_SET(__pyx_cur_scope->__pyx_v_dedent, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; /* "hunter/_event.pyx":221 * if dedent is None: @@ -6335,20 +6392,20 @@ static PyObject *__pyx_gb_6hunter_6_event_2generator(__pyx_CoroutineObject *__py * elif not line.startswith(dedent): */ __Pyx_TraceLine(221,0,__PYX_ERR(0, 221, __pyx_L1_error)) - __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_dedent); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 221, __pyx_L1_error) - if (__pyx_t_7) { - __pyx_t_8 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_dedent, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 221, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_3 = __pyx_t_8; - __pyx_t_8 = 0; + __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_dedent); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 221, __pyx_L1_error) + if (__pyx_t_9) { + __pyx_t_3 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_dedent, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 221, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __pyx_t_3; + __pyx_t_3 = 0; } else { __Pyx_INCREF(__pyx_kp_s_); - __pyx_t_3 = __pyx_kp_s_; + __pyx_t_5 = __pyx_kp_s_; } __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_dedent); - __Pyx_DECREF_SET(__pyx_cur_scope->__pyx_v_dedent, __pyx_t_3); - __Pyx_GIVEREF(__pyx_t_3); - __pyx_t_3 = 0; + __Pyx_DECREF_SET(__pyx_cur_scope->__pyx_v_dedent, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; /* "hunter/_event.pyx":222 * dedent = LEADING_WHITESPACE_RE.findall(line) @@ -6358,12 +6415,12 @@ static PyObject *__pyx_gb_6hunter_6_event_2generator(__pyx_CoroutineObject *__py * break */ __Pyx_TraceLine(222,0,__PYX_ERR(0, 222, __pyx_L1_error)) - __pyx_t_9 = PyObject_Length(__pyx_cur_scope->__pyx_v_dedent); if (unlikely(__pyx_t_9 == ((Py_ssize_t)-1))) __PYX_ERR(0, 222, __pyx_L1_error) - __pyx_cur_scope->__pyx_v_amount = __pyx_t_9; + __pyx_t_10 = PyObject_Length(__pyx_cur_scope->__pyx_v_dedent); if (unlikely(__pyx_t_10 == ((Py_ssize_t)-1))) __PYX_ERR(0, 222, __pyx_L1_error) + __pyx_cur_scope->__pyx_v_amount = __pyx_t_10; /* "hunter/_event.pyx":219 * amount = 0 - * for line in getlines(filename)[start:start + limit]: + * for line in getlines(filename, module_globals)[start:start + limit]: * if dedent is None: # <<<<<<<<<<<<<< * dedent = LEADING_WHITESPACE_RE.findall(line) * dedent = dedent[0] if dedent else "" @@ -6379,27 +6436,27 @@ static PyObject *__pyx_gb_6hunter_6_event_2generator(__pyx_CoroutineObject *__py * collector.append(line) */ __Pyx_TraceLine(223,0,__PYX_ERR(0, 223, __pyx_L1_error)) - __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_line, __pyx_n_s_startswith); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 223, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_line, __pyx_n_s_startswith); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 223, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_8))) { - __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_8); + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_1)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_1); __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_8, function); + __Pyx_DECREF_SET(__pyx_t_3, function); } } - __pyx_t_3 = (__pyx_t_1) ? __Pyx_PyObject_Call2Args(__pyx_t_8, __pyx_t_1, __pyx_cur_scope->__pyx_v_dedent) : __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_cur_scope->__pyx_v_dedent); + __pyx_t_5 = (__pyx_t_1) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_1, __pyx_cur_scope->__pyx_v_dedent) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_cur_scope->__pyx_v_dedent); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 223, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 223, __pyx_L1_error) + if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 223, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = ((!__pyx_t_7) != 0); - if (__pyx_t_6) { + __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 223, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_8 = ((!__pyx_t_9) != 0); + if (__pyx_t_8) { /* "hunter/_event.pyx":224 * amount = len(dedent) @@ -6432,7 +6489,7 @@ static PyObject *__pyx_gb_6hunter_6_event_2generator(__pyx_CoroutineObject *__py PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append"); __PYX_ERR(0, 225, __pyx_L1_error) } - __pyx_t_10 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_collector, __pyx_cur_scope->__pyx_v_line); if (unlikely(__pyx_t_10 == ((int)-1))) __PYX_ERR(0, 225, __pyx_L1_error) + __pyx_t_11 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_collector, __pyx_cur_scope->__pyx_v_line); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(0, 225, __pyx_L1_error) /* "hunter/_event.pyx":226 * break @@ -6440,14 +6497,14 @@ static PyObject *__pyx_gb_6hunter_6_event_2generator(__pyx_CoroutineObject *__py * yield line[amount:] # <<<<<<<<<<<<<< */ __Pyx_TraceLine(226,0,__PYX_ERR(0, 226, __pyx_L1_error)) - __pyx_t_3 = __Pyx_PyObject_GetSlice(__pyx_cur_scope->__pyx_v_line, __pyx_cur_scope->__pyx_v_amount, 0, NULL, NULL, NULL, 1, 0, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 226, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_r = __pyx_t_3; - __pyx_t_3 = 0; + __pyx_t_5 = __Pyx_PyObject_GetSlice(__pyx_cur_scope->__pyx_v_line, __pyx_cur_scope->__pyx_v_amount, 0, NULL, NULL, NULL, 1, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 226, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; __Pyx_XGIVEREF(__pyx_t_2); __pyx_cur_scope->__pyx_t_0 = __pyx_t_2; - __pyx_cur_scope->__pyx_t_1 = __pyx_t_4; - __pyx_cur_scope->__pyx_t_2 = __pyx_t_5; + __pyx_cur_scope->__pyx_t_1 = __pyx_t_6; + __pyx_cur_scope->__pyx_t_2 = __pyx_t_7; __Pyx_XGIVEREF(__pyx_r); __Pyx_TraceReturn(__pyx_r, 0); __Pyx_RefNannyFinishContext(); @@ -6459,14 +6516,14 @@ static PyObject *__pyx_gb_6hunter_6_event_2generator(__pyx_CoroutineObject *__py __pyx_t_2 = __pyx_cur_scope->__pyx_t_0; __pyx_cur_scope->__pyx_t_0 = 0; __Pyx_XGOTREF(__pyx_t_2); - __pyx_t_4 = __pyx_cur_scope->__pyx_t_1; - __pyx_t_5 = __pyx_cur_scope->__pyx_t_2; + __pyx_t_6 = __pyx_cur_scope->__pyx_t_1; + __pyx_t_7 = __pyx_cur_scope->__pyx_t_2; if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 226, __pyx_L1_error) /* "hunter/_event.pyx":218 * dedent = None * amount = 0 - * for line in getlines(filename)[start:start + limit]: # <<<<<<<<<<<<<< + * for line in getlines(filename, module_globals)[start:start + limit]: # <<<<<<<<<<<<<< * if dedent is None: * dedent = LEADING_WHITESPACE_RE.findall(line) */ @@ -6479,7 +6536,7 @@ static PyObject *__pyx_gb_6hunter_6_event_2generator(__pyx_CoroutineObject *__py /* "hunter/_event.pyx":214 * * - * def yield_lines(filename, start, list collector, # <<<<<<<<<<<<<< + * def yield_lines(filename, module_globals, start, list collector, # <<<<<<<<<<<<<< * limit=10): * dedent = None */ @@ -6491,7 +6548,7 @@ static PyObject *__pyx_gb_6hunter_6_event_2generator(__pyx_CoroutineObject *__py __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("yield_lines", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_L0:; __Pyx_XDECREF(__pyx_r); __pyx_r = 0; @@ -6855,6 +6912,7 @@ static void __pyx_tp_dealloc_6hunter_6_event___pyx_scope_struct__yield_lines(PyO Py_CLEAR(p->__pyx_v_filename); Py_CLEAR(p->__pyx_v_limit); Py_CLEAR(p->__pyx_v_line); + Py_CLEAR(p->__pyx_v_module_globals); Py_CLEAR(p->__pyx_v_start); Py_CLEAR(p->__pyx_t_0); if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_6hunter_6_event___pyx_scope_struct__yield_lines < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_6hunter_6_event___pyx_scope_struct__yield_lines)))) { @@ -6882,6 +6940,9 @@ static int __pyx_tp_traverse_6hunter_6_event___pyx_scope_struct__yield_lines(PyO if (p->__pyx_v_line) { e = (*v)(p->__pyx_v_line, a); if (e) return e; } + if (p->__pyx_v_module_globals) { + e = (*v)(p->__pyx_v_module_globals, a); if (e) return e; + } if (p->__pyx_v_start) { e = (*v)(p->__pyx_v_start, a); if (e) return e; } @@ -7054,6 +7115,7 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_main_thread, __pyx_k_main_thread, sizeof(__pyx_k_main_thread), 0, 0, 1, 1}, {&__pyx_n_s_module, __pyx_k_module, sizeof(__pyx_k_module), 0, 0, 1, 1}, {&__pyx_kp_s_module_2, __pyx_k_module_2, sizeof(__pyx_k_module_2), 0, 0, 1, 0}, + {&__pyx_n_s_module_globals, __pyx_k_module_globals, sizeof(__pyx_k_module_globals), 0, 0, 1, 1}, {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, {&__pyx_n_s_name_2, __pyx_k_name_2, sizeof(__pyx_k_name_2), 0, 0, 1, 1}, {&__pyx_n_s_next, __pyx_k_next, sizeof(__pyx_k_next), 0, 0, 1, 1}, @@ -7195,14 +7257,14 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { /* "hunter/_event.pyx":214 * * - * def yield_lines(filename, start, list collector, # <<<<<<<<<<<<<< + * def yield_lines(filename, module_globals, start, list collector, # <<<<<<<<<<<<<< * limit=10): * dedent = None */ - __pyx_tuple__12 = PyTuple_Pack(7, __pyx_n_s_filename, __pyx_n_s_start, __pyx_n_s_collector, __pyx_n_s_limit, __pyx_n_s_dedent, __pyx_n_s_amount, __pyx_n_s_line); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(0, 214, __pyx_L1_error) + __pyx_tuple__12 = PyTuple_Pack(8, __pyx_n_s_filename, __pyx_n_s_module_globals, __pyx_n_s_start, __pyx_n_s_collector, __pyx_n_s_limit, __pyx_n_s_dedent, __pyx_n_s_amount, __pyx_n_s_line); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(0, 214, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__12); __Pyx_GIVEREF(__pyx_tuple__12); - __pyx_codeobj__10 = (PyObject*)__Pyx_PyCode_New(4, 0, 7, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__12, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_hunter__event_pyx, __pyx_n_s_yield_lines, 214, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__10)) __PYX_ERR(0, 214, __pyx_L1_error) + __pyx_codeobj__10 = (PyObject*)__Pyx_PyCode_New(5, 0, 8, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__12, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_src_hunter__event_pyx, __pyx_n_s_yield_lines, 214, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__10)) __PYX_ERR(0, 214, __pyx_L1_error) __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; @@ -8108,7 +8170,7 @@ if (!__Pyx_RefNanny) { /* "hunter/_event.pyx":214 * * - * def yield_lines(filename, start, list collector, # <<<<<<<<<<<<<< + * def yield_lines(filename, module_globals, start, list collector, # <<<<<<<<<<<<<< * limit=10): * dedent = None */ diff --git a/src/hunter/_event.pyx b/src/hunter/_event.pyx index 0f581ad9..3269df8b 100644 --- a/src/hunter/_event.pyx +++ b/src/hunter/_event.pyx @@ -183,7 +183,7 @@ cdef class Event: if self.filename.endswith(('.so', '.pyd')): self._source = "??? NO SOURCE: not reading {} file".format(splitext(basename(self.filename))[1]) try: - self._source = getline(self.filename, self.lineno) + self._source = getline(self.filename, self.lineno, self.frame.f_globals) except Exception as exc: self._source = "??? NO SOURCE: {!r}".format(exc) @@ -198,24 +198,24 @@ cdef class Event: try: for _, token, _, _, line in generate_tokens(partial( next, - yield_lines(self.filename, self.lineno - 1, lines) + yield_lines(self.filename, self.frame.f_globals, self.lineno - 1, lines) )): if token in ("def", "class", "lambda"): return ''.join(lines) except TokenError: pass - return getline(self.filename, self.lineno) + return getline(self.filename, self.lineno, self.frame.f_globals) def __getitem__(self, item): return getattr(self, item) -def yield_lines(filename, start, list collector, +def yield_lines(filename, module_globals, start, list collector, limit=10): dedent = None amount = 0 - for line in getlines(filename)[start:start + limit]: + for line in getlines(filename, module_globals)[start:start + limit]: if dedent is None: dedent = LEADING_WHITESPACE_RE.findall(line) dedent = dedent[0] if dedent else "" diff --git a/src/hunter/event.py b/src/hunter/event.py index 55d9768a..ed3242dd 100644 --- a/src/hunter/event.py +++ b/src/hunter/event.py @@ -262,7 +262,7 @@ def source(self): if self.filename.endswith(('.so', '.pyd')): return '??? NO SOURCE: not reading {} file'.format(splitext(basename(self.filename))[1]) try: - return linecache.getline(self.filename, self.lineno) + return linecache.getline(self.filename, self.lineno, self.frame.f_globals) except Exception as exc: return '??? NO SOURCE: {!r}'.format(exc) @@ -273,24 +273,24 @@ def _raw_fullsource(self): try: for _, token, _, _, line in tokenize.generate_tokens(partial( next, - yield_lines(self.filename, self.lineno - 1, lines.append) + yield_lines(self.filename, self.frame.f_globals, self.lineno - 1, lines.append) )): if token in ('def', 'class', 'lambda'): return ''.join(lines) except tokenize.TokenError: pass - return linecache.getline(self.filename, self.lineno) + return linecache.getline(self.filename, self.lineno, self.frame.f_globals) __getitem__ = object.__getattribute__ -def yield_lines(filename, start, collector, +def yield_lines(filename, module_globals, start, collector, limit=10, leading_whitespace_re=LEADING_WHITESPACE_RE): dedent = None amount = 0 - for line in linecache.getlines(filename)[start:start + limit]: + for line in linecache.getlines(filename, module_globals)[start:start + limit]: if dedent is None: dedent = leading_whitespace_re.findall(line) dedent = dedent[0] if dedent else "" From b6bda79d5d046553fee8082214cdb325e8a823fb Mon Sep 17 00:00:00 2001 From: Mikhail Borisov Date: Sat, 8 Jun 2019 23:13:27 +0300 Subject: [PATCH 2/2] Update AUTHORS, CHANGELOG --- AUTHORS.rst | 1 + CHANGELOG.rst | 1 + 2 files changed, 2 insertions(+) diff --git a/AUTHORS.rst b/AUTHORS.rst index d01607af..23a4efb1 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -3,3 +3,4 @@ Authors ======= * Ionel Cristian Mărieș - https://blog.ionelmc.ro +* Mikhail Borisov - https://github.com/borman diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 3785a186..2b13134f 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -15,6 +15,7 @@ Changelog * Fixed buggy filename handling when using Hunter in ipython/jupyter. Source code should be properly displayed now. * Removed ``globals`` option from ``VarsPrinter`` action. Globals are now always looked up. **BACKWARDS INCOMPATIBLE** * Added support for locals in ``VarsPrinter`` action. Now you can do ``VarsPrinter('len(foobar)')``. +* Always pass module_globals dict to linecache methods. Source code from PEP-302 loaders is now printed properly. * Various other minor dead code cleanup, style and docstring fixing. 2.2.1 (2019-01-19)