Romain Guillebert, 24.05.2011 19:22:
On Tue, May 24, 2011 at 06:56:19AM +0200, Stefan Behnel wrote:
Romain Guillebert, 23.05.2011 20:33:
I'm doing the PyPy backend for Cython Summer of Code project and I would
like to know if there is a way of getting the AST Node responsible for
the declaration of a variable.
For example :
def func():
def func():
pass
func()
In the situation where I'm currently traversing the function call, I
would like to get the function declaration node.
Is there already something to do that ?
What for? What kind of information do you need from it?
In Cython, the metadata about a name is stored in its symbol table
entry. The call to "func" is a SimpleCallNode that holds a NameNode
which has an "entry" attribute. The entry knows the name, type,
signature, etc. of the function that is being called.
Note, however, that you need to run both the "analyse declarations"
step and the "analyse types/expression" step to figure out all
information about the name. The declaration analysis will add the
definition of "func" to the symbol table, so you can look it up
("env.lookup('func')") from that point on.
Does that help?
Stefan
I want to generate standard python function from "cdef extern from"
function, but I need to annotate these function as they may require a
special treatment (for passing value by reference), also, I may turn C
macros into a call to a C function returning the macro itself.
cdef extern from "stdio.h":
cdef int BUFSIZ
Will be turned into :
def get_BUFSIZ():
# whatever
So I need to turn every access to BUFSIZ into a function call.
Sounds to me like you should attach the necessary information to the symbol
table entry when analysing he "external" declaration. We currently store a
"cname", so adding something like a property name or accessor information
should fit your use case. We may want to reserve a separate namespace for
Python output related information, though. Maybe something like
"entry.pybackend.*"?
Also, we considered having module level properties at some point. That may
fall into the same bucket.
What should happen for cimported declarations? Will they be handled in the
same way as internally defined "external" declarations? I guess so, even if
they may be shared between modules.
Stefan
_______________________________________________
cython-devel mailing list
cython-devel@python.org
http://mail.python.org/mailman/listinfo/cython-devel