if type.is_pyobject or type.is_ptr or type.is_float:
return CoerceToBooleanNode(self, env)
else:
- if not type.is_int and not type.is_error:
+ if not (type.is_int or type.is_enum or type.is_error):
error(self.pos,
"Type '%s' not acceptable as a boolean" % type)
return self
func = new_type.from_py_function
# copied from CoerceFromPyTypeNode
if func:
- code.putln("%s = %s(%s); %s" % (
- arg.entry.cname,
- func,
- arg.hdr_cname,
+ lhs = arg.entry.cname
+ rhs = "%s(%s)" % (func, arg.hdr_cname)
+ if new_type.is_enum:
+ rhs = PyrexTypes.typecast(new_type, PyrexTypes.c_long_type, rhs)
+ code.putln("%s = %s; %s" % (
+ lhs,
+ rhs,
code.error_goto_if(new_type.error_condition(arg.entry.cname), arg.pos)))
else:
error(arg.pos,
--- /dev/null
+cdef public enum Truth:
+ FALSE=0
+ TRUE=1
+
+def enum_boolctx(Truth arg):
+ """
+ >>> enum_boolctx(FALSE)
+ False
+ >>> enum_boolctx(TRUE)
+ True
+ """
+ if arg:
+ return True
+ else:
+ return False
+
+cdef extern from *:
+ enum: FALSE_VALUE "(0)"
+ enum: TRUE_VALUE "(1)"
+
+def extern_enum_false():
+ """
+ >>> extern_enum_false()
+ """
+ if FALSE_VALUE:
+ raise ValueError
+
+def extern_enum_true():
+ """
+ >>> extern_enum_true()
+ """
+ if not TRUE_VALUE:
+ raise ValueError
+
+def extern_enum_false_true():
+ """
+ >>> extern_enum_false_true()
+ """
+ if not TRUE_VALUE or FALSE_VALUE:
+ raise ValueError