cannot use "id" in Rpython

What can I use then ? I need the address of the function ? [translation:ERROR] Exception: cannot use id() in RPython; see objectmodel.compute_xxx()Processing block: block@19 is a <class 'rpython.flowspace.flowcontext.SpamBlock'> in (pypy.module._vtune.interp_vtune:28)_get_full_name containing the following operations: buf_0 = simple_call((type RStringIO)) v943 = getattr(buf_0, ('write')) v944 = getattr(pycode_0, ('co_code')) v945 = simple_call(v943, v944) v946 = getattr(buf_0, ('getsize')) size_code_0 = simple_call(v946) v947 = getattr(pycode_0, ('co_name')) id_func_0 = id(v947) v948 = getattr(pycode_0, ('co_name')) v949 = simple_call((function _safe), v948) v950 = getattr(pycode_0, ('co_firstlineno')) v951 = getattr(pycode_0, ('co_filename')) v952 = simple_call((function _safe), v951) v953 = newtuple(v949, v950, v952, size_code_0, id_func_0) v954 = mod(('vtune:%s:%d:%s:%d:%d'), v953) --end--[translation] start debugger...> /opt/shubha_vtune_pypy/rpython/annotator/unaryop.py(188)id()-> raise Exception("cannot use id() in RPython; "(Pdb+)

What exactly are you trying to do. Using id to get the address of a function is usually a bad idea... -- Ryan (ライアン) Yoko Shimomura > ryo (supercell/EGOIST) > Hiroyuki Sawano >> everyone else http://kirbyfan64.github.io/ On Dec 29, 2016 1:19 PM, "Shubha Ramani via pypy-dev" <pypy-dev@python.org> wrote:

It's not a bad idea for me. I'm hooking up to a tool made by intel called "vtune" which requires the function name, function size and function address from the original python script code. I got the first two from Python reflection (the way VmProf does it) but I need the third (original script function address). Is __repr__ supported in Rpython ? The string returned by __repr__ contains the Python address at least in Python. If id() doesn't work but __repr__ does then I can use it in the overloaded execute_frame and that should be fine. Shubha

The id of an object is not necessarily related in any way to the address of an object in Python. In RPython, you can convert a function to a low-level function pointer with llhelper() from rpython.rtyper.annlowlevel. You can call it like this: fptr_type = lltype.Ptr(lltype.FuncType([], lltype.Void)) fptr = llhelper(fptr_type, func) Depending on what you want to do with the function address exactly, you might need to cast the function pointer to a RPython "Address" with cast_ptr_to_adr() from rpython.rtyper.lltypesystem.llmemory. On 2016-12-30 14:42, Shubha Ramani via pypy-dev wrote:

I don't know the signature of the function coming into execute_frame ahead of time. Therefore as you suggested Manuel,I am leaving the argument is an empty list []. This doesn't seem to work though. See the assertion error I'm getting below.All other examples of this technique I see being used are passing in specific argument types to define a succinctfunction signature, i.e. in test_warmstate.py: ENTER_JIT = lltype.Ptr(lltype.FuncType([lltype.Signed, lltype.Float, lltype.Signed], lltype.Bool)) The following causes an assertion error: fun_name = _safe(pycode.co_name) fptr_type = lltype.Ptr(lltype.FuncType([], lltype.Void)) fptr = llhelper(fptr_type, fun_name) [translation] start debugger...> /opt/shubha_vtune_pypy/rpython/rtyper/lltypesystem/lltype.py(776)constPtr()-> assert T.is_constant() On Friday, December 30, 2016 8:59 AM, Shubha Ramani <shubharamani@yahoo.com> wrote: This is very helpful. Thank you Manuel ! I will try your suggestion. Shubha

Hi Shubha, I forgot to mention that the code line starting with "fptr_type = " is valid Python code, but not valid RPython code. More details on this in the documentation [1]. You should be able to fix the error by moving the line to the module toplevel. -Manuel [1] http://rpython.readthedocs.io/en/latest/getting-started.html On 2016-12-30 19:10, Shubha Ramani wrote:

Thank you Manuel. Your answer here helped me in other ways - the thing about beingable to do things at the module top-level. That concept helped me a lot. You were right. I don't need id(var). Never did. I mis-understood. The JITTED load addressis all I needed and Armin already provided that in his vtune branch. Shubha On Monday, January 2, 2017 6:45 AM, Shubha Ramani via pypy-dev <pypy-dev@python.org> wrote: Thank you Manuel. Sent from Shubha Ramani's iPhone 7
_______________________________________________ pypy-dev mailing list pypy-dev@python.org https://mail.python.org/mailman/listinfo/pypy-dev

What exactly are you trying to do. Using id to get the address of a function is usually a bad idea... -- Ryan (ライアン) Yoko Shimomura > ryo (supercell/EGOIST) > Hiroyuki Sawano >> everyone else http://kirbyfan64.github.io/ On Dec 29, 2016 1:19 PM, "Shubha Ramani via pypy-dev" <pypy-dev@python.org> wrote:

It's not a bad idea for me. I'm hooking up to a tool made by intel called "vtune" which requires the function name, function size and function address from the original python script code. I got the first two from Python reflection (the way VmProf does it) but I need the third (original script function address). Is __repr__ supported in Rpython ? The string returned by __repr__ contains the Python address at least in Python. If id() doesn't work but __repr__ does then I can use it in the overloaded execute_frame and that should be fine. Shubha

The id of an object is not necessarily related in any way to the address of an object in Python. In RPython, you can convert a function to a low-level function pointer with llhelper() from rpython.rtyper.annlowlevel. You can call it like this: fptr_type = lltype.Ptr(lltype.FuncType([], lltype.Void)) fptr = llhelper(fptr_type, func) Depending on what you want to do with the function address exactly, you might need to cast the function pointer to a RPython "Address" with cast_ptr_to_adr() from rpython.rtyper.lltypesystem.llmemory. On 2016-12-30 14:42, Shubha Ramani via pypy-dev wrote:

I don't know the signature of the function coming into execute_frame ahead of time. Therefore as you suggested Manuel,I am leaving the argument is an empty list []. This doesn't seem to work though. See the assertion error I'm getting below.All other examples of this technique I see being used are passing in specific argument types to define a succinctfunction signature, i.e. in test_warmstate.py: ENTER_JIT = lltype.Ptr(lltype.FuncType([lltype.Signed, lltype.Float, lltype.Signed], lltype.Bool)) The following causes an assertion error: fun_name = _safe(pycode.co_name) fptr_type = lltype.Ptr(lltype.FuncType([], lltype.Void)) fptr = llhelper(fptr_type, fun_name) [translation] start debugger...> /opt/shubha_vtune_pypy/rpython/rtyper/lltypesystem/lltype.py(776)constPtr()-> assert T.is_constant() On Friday, December 30, 2016 8:59 AM, Shubha Ramani <shubharamani@yahoo.com> wrote: This is very helpful. Thank you Manuel ! I will try your suggestion. Shubha

Hi Shubha, I forgot to mention that the code line starting with "fptr_type = " is valid Python code, but not valid RPython code. More details on this in the documentation [1]. You should be able to fix the error by moving the line to the module toplevel. -Manuel [1] http://rpython.readthedocs.io/en/latest/getting-started.html On 2016-12-30 19:10, Shubha Ramani wrote:

Thank you Manuel. Your answer here helped me in other ways - the thing about beingable to do things at the module top-level. That concept helped me a lot. You were right. I don't need id(var). Never did. I mis-understood. The JITTED load addressis all I needed and Armin already provided that in his vtune branch. Shubha On Monday, January 2, 2017 6:45 AM, Shubha Ramani via pypy-dev <pypy-dev@python.org> wrote: Thank you Manuel. Sent from Shubha Ramani's iPhone 7
_______________________________________________ pypy-dev mailing list pypy-dev@python.org https://mail.python.org/mailman/listinfo/pypy-dev
participants (3)
-
Manuel Jacob
-
Ryan Gonzalez
-
Shubha Ramani