From: Robert Bradshaw Date: Tue, 15 Jan 2008 21:49:48 +0000 (-0800) Subject: Argument parsing error handling X-Git-Tag: 0.9.6.14~29^2~77 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=3716a37583d58d9d64d29c618eac4daf624a1e29;p=cython.git Argument parsing error handling --- diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index c64d5577..0e8e0987 100644 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -3588,20 +3588,7 @@ class CoerceFromPyTypeNode(CoercionNode): code.putln('%s = %s; %s' % ( self.result_code, rhs, - code.error_goto_if(self.error_cond(), self.pos))) - - def error_cond(self): - conds = [] - if self.type.is_string: - conds.append("(!%s)" % self.result_code) - elif self.type.exception_value is not None: - conds.append("(%s == %s)" % (self.result_code, self.type.exception_value)) - if self.type.exception_check: - conds.append("PyErr_Occurred()") - if len(conds) > 0: - return " && ".join(conds) - else: - return 0 + code.error_goto_if(self.type.error_condition(self.result_code), self.pos))) class CoerceToBooleanNode(CoercionNode): diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index d55b2faa..1730b31b 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -1311,12 +1311,13 @@ class DefNode(FuncDefNode): def generate_arg_conversion_from_pyobject(self, arg, code): new_type = arg.type func = new_type.from_py_function + # copied from CoerceFromPyTypeNode if func: code.putln("%s = %s(%s); %s" % ( arg.entry.cname, func, arg.hdr_cname, - code.error_goto_if_PyErr(arg.pos))) + code.error_goto_if(new_type.error_condition(arg.entry.cname), arg.pos))) else: error(arg.pos, "Cannot convert Python object argument to type '%s'" diff --git a/Cython/Compiler/PyrexTypes.py b/Cython/Compiler/PyrexTypes.py index 78d79bd5..476a2336 100644 --- a/Cython/Compiler/PyrexTypes.py +++ b/Cython/Compiler/PyrexTypes.py @@ -302,6 +302,19 @@ class CType(PyrexType): from_py_function = None exception_value = None exception_check = 1 + + def error_condition(self, result_code): + conds = [] + if self.is_string: + conds.append("(!%s)" % result_code) + elif self.exception_value is not None: + conds.append("(%s == (%s)%s)" % (result_code, self.sign_and_name(), self.exception_value)) + if self.exception_check: + conds.append("PyErr_Occurred()") + if len(conds) > 0: + return " && ".join(conds) + else: + return 0 class CVoidType(CType): @@ -432,7 +445,7 @@ class CUIntType(CIntType): to_py_function = "PyLong_FromUnsignedLong" from_py_function = "PyInt_AsUnsignedLongMask" - exception_value = None + exception_value = -1 class CULongType(CUIntType):