I am building a Python JIT, so I want to change the interp->eval_frame to my 
own function.

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.

Then when I ran python.exe, I got Segmentation Fault.

Why the address of the pointer didn't change, but the context change?

I am working on Mac OS X and Python 3.6.1. I want to know how to replace 
_PyEval_EvalFrameDefault in interp->eval_frame with my own function.
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to