self.type = PyrexTypes.error_type
if self.index.type.is_pyobject:
self.index = self.index.coerce_to(
- PyrexTypes.c_int_type, env)
+ PyrexTypes.c_py_ssize_t_type, env)
if not self.index.type.is_int:
error(self.pos,
"Invalid index type '%s'" %
if self.stop:
self.stop.analyse_types(env)
self.base = self.base.coerce_to_pyobject(env)
- c_int = PyrexTypes.c_int_type
+ c_int = PyrexTypes.c_py_ssize_t_type
if self.start:
self.start = self.start.coerce_to(c_int, env)
if self.stop:
PyErr_SetString(PyExc_ValueError, "unpack sequence of wrong size");
}
-static PyObject *__Pyx_UnpackItem(PyObject *seq, int i) {
+static PyObject *__Pyx_UnpackItem(PyObject *seq, Py_ssize_t i) {
PyObject *item;
if (!(item = PySequence_GetItem(seq, i))) {
if (PyErr_ExceptionMatches(PyExc_IndexError))
return item;
}
-static int __Pyx_EndUnpack(PyObject *seq, int i) {
+static int __Pyx_EndUnpack(PyObject *seq, Py_ssize_t i) {
PyObject *item;
if (item = PySequence_GetItem(seq, i)) {
Py_DECREF(item);
def find_pxd_file(self, module_name, pos):
# Search include directories for the .pxd file
# corresponding to the given (full) module name.
- pxd_filename = "%s.pxd" % module_name
+ if "." in module_name:
+ pxd_filename = "%s.pxd" % os.path.join(*module_name.split('.'))
+ else:
+ pxd_filename = "%s.pxd" % module_name
return self.search_include_directories(pxd_filename, pos)
def find_include_file(self, filename, pos):
code.putln('/* Generated by Pyrex %s on %s */' % (
Version.version, time.asctime()))
code.putln('')
+ code.putln('#define PY_SSIZE_T_CLEAN')
for filename in env.python_include_files:
code.putln('#include "%s"' % filename)
code.putln("#ifndef PY_LONG_LONG")
code.putln(" #define PY_LONG_LONG LONG_LONG")
code.putln("#endif")
+ code.putln("#if PY_VERSION_HEX < 0x02050000")
+ code.putln(" typedef int Py_ssize_t;")
+ code.putln(" #define PY_SSIZE_T_MAX INT_MAX")
+ code.putln(" #define PY_SSIZE_T_MIN INT_MIN")
+ code.putln(" #define PyInt_FromSsize_t(z) PyInt_FromLong(z)")
+ code.putln(" #define PyInt_AsSsize_t(o) PyInt_AsLong(o)")
+ code.putln("#endif")
self.generate_extern_c_macro_definition(code)
code.putln("%s double pow(double, double);" % Naming.extern_c_macro)
self.generate_includes(env, cimported_modules, code)
# a __getitem__ method is present. It converts its
# argument to a Python integer and calls mp_subscript.
code.putln(
- "static PyObject *%s(PyObject *o, int i) {" %
+ "static PyObject *%s(PyObject *o, Py_ssize_t i) {" %
scope.mangle_internal("sq_item"))
code.putln(
"PyObject *r;")
code.putln(
- "PyObject *x = PyInt_FromLong(i); if(!x) return 0;")
+ "PyObject *x = PyInt_FromSsize_t(i); if(!x) return 0;")
code.putln(
"r = o->ob_type->tp_as_mapping->mp_subscript(o, x);")
code.putln(
del_entry = scope.lookup_here("__delslice__")
code.putln("")
code.putln(
- "static int %s(PyObject *o, int i, int j, PyObject *v) {" %
+ "static int %s(PyObject *o, Py_ssize_t i, Py_ssize_t j, PyObject *v) {" %
scope.mangle_internal("sq_ass_slice"))
code.putln(
"if (v) {")
"""
typedef struct {PyObject **p; char *s;} __Pyx_InternTabEntry; /*proto*/
typedef struct {PyObject **p; char *s; long n;} __Pyx_StringTabEntry; /*proto*/
-static PyObject *__Pyx_UnpackItem(PyObject *, int); /*proto*/
-static int __Pyx_EndUnpack(PyObject *, int); /*proto*/
+static PyObject *__Pyx_UnpackItem(PyObject *, Py_ssize_t); /*proto*/
+static int __Pyx_EndUnpack(PyObject *, Py_ssize_t); /*proto*/
static int __Pyx_PrintItem(PyObject *); /*proto*/
static int __Pyx_PrintNewline(void); /*proto*/
static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, char *name); /*proto*/
static int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/
static int __Pyx_GetStarArgs(PyObject **args, PyObject **kwds,\
- char *kwd_list[], int nargs, PyObject **args2, PyObject **kwds2); /*proto*/
+ char *kwd_list[], Py_ssize_t nargs, PyObject **args2, PyObject **kwds2); /*proto*/
static void __Pyx_WriteUnraisable(char *name); /*proto*/
static void __Pyx_AddTraceback(char *funcname); /*proto*/
static PyTypeObject *__Pyx_ImportType(char *module_name, char *class_name, long size); /*proto*/
return -1;
if (PyString_Check(v)) {
char *s = PyString_AsString(v);
- int len = PyString_Size(v);
+ Py_ssize_t len = PyString_Size(v);
if (len > 0 &&
isspace(Py_CHARMASK(s[len-1])) &&
s[len-1] != ' ')
}
if (PyString_Check(type))
;
- else if (PyClass_Check(type))
+/* else if (PyClass_Check(type)) */
+ else if (PyType_Check(type) || PyClass_Check(type))
; /*PyErr_NormalizeException(&type, &value, &tb);*/
else if (PyInstance_Check(type)) {
/* Raising an instance. The value should be a dummy. */
PyObject **args,
PyObject **kwds,
char *kwd_list[],
- int nargs,
+ Py_ssize_t nargs,
PyObject **args2,
PyObject **kwds2)
{
bad:
Py_XDECREF(args1);
Py_XDECREF(kwds1);
- if (*args2)
- Py_XDECREF(*args2);
- if (*kwds2)
- Py_XDECREF(*kwds2);
+ Py_XDECREF(*args2);
+ Py_XDECREF(*kwds2);
return -1;
}
"""
# "void", "signed", "unsigned"
#)
-basic_c_type_names = ("void", "char", "int", "float", "double")
+basic_c_type_names = ("void", "char", "int", "float", "double", "Py_ssize_t")
sign_and_longness_words = ("short", "long", "signed", "unsigned")
default_value = "0"
parsetuple_formats = ( # rank -> format
- "?HIkK???", # unsigned
- "chilLfd?", # signed
+ "?HIkK????", # unsigned
+ "chilL?fd?", # signed
)
def __init__(self, rank, signed = 1, pymemberdef_typecode = None):
self.is_returncode = is_returncode
+class CPySSizeTType(CIntType):
+
+ to_py_function = "PyInt_FromSsize_t"
+ from_py_function = "PyInt_AsSsize_t"
+
+
class CUIntType(CIntType):
to_py_function = "PyLong_FromUnsignedLong"
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_py_ssize_t_type = CPySSizeTType(5, 1)
c_uchar_type = CIntType(0, 0, "T_UBYTE")
c_ushort_type = CIntType(1, 0, "T_USHORT")
c_ulong_type = CULongType(3, 0, "T_ULONG")
c_ulonglong_type = CULongLongType(4, 0, "T_ULONGLONG")
-c_float_type = CFloatType(5, "T_FLOAT")
-c_double_type = CFloatType(6, "T_DOUBLE")
-c_longdouble_type = CFloatType(7)
+c_float_type = CFloatType(6, "T_FLOAT")
+c_double_type = CFloatType(7, "T_DOUBLE")
+c_longdouble_type = CFloatType(8)
c_null_ptr_type = CNullPtrType(c_void_type)
c_char_array_type = CCharArrayType(None)
error_type = ErrorType()
-lowest_float_rank = 5
+lowest_float_rank = 6
rank_to_type_name = (
"char", # 0
"int", # 2
"long", # 3
"PY_LONG_LONG", # 4
- "float", # 5
- "double", # 6
- "long double", # 7
+ "Py_ssize_t", # 5
+ "float", # 6
+ "double", # 7
+ "long double", # 8
)
sign_and_rank_to_type = {
(1, 2): c_int_type,
(1, 3): c_long_type,
(1, 4): c_longlong_type,
- (1, 5): c_float_type,
- (1, 6): c_double_type,
- (1, 7): c_longdouble_type,
+ (1, 5): c_py_ssize_t_type,
+ (1, 6): c_float_type,
+ (1, 7): c_double_type,
+ (1, 8): c_longdouble_type,
}
modifiers_and_name_to_type = {
(1, 0, "int"): c_int_type,
(1, 1, "int"): c_long_type,
(1, 2, "int"): c_longlong_type,
+ (1, 0, "Py_ssize_t"): c_py_ssize_t_type,
(1, 0, "float"): c_float_type,
(1, 0, "double"): c_double_type,
(1, 1, "double"): c_longdouble_type,
entry = self.lookup_here(name)
if entry:
if not (entry.is_pyglobal and not entry.as_module):
+ # SAGE -- I put this here so Pyrex
+ # cimport's work across directories.
+ # Currently it tries to multiply define
+ # every module appearing in an import list.
+ # It shouldn't be an error for a module
+ # name to appear again, and indeed the generated
+ # code compiles fine.
+ return entry
error(pos, "'%s' redeclared" % name)
return None
else:
# 'i' int
# 'I' int *
# 'l' long
+ # 'Z' Py_ssize_t
# 's' char *
# 'S' char **
# 'r' int used only to signal exception
'i': PyrexTypes.c_int_type,
'I': PyrexTypes.c_int_ptr_type,
'l': PyrexTypes.c_long_type,
+ 'Z': PyrexTypes.c_py_ssize_t_type,
's': PyrexTypes.c_char_ptr_type,
'S': PyrexTypes.c_char_ptr_ptr_type,
'r': PyrexTypes.c_returncode_type,
iternaryfunc = Signature("TOO", "O") # typedef PyObject * (*ternaryfunc)(PyObject *, PyObject *, PyObject *);
callfunc = Signature("T*", "O") # typedef PyObject * (*ternaryfunc)(PyObject *, PyObject *, PyObject *);
inquiry = Signature("T", "i") # typedef int (*inquiry)(PyObject *);
+lenfunc = Signature("T", "Z") # typedef Py_ssize_t (*lenfunc)(PyObject *);
+
# typedef int (*coercion)(PyObject **, PyObject **);
intargfunc = Signature("Ti", "O") # typedef PyObject *(*intargfunc)(PyObject *, int);
+ssizeargfunc = Signature("TZ", "O") # typedef PyObject *(*ssizeargfunc)(PyObject *, Py_ssize_t);
intintargfunc = Signature("Tii", "O") # typedef PyObject *(*intintargfunc)(PyObject *, int, int);
+ssizessizeargfunc = Signature("TZZ", "O") # typedef PyObject *(*ssizessizeargfunc)(PyObject *, Py_ssize_t, Py_ssize_t);
intobjargproc = Signature("TiO", 'r') # typedef int(*intobjargproc)(PyObject *, int, PyObject *);
+ssizeobjargproc = Signature("TZO", 'r') # typedef int(*ssizeobjargproc)(PyObject *, Py_ssize_t, PyObject *);
intintobjargproc = Signature("TiiO", 'r') # typedef int(*intintobjargproc)(PyObject *, int, int, PyObject *);
+ssizessizeobjargproc = Signature("TZZO", 'r') # typedef int(*ssizessizeobjargproc)(PyObject *, Py_ssize_t, Py_ssize_t, PyObject *);
+
intintargproc = Signature("Tii", 'r')
+ssizessizeargproc = Signature("TZZ", 'r')
objargfunc = Signature("TO", "O")
objobjargproc = Signature("TOO", 'r') # typedef int (*objobjargproc)(PyObject *, PyObject *, PyObject *);
getreadbufferproc = Signature("TiP", 'i') # typedef int (*getreadbufferproc)(PyObject *, int, void **);
getwritebufferproc = Signature("TiP", 'i') # typedef int (*getwritebufferproc)(PyObject *, int, void **);
getsegcountproc = Signature("TI", 'i') # typedef int (*getsegcountproc)(PyObject *, int *);
getcharbufferproc = Signature("TiS", 'i') # typedef int (*getcharbufferproc)(PyObject *, int, const char **);
+readbufferproc = Signature("TZP", "Z") # typedef Py_ssize_t (*readbufferproc)(PyObject *, Py_ssize_t, void **);
+writebufferproc = Signature("TZP", "Z") # typedef Py_ssize_t (*writebufferproc)(PyObject *, Py_ssize_t, void **);
+segcountproc = Signature("TZ", "Z") # typedef Py_ssize_t (*segcountproc)(PyObject *, Py_ssize_t *);
+writebufferproc = Signature("TZS", "Z") # typedef Py_ssize_t (*charbufferproc)(PyObject *, Py_ssize_t, char **);
objargproc = Signature("TO", 'r') # typedef int (*objobjproc)(PyObject *, PyObject *);
# typedef int (*visitproc)(PyObject *, void *);
# typedef int (*traverseproc)(PyObject *, visitproc, void *);
MethodSlot(binaryfunc, "nb_true_divide", "__truediv__"),
MethodSlot(ibinaryfunc, "nb_inplace_floor_divide", "__ifloordiv__"),
MethodSlot(ibinaryfunc, "nb_inplace_true_divide", "__itruediv__"),
+
+ # Added in release 2.5
+ MethodSlot(unaryfunc, "nb_index", "__index__"),
)
PySequenceMethods = (
- MethodSlot(inquiry, "sq_length", "__len__"), # EmptySlot("sq_length"), # mp_length used instead
+ MethodSlot(lenfunc, "sq_length", "__len__"), # EmptySlot("sq_length"), # mp_length used instead
EmptySlot("sq_concat"), # nb_add used instead
EmptySlot("sq_repeat"), # nb_multiply used instead
SyntheticSlot("sq_item", ["__getitem__"], "0"), #EmptySlot("sq_item"), # mp_subscript used instead
- MethodSlot(intintargfunc, "sq_slice", "__getslice__"),
+ MethodSlot(ssizessizeargfunc, "sq_slice", "__getslice__"),
EmptySlot("sq_ass_item"), # mp_ass_subscript used instead
SyntheticSlot("sq_ass_slice", ["__setslice__", "__delslice__"], "0"),
MethodSlot(cmpfunc, "sq_contains", "__contains__"),
)
PyMappingMethods = (
- MethodSlot(inquiry, "mp_length", "__len__"),
+ MethodSlot(lenfunc, "mp_length", "__len__"),
MethodSlot(objargfunc, "mp_subscript", "__getitem__"),
SyntheticSlot("mp_ass_subscript", ["__setitem__", "__delitem__"], "0"),
)
MethodSlot(destructor, "", "__dealloc__")
MethodSlot(objobjargproc, "", "__setitem__")
MethodSlot(objargproc, "", "__delitem__")
-MethodSlot(intintobjargproc, "", "__setslice__")
-MethodSlot(intintargproc, "", "__delslice__")
+MethodSlot(ssizessizeobjargproc, "", "__setslice__")
+MethodSlot(ssizessizeargproc, "", "__delslice__")
MethodSlot(getattrofunc, "", "__getattr__")
MethodSlot(setattrofunc, "", "__setattr__")
MethodSlot(delattrofunc, "", "__delattr__")