From 95cd0a3d180778fb912059a8d795fb025c3ca0d5 Mon Sep 17 00:00:00 2001 From: Lisandro Dalcin Date: Wed, 14 Apr 2010 16:37:19 -0300 Subject: [PATCH] fixes and tests for enum in bool contexts and func args --- Cython/Compiler/ExprNodes.py | 2 +- Cython/Compiler/Nodes.py | 11 ++++++---- tests/run/enumboolctx.pyx | 40 ++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 tests/run/enumboolctx.pyx diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index cb4a688d..54d097ad 100755 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -593,7 +593,7 @@ class ExprNode(Node): 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 diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index bad8e955..b06eaf43 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -2621,10 +2621,13 @@ class DefNode(FuncDefNode): 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, diff --git a/tests/run/enumboolctx.pyx b/tests/run/enumboolctx.pyx new file mode 100644 index 00000000..daa84979 --- /dev/null +++ b/tests/run/enumboolctx.pyx @@ -0,0 +1,40 @@ +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 -- 2.26.2