Kurt, I have a preliminary (working) patch for this... However, I'm
stacked about a mess issue in the codebase related to
'{from|to}_py_function' class members and the
'create_{from|to}_py_utility_code()' methods, all of them defined in
PyrexTypes, and used in other parts...Until this mess (well, It seems a mess to me, though perhaps I'm confused ) get fixed (I'm certainly in doubt about what to do), I guess my patch will break something... Robert, Have you anything to add? Can you imagine a possible way of refactoring all that? On Thu, Jun 18, 2009 at 2:10 PM, Kurt Smith<[email protected]> wrote: > In the failing example below, it seems that the size of an argument type for a > cdef function is not resolved at runtime when that argument type is an extern > ctypedef. All the arguments to bfn() are therefore ints, which is incorrect. > It seems that this falls under ticket 303's domain, since the user shouldn't > care about the 'true' size of a datatype, whether its used inside a function > or > in the function's argument list. > > external_defs.h: > > [snip] > typedef char CharTypedef; > typedef short ShortTypedef; > typedef int IntTypedef; > typedef long LongTypedef; > #if defined(T_LONGLONG) > typedef PY_LONG_LONG LongLongTypedef; > #else > typedef long LongLongTypedef; > #endif > [snip] > > bug_T1000.pyx: > > """ >>>> test_ints() > """ > > cdef extern from "external_defs.h": > ctypedef int CharTypedef > ctypedef int ShortTypedef > ctypedef int IntTypedef > ctypedef int LongTypedef > ctypedef int LongLongTypedef > > def test_ints(): > cdef CharTypedef ct = 2**(8*sizeof(CharTypedef)-1)-1 # 127 > cdef ShortTypedef st = 2**(8*sizeof(ShortTypedef)-1)-1 # 32767 > cdef IntTypedef it = 2**(8*sizeof(IntTypedef)-1)-1 # 2147483647 > cdef LongTypedef lt = 2**(8*sizeof(LongTypedef)-1)-1 # > processor dependent... > cdef LongLongTypedef llt = 2**(8*sizeof(LongLongTypedef)-1)-1 # > processor dependent... > assert (ct, st, it, lt, llt) == bfn(ct, st, it, lt, llt) > > def bfn(CharTypedef ct, ShortTypedef st, IntTypedef it, LongTypedef > lt, LongLongTypedef llt): > return (ct, st, it, lt, llt) > > 8<------------------------------------------------------------------------------------- > > Running the above gives: > > ====================================================================== > FAIL: Doctest: bug_T1000 > ---------------------------------------------------------------------- > Traceback (most recent call last): > File "/usr/lib/python2.6/doctest.py", line 2145, in runTest > raise self.failureException(self.format_failure(new.getvalue())) > AssertionError: Failed doctest test for bug_T1000 > File "/home/ksmith/GSoC/cython-devel-303-reg/BUILD/run/c/bug_T1000.so", > line 164, in bug_T1000 > > ---------------------------------------------------------------------- > File "/home/ksmith/GSoC/cython-devel-303-reg/BUILD/run/c/bug_T1000.so", > line 166, in bug_T1000 > Failed example: > test_ints() > Exception raised: > Traceback (most recent call last): > File "/usr/lib/python2.6/doctest.py", line 1241, in __run > compileflags, 1) in test.globs > File "<doctest bug_T1000[0]>", line 1, in <module> > test_ints() > File "bug_T1000.pyx", line 18, in bug_T1000.test_ints (bug_T1000.c:525) > File "bug_T1000.pyx", line 20, in bug_T1000.bfn (bug_T1000.c:647) > OverflowError: value too large to convert to int > > > ====================================================================== > FAIL: Doctest: bug_T1000 > ---------------------------------------------------------------------- > Traceback (most recent call last): > File "/usr/lib/python2.6/doctest.py", line 2145, in runTest > raise self.failureException(self.format_failure(new.getvalue())) > AssertionError: Failed doctest test for bug_T1000 > File "/home/ksmith/GSoC/cython-devel-303-reg/BUILD/run/cpp/bug_T1000.so", > line 115, in bug_T1000 > > ---------------------------------------------------------------------- > File "/home/ksmith/GSoC/cython-devel-303-reg/BUILD/run/cpp/bug_T1000.so", > line 117, in bug_T1000 > Failed example: > test_ints() > Exception raised: > Traceback (most recent call last): > File "/usr/lib/python2.6/doctest.py", line 1241, in __run > compileflags, 1) in test.globs > File "<doctest bug_T1000[0]>", line 1, in <module> > test_ints() > File "bug_T1000.pyx", line 18, in bug_T1000.test_ints (bug_T1000.cpp:525) > File "bug_T1000.pyx", line 20, in bug_T1000.bfn (bug_T1000.cpp:647) > OverflowError: value too large to convert to int > > > ---------------------------------------------------------------------- > Ran 4 tests in 0.757s > > FAILED (failures=2) > _______________________________________________ > Cython-dev mailing list > [email protected] > http://codespeak.net/mailman/listinfo/cython-dev > -- Lisandro Dalcín --------------- Centro Internacional de Métodos Computacionales en Ingeniería (CIMEC) Instituto de Desarrollo Tecnológico para la Industria Química (INTEC) Consejo Nacional de Investigaciones Científicas y Técnicas (CONICET) PTLC - Güemes 3450, (3000) Santa Fe, Argentina Tel/Fax: +54-(0)342-451.1594 _______________________________________________ Cython-dev mailing list [email protected] http://codespeak.net/mailman/listinfo/cython-dev
