Stefan Behnel | 7 Aug 2012 11:53
Picon
Favicon

[Cython] automatically raise MemoryError on exceptional C return values

Hi,

given how ubiquitous manual memory management is in C, I think it would be
nice to let Cython generate the exception raising also for C, not only for
C++. The difference is this:

  cdef extern from "...":
      char* make_new_buffer() except NULL as MemoryError
      int append_to_buffer(char* buffer, char* value) \
                                     except -1 as MemoryError

  c_buffer = make_new_buffer()           # raises MemoryError on NULL
  append_to_buffer(c_buffer, "testdata") # raises MemoryError on -1
  append_to_buffer(c_buffer, "moredata") # raises MemoryError on -1

versus this:

   cdef extern from "...":
       char* make_new_buffer()
       int append_to_buffer(char* buffer, char* value)

   c_buffer = make_new_buffer()
   if c_buffer is NULL:
       raise MemoryError()
   if append_to_buffer(c_buffer, "testdata") == -1:
       raise MemoryError()
   if append_to_buffer(c_buffer, "moredata") == -1:
       raise MemoryError()

I don't think it's necessary to support this for anything but MemoryError,
(Continue reading)

mark florisson | 7 Aug 2012 12:33
Picon
Gravatar

Re: [Cython] automatically raise MemoryError on exceptional C return values

On 7 August 2012 10:53, Stefan Behnel <stefan_ml@...> wrote:
> Hi,
>
> given how ubiquitous manual memory management is in C, I think it would be
> nice to let Cython generate the exception raising also for C, not only for
> C++. The difference is this:
>
>   cdef extern from "...":
>       char* make_new_buffer() except NULL as MemoryError
>       int append_to_buffer(char* buffer, char* value) \
>                                      except -1 as MemoryError
>
>   c_buffer = make_new_buffer()           # raises MemoryError on NULL
>   append_to_buffer(c_buffer, "testdata") # raises MemoryError on -1
>   append_to_buffer(c_buffer, "moredata") # raises MemoryError on -1
>
> versus this:
>
>    cdef extern from "...":
>        char* make_new_buffer()
>        int append_to_buffer(char* buffer, char* value)
>
>    c_buffer = make_new_buffer()
>    if c_buffer is NULL:
>        raise MemoryError()
>    if append_to_buffer(c_buffer, "testdata") == -1:
>        raise MemoryError()
>    if append_to_buffer(c_buffer, "moredata") == -1:
>        raise MemoryError()
>
(Continue reading)

Stefan Behnel | 7 Aug 2012 12:44
Picon
Favicon

Re: [Cython] automatically raise MemoryError on exceptional C return values

mark florisson, 07.08.2012 12:33:
> I'd say write a wrapper function that does the check, or use an object
> that encapsulates the buffer allocation and functions. I'm not sure
> we'd want extra syntax for this. Calling functions is already
> complicated, this will complicate it even further.

Funny to see this written by someone who bloats the entire type system with
buffers, memory views and slice types, just to keep people from calculating
index offsets into arrays.

Stefan ;o)

mark florisson | 7 Aug 2012 12:59
Picon
Gravatar

Re: [Cython] automatically raise MemoryError on exceptional C return values

On 7 August 2012 11:44, Stefan Behnel <stefan_ml@...> wrote:
> mark florisson, 07.08.2012 12:33:
>> I'd say write a wrapper function that does the check, or use an object
>> that encapsulates the buffer allocation and functions. I'm not sure
>> we'd want extra syntax for this. Calling functions is already
>> complicated, this will complicate it even further.
>
> Funny to see this written by someone who bloats the entire type system with
> buffers, memory views and slice types, just to keep people from calculating
> index offsets into arrays.

The only type that was added was the memoryview type, which is
supposed to *replace* the buffer type. And it does much more than
index calculation. So... yeah. Let's not make a technical discussion
personal.

> Stefan ;o)
>
> _______________________________________________
> cython-devel mailing list
> cython-devel@...
> http://mail.python.org/mailman/listinfo/cython-devel
mark florisson | 7 Aug 2012 13:00
Picon
Gravatar

Re: [Cython] automatically raise MemoryError on exceptional C return values

On 7 August 2012 11:59, mark florisson <markflorisson88@...> wrote:
> On 7 August 2012 11:44, Stefan Behnel <stefan_ml@...> wrote:
>> mark florisson, 07.08.2012 12:33:
>>> I'd say write a wrapper function that does the check, or use an object
>>> that encapsulates the buffer allocation and functions. I'm not sure
>>> we'd want extra syntax for this. Calling functions is already
>>> complicated, this will complicate it even further.
>>
>> Funny to see this written by someone who bloats the entire type system with
>> buffers, memory views and slice types, just to keep people from calculating
>> index offsets into arrays.
>
> The only type that was added was the memoryview type, which is
> supposed to *replace* the buffer type. And it does much more than
> index calculation. So... yeah. Let's not make a technical discussion
> personal.

Besides, feedback seems to suggest people are happy with this "bloat".

>> Stefan ;o)
>>
>> _______________________________________________
>> cython-devel mailing list
>> cython-devel@...
>> http://mail.python.org/mailman/listinfo/cython-devel
Stefan Behnel | 7 Aug 2012 13:22
Picon
Favicon

Re: [Cython] automatically raise MemoryError on exceptional C return values

mark florisson, 07.08.2012 13:00:
> On 7 August 2012 11:59, mark florisson wrote:
>> On 7 August 2012 11:44, Stefan Behnel wrote:
>>> mark florisson, 07.08.2012 12:33:
>>>> I'd say write a wrapper function that does the check, or use an object
>>>> that encapsulates the buffer allocation and functions. I'm not sure
>>>> we'd want extra syntax for this. Calling functions is already
>>>> complicated, this will complicate it even further.
>>>
>>> Funny to see this written by someone who bloats the entire type system with
>>> buffers, memory views and slice types, just to keep people from calculating
>>> index offsets into arrays.
>>
>> The only type that was added was the memoryview type, which is
>> supposed to *replace* the buffer type. And it does much more than
>> index calculation. So... yeah. Let's not make a technical discussion
>> personal.
> 
> Besides, feedback seems to suggest people are happy with this "bloat".

Sorry if you took my comment any serious. It wasn't meant that way. I was
only sarcastically suggesting that there are different kinds of users, and
to those who don't care about one of the bigger features (in terms of
code), it will look like serious code bloat for no good reason. The whole
buffer related code is just too excellent an example for that to let the
opportunity pass silently. C++ is just another, and I'm sure there are
other areas that add a lot of code to the compiler that a substantial
subset of our users won't trigger in their whole life. And I'm not saying
that's a bad thing.

(Continue reading)

Robert Bradshaw | 9 Aug 2012 01:45
Picon

Re: [Cython] automatically raise MemoryError on exceptional C return values

On Tue, Aug 7, 2012 at 2:53 AM, Stefan Behnel <stefan_ml@...> wrote:
> Hi,
>
> given how ubiquitous manual memory management is in C, I think it would be
> nice to let Cython generate the exception raising also for C, not only for
> C++. The difference is this:
>
>   cdef extern from "...":
>       char* make_new_buffer() except NULL as MemoryError
>       int append_to_buffer(char* buffer, char* value) \
>                                      except -1 as MemoryError
>
>   c_buffer = make_new_buffer()           # raises MemoryError on NULL
>   append_to_buffer(c_buffer, "testdata") # raises MemoryError on -1
>   append_to_buffer(c_buffer, "moredata") # raises MemoryError on -1
>
> versus this:
>
>    cdef extern from "...":
>        char* make_new_buffer()
>        int append_to_buffer(char* buffer, char* value)
>
>    c_buffer = make_new_buffer()
>    if c_buffer is NULL:
>        raise MemoryError()
>    if append_to_buffer(c_buffer, "testdata") == -1:
>        raise MemoryError()
>    if append_to_buffer(c_buffer, "moredata") == -1:
>        raise MemoryError()
>
(Continue reading)

Stefan Behnel | 9 Aug 2012 07:12
Picon
Favicon

Re: [Cython] automatically raise MemoryError on exceptional C return values

Robert Bradshaw, 09.08.2012 01:45:
> On Tue, Aug 7, 2012 at 2:53 AM, Stefan Behnel wrote:
>> given how ubiquitous manual memory management is in C, I think it would be
>> nice to let Cython generate the exception raising also for C, not only for
>> C++. The difference is this:
>>
>>   cdef extern from "...":
>>       char* make_new_buffer() except NULL as MemoryError
>>       int append_to_buffer(char* buffer, char* value) \
>>                                      except -1 as MemoryError
>>
>>   c_buffer = make_new_buffer()           # raises MemoryError on NULL
>>   append_to_buffer(c_buffer, "testdata") # raises MemoryError on -1
>>   append_to_buffer(c_buffer, "moredata") # raises MemoryError on -1
>>
>> versus this:
>>
>>    cdef extern from "...":
>>        char* make_new_buffer()
>>        int append_to_buffer(char* buffer, char* value)
>>
>>    c_buffer = make_new_buffer()
>>    if c_buffer is NULL:
>>        raise MemoryError()
>>    if append_to_buffer(c_buffer, "testdata") == -1:
>>        raise MemoryError()
>>    if append_to_buffer(c_buffer, "moredata") == -1:
>>        raise MemoryError()
>>
>> I don't think it's necessary to support this for anything but MemoryError,
(Continue reading)

Robert Bradshaw | 9 Aug 2012 09:15
Picon

Re: [Cython] automatically raise MemoryError on exceptional C return values

On Wed, Aug 8, 2012 at 10:12 PM, Stefan Behnel <stefan_ml@...> wrote:
> Robert Bradshaw, 09.08.2012 01:45:
>> On Tue, Aug 7, 2012 at 2:53 AM, Stefan Behnel wrote:
>>> given how ubiquitous manual memory management is in C, I think it would be
>>> nice to let Cython generate the exception raising also for C, not only for
>>> C++. The difference is this:
>>>
>>>   cdef extern from "...":
>>>       char* make_new_buffer() except NULL as MemoryError
>>>       int append_to_buffer(char* buffer, char* value) \
>>>                                      except -1 as MemoryError
>>>
>>>   c_buffer = make_new_buffer()           # raises MemoryError on NULL
>>>   append_to_buffer(c_buffer, "testdata") # raises MemoryError on -1
>>>   append_to_buffer(c_buffer, "moredata") # raises MemoryError on -1
>>>
>>> versus this:
>>>
>>>    cdef extern from "...":
>>>        char* make_new_buffer()
>>>        int append_to_buffer(char* buffer, char* value)
>>>
>>>    c_buffer = make_new_buffer()
>>>    if c_buffer is NULL:
>>>        raise MemoryError()
>>>    if append_to_buffer(c_buffer, "testdata") == -1:
>>>        raise MemoryError()
>>>    if append_to_buffer(c_buffer, "moredata") == -1:
>>>        raise MemoryError()
>>>
(Continue reading)


Gmane