From zouyuheng1998 at gmail.com Sat Apr 1 05:20:51 2017 From: zouyuheng1998 at gmail.com (Yuheng Zou) Date: Sat, 1 Apr 2017 17:20:51 +0800 Subject: [Python-compilers] Developing a Python JIT and have troubld In-Reply-To: References: Message-ID: Thank you for your reply and your patience! I compiled your code and get the same output as yours. However my implementation is different from yours. While we both have an EvalFrame function, your implementation built an module in Python, but I prefer to modify Python source and compile a full distribution. To be more specific, I first implement an EvalFrame function, which is a simple call of _PyEval_EvalFrameDefault. I compile this function into a .so file. Then in Python/pylifecycle.c, I use dlsym to get the EvalFrame function to replace the function interp->eval_frame. So each time when interp->eval_frame(default as _PyEval_EvalFrameDefault) is called, what is really called is my EvalFrame function. This seems should be fine, but it doesn't work. My code is here: https://github.com/KuribohG/Python-JIT-problem To compile it, get a Python-3.6.1.tgz source from Python official website. Replace Python/pylifecycle.c with the one on github. Then use CMake to compile the libPubbon.so, and get into Python directory to make Python. It will give an error message, and the python.exe target cannot run. 2017-03-31 23:15 GMT+08:00 Siu Kwan Lam : > I have never tried PEP0523 before so I have just did a quick look and > pushed what I got to https://github.com/sklam/etude_py36_custom_jit. > > If you run https://github.com/sklam/etude_py36_custom_jit/blob/ > master/test.py, you should get the following printouts: > > Hello > Hey > Yes > ** myjit is evaluating frame=0x10c623048 lasti=-1 lineno=10 > Enter apple() > ** myjit is evaluating frame=0x7f9a74e02178 lasti=-1 lineno=16 > Enter orange() > Exit orange() > Exit apple() > ** myjit is evaluating frame=0x10c460d48 lasti=-1 lineno=27 > > The frame is different for each method. > > Can you try your implementation with my test so we can compare? > > On Thu, Mar 30, 2017 at 11:46 PM Yuheng Zou > wrote: > > 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. > > 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. > _______________________________________________ > Python-compilers mailing list > Python-compilers at python.org > https://mail.python.org/mailman/listinfo/python-compilers > > -- > Siu Kwan Lam > Software Engineer > Continuum Analytics > -------------- next part -------------- An HTML attachment was scrubbed... URL: From antoine at python.org Sat Apr 1 05:30:23 2017 From: antoine at python.org (Antoine Pitrou) Date: Sat, 1 Apr 2017 11:30:23 +0200 Subject: [Python-compilers] Developing a Python JIT and have troubld In-Reply-To: References: Message-ID: Le 01/04/2017 ? 11:20, Yuheng Zou a ?crit : > > To be more specific, I first implement an EvalFrame function, which is a > simple call of _PyEval_EvalFrameDefault. I compile this function into a > .so file. Then in Python/pylifecycle.c, I use dlsym to get the EvalFrame > function to replace the function interp->eval_frame. So each time when > interp->eval_frame(default as _PyEval_EvalFrameDefault) is called, what > is really called is my EvalFrame function. This seems should be fine, > but it doesn't work. What do you mean with "it doesn't work"? What Python code are you executing? Have you tried printing out other details of the frame? e.g. its code object and filename. > It will give an error message, and the python.exe target cannot run. What is the error message? Regards Antoine.