Commit 3716a375 authored by Robert Bradshaw's avatar Robert Bradshaw

Argument parsing error handling

parent 859e52bb
...@@ -3588,20 +3588,7 @@ class CoerceFromPyTypeNode(CoercionNode): ...@@ -3588,20 +3588,7 @@ class CoerceFromPyTypeNode(CoercionNode):
code.putln('%s = %s; %s' % ( code.putln('%s = %s; %s' % (
self.result_code, self.result_code,
rhs, rhs,
code.error_goto_if(self.error_cond(), self.pos))) code.error_goto_if(self.type.error_condition(self.result_code), 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
class CoerceToBooleanNode(CoercionNode): class CoerceToBooleanNode(CoercionNode):
......
...@@ -1311,12 +1311,13 @@ class DefNode(FuncDefNode): ...@@ -1311,12 +1311,13 @@ class DefNode(FuncDefNode):
def generate_arg_conversion_from_pyobject(self, arg, code): def generate_arg_conversion_from_pyobject(self, arg, code):
new_type = arg.type new_type = arg.type
func = new_type.from_py_function func = new_type.from_py_function
# copied from CoerceFromPyTypeNode
if func: if func:
code.putln("%s = %s(%s); %s" % ( code.putln("%s = %s(%s); %s" % (
arg.entry.cname, arg.entry.cname,
func, func,
arg.hdr_cname, arg.hdr_cname,
code.error_goto_if_PyErr(arg.pos))) code.error_goto_if(new_type.error_condition(arg.entry.cname), arg.pos)))
else: else:
error(arg.pos, error(arg.pos,
"Cannot convert Python object argument to type '%s'" "Cannot convert Python object argument to type '%s'"
......
...@@ -302,6 +302,19 @@ class CType(PyrexType): ...@@ -302,6 +302,19 @@ class CType(PyrexType):
from_py_function = None from_py_function = None
exception_value = None exception_value = None
exception_check = 1 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): class CVoidType(CType):
...@@ -432,7 +445,7 @@ class CUIntType(CIntType): ...@@ -432,7 +445,7 @@ class CUIntType(CIntType):
to_py_function = "PyLong_FromUnsignedLong" to_py_function = "PyLong_FromUnsignedLong"
from_py_function = "PyInt_AsUnsignedLongMask" from_py_function = "PyInt_AsUnsignedLongMask"
exception_value = None exception_value = -1
class CULongType(CUIntType): class CULongType(CUIntType):
......
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