Commit 57edf105 authored by Robert Bradshaw's avatar Robert Bradshaw

PyObject -> Py_ssize_t now uses __index__ rather than __int__ (even in function signatures)

parent a51cac49
...@@ -173,6 +173,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -173,6 +173,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.putln(" #define PY_SSIZE_T_MIN INT_MIN") code.putln(" #define PY_SSIZE_T_MIN INT_MIN")
code.putln(" #define PyInt_FromSsize_t(z) PyInt_FromLong(z)") code.putln(" #define PyInt_FromSsize_t(z) PyInt_FromLong(z)")
code.putln(" #define PyInt_AsSsize_t(o) PyInt_AsLong(o)") 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") code.putln("#endif")
self.generate_extern_c_macro_definition(code) self.generate_extern_c_macro_definition(code)
code.putln("%s double pow(double, double);" % Naming.extern_c_macro) code.putln("%s double pow(double, double);" % Naming.extern_c_macro)
......
...@@ -851,6 +851,12 @@ class DefNode(FuncDefNode): ...@@ -851,6 +851,12 @@ class DefNode(FuncDefNode):
if arg.is_generic and arg.type.is_extension_type: if arg.is_generic and arg.type.is_extension_type:
arg.needs_type_test = 1 arg.needs_type_test = 1
any_type_tests_needed = 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: if any_type_tests_needed:
env.use_utility_code(arg_type_test_utility_code) env.use_utility_code(arg_type_test_utility_code)
...@@ -980,7 +986,11 @@ class DefNode(FuncDefNode): ...@@ -980,7 +986,11 @@ class DefNode(FuncDefNode):
def generate_argument_declarations(self, env, code): def generate_argument_declarations(self, env, code):
for arg in self.args: for arg in self.args:
if arg.is_generic: # or arg.needs_conversion: 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): def generate_keyword_list(self, code):
if self.entry.signature.has_generic_args: if self.entry.signature.has_generic_args:
...@@ -994,7 +1004,7 @@ class DefNode(FuncDefNode): ...@@ -994,7 +1004,7 @@ class DefNode(FuncDefNode):
arg.name) arg.name)
code.putln( code.putln(
"0};") "0};")
def generate_argument_parsing_code(self, code): def generate_argument_parsing_code(self, code):
# Generate PyArg_ParseTuple call for generic # Generate PyArg_ParseTuple call for generic
# arguments, if any. # arguments, if any.
...@@ -1015,8 +1025,12 @@ class DefNode(FuncDefNode): ...@@ -1015,8 +1025,12 @@ class DefNode(FuncDefNode):
default_seen = 1 default_seen = 1
elif default_seen: elif default_seen:
error(arg.pos, "Non-default argument following default argument") error(arg.pos, "Non-default argument following default argument")
arg_addrs.append("&" + arg_entry.cname) if arg.needs_conversion:
format = arg_entry.type.parsetuple_format 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: if format:
arg_formats.append(format) arg_formats.append(format)
else: else:
...@@ -1088,7 +1102,9 @@ class DefNode(FuncDefNode): ...@@ -1088,7 +1102,9 @@ class DefNode(FuncDefNode):
old_type = arg.hdr_type old_type = arg.hdr_type
new_type = arg.type new_type = arg.type
if old_type.is_pyobject: if old_type.is_pyobject:
code.putln("if (%s) {" % arg.hdr_cname)
self.generate_arg_conversion_from_pyobject(arg, code) self.generate_arg_conversion_from_pyobject(arg, code)
code.putln("}")
elif new_type.is_pyobject: elif new_type.is_pyobject:
self.generate_arg_conversion_to_pyobject(arg, code) self.generate_arg_conversion_to_pyobject(arg, code)
else: else:
...@@ -2602,6 +2618,8 @@ typedef struct {const char *s; const void **p;} __Pyx_CApiTabEntry; /*proto*/ ...@@ -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;} __Pyx_InternTabEntry; /*proto*/
typedef struct {PyObject **p; char *s; long n;} __Pyx_StringTabEntry; /*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)) #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) { static INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {
if (x == Py_True) return 1; if (x == Py_True) return 1;
......
...@@ -352,7 +352,7 @@ class CBIntType(CIntType): ...@@ -352,7 +352,7 @@ class CBIntType(CIntType):
class CPySSizeTType(CIntType): class CPySSizeTType(CIntType):
to_py_function = "PyInt_FromSsize_t" to_py_function = "PyInt_FromSsize_t"
from_py_function = "PyInt_AsSsize_t" from_py_function = "__pyx_PyIndex_AsSsize_t"
class CUIntType(CIntType): class CUIntType(CIntType):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment