On Jun 10, 2009, at 5:45 PM, Ondrej Certik wrote: > On Wed, Apr 29, 2009 at 4:00 PM, Robert > Bradshaw<[email protected]> wrote: >> On Apr 29, 2009, at 2:49 PM, Ondrej Certik wrote: >> >>>>> >>>>> Not sure--have you tried without the locals decorator in the >>>>> Python >>>>> source? I hope this isn't a regression. >>>> >>>> Yes, as you can see, the locals is commented out. I'll try to >>>> bisect >>>> it to see which commit broke it. >>> >>> Ok, so it never worked. I am a bit confused, because I thought the >>> pure python mode worked fine for me before. >>> >>> In the current cython --- is there any way to keep a pure python >>> code, >>> and create an accompanying pxd file that would annotate the cdef >>> functions and classes? >> >> This should work, that's how I implemented this a long time ago. If >> it's not working now it's because something broke (or, I'm not >> promising that it's completely bug-free, but it should be good--we >> use it to bootstrap Cython itself). > > So I made it to work by observing how things are done in Cython > itself. > > If you do: > > git clone git://github.com/certik/cython-test.git > cd cython-test > cython fact.pyx > > then it produces nicely optimized fact.c file. However, if you do: > > cython fact.py > > it produces a fact.c, that compiles, but it is not optimized --- the > "i" and "r" variables are python objects, not ints, even though my > fact.pxd file contains: > > import cython > > @cython.locals(i=cython.int, r=cython.int) > cdef int factorial(int n) > > > Do you see anything wrong with my files? Is this supposed to work? > > I think it is not implemented yet, because when I looked at the cython > sources, it doesn't work there either. This is the relevant part of > Scanning.pxd: > > @cython.locals(current_level=cython.long, new_level=cython.long) > cpdef indentation_action(self, text) > > and here is the declaration in the generated Scanning.c: > > PyObject *__pyx_v_new_level; > > > And consider for example the following chunk: > > /* "/home/ondrej/repos/cython-devel/Cython/Compiler/Scanning.py":398 > * new_level = len(text) > * #print "Changing indent level from", current_level, "to", > new_level ### > * if new_level == current_level: # <<<<<<<<<<<<<< > * return > * elif new_level > current_level: > */ > __pyx_t_4 = PyObject_RichCompare(__pyx_v_new_level, > __pyx_v_current_level, Py_EQ); if (unlikely(!__pyx_t_4)) > {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno = > __LINE__; goto __pyx_L1_error;} > __Pyx_GOTREF(__pyx_t_4); > __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_3 > < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 398; __pyx_clineno > = __LINE__; goto __pyx_L1_error;} > __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; > if (__pyx_t_3) { > > > both the new_level and current_level are declared as long, but above > you can see that Cython is calling lots of Python C/API methods...
Looks like a bug to me. http://trac.cython.org/cython_trac/ticket/330 - Robert _______________________________________________ Cython-dev mailing list [email protected] http://codespeak.net/mailman/listinfo/cython-dev
