Hello,

cy exec print(localvar)

currently does not work. And I need your help to fix it.


If I'm not mistaken, the function "_fill_locals_dict" in libcython.py is
supposed to find and set all local variables.

The "for name, cyvar in iterator:" correctly iterates over all local
variables, but cyvar.type is not PythonObject but CObject.

The cython line "localvar= 49" gets translated to the C-line
"__pyx_v_localvar = 49;". Notice how the type of__pyx_v_localvar is long
and not a static PyObject*  . If an equivalent "static PyObject*" would
exist in the C-code, I would know how to make 'cy exec print(localvar)'
work (the reason why global variables work, is because they are of type
static PyObject*).


I see two ways to make `cy exec print(localvar)` work:

1. Let cygdb generate C-code to convert a long (or any other type) to an
equivalent static PyObject* (For long's it would be
__Pyx_PyInt_From_long). Then let cygdb execute this code by running
gdb.parse_and_eval(code). Then read the resulting variable with
something like

code = '''
                    (PyObject *) PyDict_SetItem(
                        (PyObject *) %d,
                        (PyObject *) %d,
                        (PyObject *) %s)
                ''' % (local_dict_pointer, pystringp, cname)

gdb.parse_and_eval(code)


2. Compile the argument of cy exec (in this case "print(localvar)") to
C-code (while getting the local variables right) and run it using
gdb.parse_and_eval(code).


Ideally, cy exec var=123 should work like cy set var=123.



Example to reproduce it:

codefile.pyx:

def func():
    localvar = 49
    print(localvar)
func()


setup.py:

#!/usr/bin/env python
from setuptools import setup, Extension
from Cython.Build import cythonize
extensions = Extension('codefile', sources=['codefile.pyx'])
setup(
    author = 'Volker Weissmann',
    author_email = 'volker.weissm...@gmx.de',
    ext_modules = cythonize(
        extensions,
        gdb_debug=True,
    ),
)


.cygdbinit:

cy break codefile:3
cy run
cy print localvar


To reproduce it, run:
python setup.py build_ext --inplace
cygdb . -- -q --args python -c "import codefile"


With a debug version of Python.

_______________________________________________
cython-devel mailing list
cython-devel@python.org
https://mail.python.org/mailman/listinfo/cython-devel

Reply via email to