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):
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'"
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):
to_py_function = "PyLong_FromUnsignedLong"
from_py_function = "PyInt_AsUnsignedLongMask"
- exception_value = None
+ exception_value = -1
class CULongType(CUIntType):