From zouyuheng1998 at gmail.com Fri Mar 31 00:38:30 2017 From: zouyuheng1998 at gmail.com (Yuheng Zou) Date: Fri, 31 Mar 2017 12:38:30 +0800 Subject: [Python-compilers] Developing a Python JIT and have troubld Message-ID: 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. -------------- next part -------------- An HTML attachment was scrubbed... URL: From siu at continuum.io Fri Mar 31 11:15:04 2017 From: siu at continuum.io (Siu Kwan Lam) Date: Fri, 31 Mar 2017 15:15:04 +0000 Subject: [Python-compilers] Developing a Python JIT and have troubld In-Reply-To: References: Message-ID: 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: