mark florisson, 26.04.2011 16:23:
I've been working a bit on fused types (http://wiki.cython.org/enhancements/fusedtypes), and I've got it to generate code for every permutation of specific types. Currently it only works for cdef functions. Now in SimpleCallNode I'm trying to use PyrexTypes.best_match() to find the function with the best signature, but it doesn't seem to take care of coercions, e.g. it calls 'assignable_from' on the dst_type (e.g. char *), but for BuiltinObjectType (a str) this returns false.
Which is correct. "char*" cannot coerce from/to "str". It can coerce to "bytes", though.
http://wiki.cython.org/enhancements/stringliterals
Why is this the case, don't calls to overloaded C++ methods need to dispatch properly here also?
If this doesn't work, I assume it just isn't implemented.
Other issues are public and api declarations. So should we support that at all? We could define a macro that calls a function that does the dispatch. So e.g. for this ctypedef cython.fused_type(typeA, typeB) dtype cdef func(dtype x): ... we would get two generated functions, say, __pyx_typeA_func and __pyx_typeB_func. So we could have a macro get_func(dtype) or something that then substitutes __pyx_get_func(#dtype), where __pyx_get_func returns the pointer to the right function based on the type names. I'm not sure we should support it, right now I just put the mangled names in the header. At least the cdef functions will be sharable between Cython implementation files.
I'm fine with explicitly forbidding this for now. It may eventually work for Python object types where we can properly dispatch, but it won't easily work for C types. It may work in C++, though.
I also noticed that for cdef functions with optional argument it gets a struct as argument, but this struct doesn't seem to end up in the header file when the function is declared public. I believe that also the typedefs for ctypedef-ed things in the .pyx file don't make it there when used to type a cdef function's arguments. Should that be fixed?
No, I think this should also become a compiler error. These functions are not meant to be called from C code. It's a Cython convenience feature. As long as it's not correctly supported on both ends of the publicly exported C-API, it's best to keep users from using it at all.
Stefan _______________________________________________ cython-devel mailing list cython-devel@python.org http://mail.python.org/mailman/listinfo/cython-devel