From 57edf1057deee69d6659f1ccce7d9a1fdae63d3c Mon Sep 17 00:00:00 2001 From: Robert Bradshaw Date: Sat, 18 Aug 2007 17:40:39 -0700 Subject: [PATCH] PyObject -> Py_ssize_t now uses __index__ rather than __int__ (even in function signatures) --- Cython/Compiler/ModuleNode.py | 2 ++ Cython/Compiler/Nodes.py | 26 ++++++++++++++++++++++---- Cython/Compiler/PyrexTypes.py | 2 +- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/Cython/Compiler/ModuleNode.py b/Cython/Compiler/ModuleNode.py index 4fd310fc..390860cf 100644 --- a/Cython/Compiler/ModuleNode.py +++ b/Cython/Compiler/ModuleNode.py @@ -173,6 +173,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): 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(" #define PyNumber_Index(o) PyNumber_Int(o)") + code.putln(" #define PyIndex_Check(o) PyNumber_Check(o)") code.putln("#endif") self.generate_extern_c_macro_definition(code) code.putln("%s double pow(double, double);" % Naming.extern_c_macro) diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index 92730120..c7329d57 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -851,6 +851,12 @@ class DefNode(FuncDefNode): if arg.is_generic and arg.type.is_extension_type: arg.needs_type_test = 1 any_type_tests_needed = 1 + elif arg.type is PyrexTypes.c_py_ssize_t_type: + # Want to use __index__ rather than __int__ method + # that PyArg_ParseTupleAndKeywords calls + arg.needs_conversion = 1 + arg.hdr_type = PyrexTypes.py_object_type + arg.hdr_cname = Naming.arg_prefix + arg.name if any_type_tests_needed: env.use_utility_code(arg_type_test_utility_code) @@ -980,7 +986,11 @@ class DefNode(FuncDefNode): def generate_argument_declarations(self, env, code): for arg in self.args: if arg.is_generic: # or arg.needs_conversion: - code.put_var_declaration(arg.entry) + if arg.needs_conversion: + code.putln("PyObject *%s = 0;" % arg.hdr_cname) + else: + code.put_var_declaration(arg.entry) + def generate_keyword_list(self, code): if self.entry.signature.has_generic_args: @@ -994,7 +1004,7 @@ class DefNode(FuncDefNode): arg.name) code.putln( "0};") - + def generate_argument_parsing_code(self, code): # Generate PyArg_ParseTuple call for generic # arguments, if any. @@ -1015,8 +1025,12 @@ class DefNode(FuncDefNode): default_seen = 1 elif default_seen: error(arg.pos, "Non-default argument following default argument") - arg_addrs.append("&" + arg_entry.cname) - format = arg_entry.type.parsetuple_format + if arg.needs_conversion: + arg_addrs.append("&" + arg.hdr_cname) + format = arg.hdr_type.parsetuple_format + else: + arg_addrs.append("&" + arg_entry.cname) + format = arg_entry.type.parsetuple_format if format: arg_formats.append(format) else: @@ -1088,7 +1102,9 @@ class DefNode(FuncDefNode): old_type = arg.hdr_type new_type = arg.type if old_type.is_pyobject: + code.putln("if (%s) {" % arg.hdr_cname) self.generate_arg_conversion_from_pyobject(arg, code) + code.putln("}") elif new_type.is_pyobject: self.generate_arg_conversion_to_pyobject(arg, code) else: @@ -2602,6 +2618,8 @@ typedef struct {const char *s; const void **p;} __Pyx_CApiTabEntry; /*proto*/ typedef struct {PyObject **p; char *s;} __Pyx_InternTabEntry; /*proto*/ typedef struct {PyObject **p; char *s; long n;} __Pyx_StringTabEntry; /*proto*/ +#define __pyx_PyIndex_AsSsize_t(b) PyInt_AsSsize_t(PyNumber_Index(b)) + #define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False)) static INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { if (x == Py_True) return 1; diff --git a/Cython/Compiler/PyrexTypes.py b/Cython/Compiler/PyrexTypes.py index b25fbc30..594f8836 100644 --- a/Cython/Compiler/PyrexTypes.py +++ b/Cython/Compiler/PyrexTypes.py @@ -352,7 +352,7 @@ class CBIntType(CIntType): class CPySSizeTType(CIntType): to_py_function = "PyInt_FromSsize_t" - from_py_function = "PyInt_AsSsize_t" + from_py_function = "__pyx_PyIndex_AsSsize_t" class CUIntType(CIntType): -- 2.26.2