Developing a Python JIT and have trouble

dieter dieter at
Sat Apr 1 03:38:54 EDT 2017

Yuheng Zou <zouyuheng1998 at> writes:
> ...
> I built a C++ library which contains EvalFrame function, and then use dlopen and dlsym to use it. It looks like this:
> extern "C" PyObject *EvalFrame(PyFrameObject *f, int throwflag) {
>     return _PyEval_EvalFrameDefault(f, throwflag);
> }
> I added following code to Python/pylifecycle.c at function _Py_InitializeEx_Private(Python version is 3.6.1):
> void *pyjit = NULL;
> pyjit = dlopen("../cmake-build-debug/libPubbon.dylib", 0);
> if (pyjit != NULL) {
>     interp->eval_frame = (_PyFrameEvalFunction)dlsym(pyjit, "EvalFrame");
>     //interp->eval_frame = _PyEval_EvalFrameDefault;
> } 
> Then something strange happened. I used LLDB to trace the variables. When it ran at EvalFrame, the address of f pointer didn't change, but f->f_lineno changed.
It may not be very surprising that the lineno changes during execution.
It should correspond to the line of the code currently executed.

> Then when I ran python.exe, I got Segmentation Fault.
> Why the address of the pointer didn't change, but the context change?

Some structure fields (such as lineno) may be expected to change.

In addition, the interpreter is using some global variables to
maintain state - variables that may change e.g. during thread switches.

The "SIGSEGV" might indicate that the structure has been freed --
and is now used for different things.

More information about the Python-list mailing list