[Cython] CEP1000: Native dispatch through callables

Dag Sverre Seljebotn d.s.seljebotn at astro.uio.no
Sun Apr 15 08:58:03 CEST 2012


Ah, Cython objects. Didn't think of that. More below.

On 04/14/2012 11:02 PM, Stefan Behnel wrote:
> Hi,
>
> thanks for writing this up. Comments inline as I read through it.
>
> Dag Sverre Seljebotn, 14.04.2012 21:08:
>> each described by a function pointer and a signature specification
>> string, such as "id)i" for {{{int f(int, double)}}}.
>
> How do we deal with object argument types? Do we care on the caller side?
> Functions might have alternative signatures that differ in the type of
> their object parameters. Or should we handle this inside of the caller and
> expect that it's something like a fused function with internal dispatch in
> that case?
 >
 > Personally, I think there is not enough to gain from object 
parameters that
 > we should handle it on the caller side. The callee can dispatch those if
 > necessary.
 >
 > What about signatures that require an object when we have a C typed 
value?
 >
 > What about signatures that require a C typed argument when we have an
 > arbitrary object value in our call parameters?
 >
 > We should also strip the "self" argument from the parameter list of
 > methods. That's handled by the attribute lookup before even getting 
at the
 > callable.

On 04/15/2012 07:59 AM, Robert Bradshaw wrote:
 > It would certainly be useful to have special syntax for memory views
 > (after nailing down a well-defined ABI for them) and builtin types.
 > Being able to declare something as taking a
 > "sage.rings.integer.Integer" could also prove useful, but could result
 > in long (and prefix-sharing) signatures, favoring the
 > runtime-allocated ids.


I do think describing Cython objects in this cross-tool CEP would work 
nicely, this is for standardized ABIs only (we can't do memoryviews 
either until their ABI is standard).

I think I prefer to a) exclude it now, and b) down the line we need 
another cross-tool ABI to communicate vtables, and then we could put 
that into this CEP now.

I strongly believe we should go with the Go "duck-typing" approach for 
interfaces, i.e. it is not the declared name that should be compared but 
the method names and signatures.

The only question that needs answering for CEP1000 is: Would this blow 
up the signature string enough that interning is the only viable option?

Some strcmp solutions:

  a) Hash each vtable descriptor to 160-bits, and assume the hash is 
unique. Still, a couple of interfaces would blow up the signature string 
a lot.

  b) Modify approach B in CEP 1000 to this: If it is longer than 160 
bits, take a full cryptographic hash, and just assume there won't be 
hash collisions (like git does). This still saves for short signature 
strings, and avoids interning at the cost of doing 160-bit comparisons.

Both of these require other ways at getting at the actual string data. 
But I still like b) above better than interning.

Dag


More information about the cython-devel mailing list