make 'Py_ssize_t' and 'size_t' have lower rank than PY_LONG_LONG (related to #207)
authorLisandro Dalcin <dalcinl@gmail.com>
Tue, 10 Feb 2009 20:55:32 +0000 (18:55 -0200)
committerLisandro Dalcin <dalcinl@gmail.com>
Tue, 10 Feb 2009 20:55:32 +0000 (18:55 -0200)
Also add error testcase for signed/unsigned modifiers to Py_ssize_t, size_t,  float,  double, long double

Cython/Compiler/PyrexTypes.py
tests/errors/e_nosignword.pyx [new file with mode: 0644]

index 6022676bf0c346602e998ced2480468bd911def1..140852b78a6f71573aafe015cceda6019a0ae681 100644 (file)
@@ -462,9 +462,9 @@ class CNumericType(CType):
     default_value = "0"
     
     parsetuple_formats = ( # rank -> format
-        "BHIkK?????", # unsigned
-        "bhilL??fd?", # assumed signed
-        "bhilL??fd?", # explicitly signed
+        "BHIk??K???", # unsigned
+        "bhil??Lfd?", # assumed signed
+        "bhil??Lfd?", # explicitly signed
     )
     
     sign_words = ("unsigned ", "", "signed ")
@@ -593,12 +593,18 @@ class CPySSizeTType(CIntType):
     to_py_function = "PyInt_FromSsize_t"
     from_py_function = "__pyx_PyIndex_AsSsize_t"
 
+    def sign_and_name(self):
+        return rank_to_type_name[self.rank]
+
 
 class CSizeTType(CUIntType):
 
     to_py_function = "__pyx_PyInt_FromSize_t"
     from_py_function = "__pyx_PyInt_AsSize_t"
 
+    def sign_and_name(self):
+        return rank_to_type_name[self.rank]
+
 
 class CFloatType(CNumericType):
 
@@ -1157,9 +1163,9 @@ rank_to_type_name = (
     "short",        # 1
     "int",          # 2
     "long",         # 3
-    "PY_LONG_LONG", # 4
-    "Py_ssize_t",   # 5
-    "size_t",       # 6
+    "Py_ssize_t",   # 4
+    "size_t",       # 5
+    "PY_LONG_LONG", # 6
     "float",        # 7
     "double",       # 8
     "long double",  # 9
@@ -1175,23 +1181,23 @@ c_uchar_type =       CIntType(0, 0, "T_UBYTE")
 c_ushort_type =      CIntType(1, 0, "T_USHORT")
 c_uint_type =        CUIntType(2, 0, "T_UINT")
 c_ulong_type =       CULongType(3, 0, "T_ULONG")
-c_ulonglong_type =   CULongLongType(4, 0, "T_ULONGLONG")
+c_ulonglong_type =   CULongLongType(6, 0, "T_ULONGLONG")
 
 c_char_type =        CIntType(0, 1, "T_CHAR")
 c_short_type =       CIntType(1, 1, "T_SHORT")
 c_int_type =         CIntType(2, 1, "T_INT")
 c_long_type =        CIntType(3, 1, "T_LONG")
-c_longlong_type =    CLongLongType(4, 1, "T_LONGLONG")
+c_longlong_type =    CLongLongType(6, 1, "T_LONGLONG")
 c_bint_type =        CBIntType(2, 1, "T_INT")
 
 c_schar_type =       CIntType(0, 2, "T_CHAR")
 c_sshort_type =      CIntType(1, 2, "T_SHORT")
 c_sint_type =        CIntType(2, 2, "T_INT")
 c_slong_type =       CIntType(3, 2, "T_LONG")
-c_slonglong_type =   CLongLongType(4, 2, "T_LONGLONG")
+c_slonglong_type =   CLongLongType(6, 2, "T_LONGLONG")
 
-c_py_ssize_t_type =  CPySSizeTType(5, 1)
-c_size_t_type =      CSizeTType(6, 1)
+c_py_ssize_t_type =  CPySSizeTType(4, 2)
+c_size_t_type =      CSizeTType(5, 0)
 
 c_float_type =       CFloatType(7, "T_FLOAT")
 c_double_type =      CFloatType(8, "T_DOUBLE")
@@ -1223,25 +1229,26 @@ sign_and_rank_to_type = {
     (0, 1): c_ushort_type, 
     (0, 2): c_uint_type, 
     (0, 3): c_ulong_type,
-    (0, 4): c_ulonglong_type,
-    (0, 5): c_ulonglong_type, # XXX I'm not sure about this.
-    
+    (0, 6): c_ulonglong_type,
+
     (1, 0): c_char_type, 
     (1, 1): c_short_type, 
     (1, 2): c_int_type, 
     (1, 3): c_long_type,
-    (1, 4): c_longlong_type,
+    (1, 6): c_longlong_type,
 
     (2, 0): c_schar_type, 
     (2, 1): c_sshort_type, 
     (2, 2): c_sint_type, 
     (2, 3): c_slong_type,
-    (2, 4): c_slonglong_type,
+    (2, 6): c_slonglong_type, 
 
-    (1, 5): c_py_ssize_t_type,
-    (2, 5): c_py_ssize_t_type,
-    (0, 6): c_size_t_type,
-    (1, 6): c_size_t_type,
+    (0, 4): c_py_ssize_t_type,
+    (1, 4): c_py_ssize_t_type,
+    (2, 4): c_py_ssize_t_type,
+    (0, 5): c_size_t_type,
+    (1, 5): c_size_t_type,
+    (2, 5): c_size_t_type,
 
     (1, 7): c_float_type, 
     (1, 8): c_double_type,
@@ -1277,10 +1284,8 @@ modifiers_and_name_to_type = {
     (2, 2, "int"): c_slonglong_type,
 
     (1, 0, "Py_ssize_t"): c_py_ssize_t_type,
-    (2, 0, "Py_ssize_t"): c_py_ssize_t_type,
-    (0, 0, "size_t") : c_size_t_type,
     (1, 0, "size_t") : c_size_t_type,
-    
+
     (1, 0, "long"): c_long_type,
     (1, 0, "short"): c_short_type,
     (1, 0, "longlong"): c_longlong_type,
@@ -1418,7 +1423,7 @@ static INLINE Py_ssize_t __pyx_PyIndex_AsSsize_t(PyObject* b) {
 
 static INLINE PyObject * __pyx_PyInt_FromSize_t(size_t ival) {
 #if PY_VERSION_HEX < 0x02050000
-   if (ival <= (size_t)LONG_MAX)
+   if (ival <= LONG_MAX)
        return PyInt_FromLong((long)ival);
    else {
        unsigned char *bytes = (unsigned char *) &ival;
diff --git a/tests/errors/e_nosignword.pyx b/tests/errors/e_nosignword.pyx
new file mode 100644 (file)
index 0000000..9a5c86d
--- /dev/null
@@ -0,0 +1,24 @@
+cdef signed   Py_ssize_t  a
+cdef unsigned Py_ssize_t  b
+cdef signed   size_t      c
+cdef unsigned size_t      d
+cdef signed   float       e
+cdef unsigned float       f
+cdef signed   double      g
+cdef unsigned double      h
+cdef signed   long double i
+cdef unsigned long double j
+
+
+_ERRORS = u"""
+1:5: Unrecognised type modifier combination
+2:5: Unrecognised type modifier combination
+3:5: Unrecognised type modifier combination
+4:5: Unrecognised type modifier combination
+5:5: Unrecognised type modifier combination
+6:5: Unrecognised type modifier combination
+7:5: Unrecognised type modifier combination
+8:5: Unrecognised type modifier combination
+9:5: Unrecognised type modifier combination
+10:5: Unrecognised type modifier combination
+"""