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

Reply via email to