[Cython] unexpected side-effect in cython utility code
markflorisson88 at gmail.com
Fri Oct 14 17:18:19 CEST 2011
On 14 October 2011 14:02, Stefan Behnel <stefan_ml at behnel.de> wrote:
> I started working on better malloc() support and wrote this code as a test
> to get going:
> cimport cython
> def test_malloc(int n):
> with cython.malloc(n*sizeof(int)) as m:
> for i in range(n):
> m[i] = i
> l = [ m[i] for i in range(n) ]
> return l
> Now, when I compile this normally, I get a compiler error about "malloc" not
> being a cython attribute. However, when I do the same in the test runner, it
> compiles without errors and crashes when trying to run the test. The code it
> generates for the 'with' statement above starts like this:
> __pyx_t_1 = PyObject_GetAttr(((PyObject *)malloc((__pyx_v_n *
> (sizeof(int))))), __pyx_n_s____exit__); /*...*/
> It appears that something has declared malloc(). I'm pretty sure it's this
> code in UtilityCode.py:
> def declare_in_scope(self, dest_scope, used=False, cython_scope=None):
> Declare all entries from the utility code in dest_scope. Code will
> only be included for used entries. If module_name is given,
> declare the type entries with that name.
> tree = self.get_tree(entries_only=True, cython_scope=cython_scope)
> entries = tree.scope.entries
> for name, entry in entries.iteritems():
> entry.utility_code_definition = self
> entry.used = used
> Basically, it declares everything it finds except for an explicit blacklist.
> Bad design. As I argued before, it should use a whitelist in the utility
> code file instead, which specifically lists the names that should be public.
> Everything else should just be considered implementation details.
> cython-devel mailing list
> cython-devel at python.org
That would indeed be better, I just never got around to it and I must
admit that it was never my priority.
About cython.malloc, wouldn't it be nicer if we had automatic (stack
or heap allocated) arrays? e.g.
def func(int n):
cdef int array[n]
I think you usually have homogenous data anyway. When you return, it
simply goes out of scope like normal automatic variables, I see no
clear advantage to 'with' here.
More information about the cython-devel