From: Stefan Behnel Date: Sat, 29 Jan 2011 05:37:09 +0000 (+0100) Subject: fix isinstance() check against a tuple of extension types X-Git-Tag: 0.14.1~5 X-Git-Url: http://git.tremily.us/?p=cython.git;a=commitdiff_plain;h=fda3c6f446188ed58a449ea516346ec5b66ace83 fix isinstance() check against a tuple of extension types --- diff --git a/Cython/Compiler/Optimize.py b/Cython/Compiler/Optimize.py index 77fdaac1..3139e400 100644 --- a/Cython/Compiler/Optimize.py +++ b/Cython/Compiler/Optimize.py @@ -1994,20 +1994,21 @@ class OptimizeBuiltinCalls(Visitor.EnvTransform): builtin_type = entry.type if builtin_type and builtin_type is not Builtin.type_type: type_check_function = entry.type.type_check_function(exact=False) + if type_check_function in tests: + continue + tests.append(type_check_function) type_check_args = [arg] elif test_type_node.type is Builtin.type_type: type_check_function = '__Pyx_TypeCheck' type_check_args = [arg, test_type_node] else: return node - if type_check_function not in tests: - tests.append(type_check_function) - test_nodes.append( - ExprNodes.PythonCapiCallNode( - test_type_node.pos, type_check_function, self.Py_type_check_func_type, - args = type_check_args, - is_temp = True, - )) + test_nodes.append( + ExprNodes.PythonCapiCallNode( + test_type_node.pos, type_check_function, self.Py_type_check_func_type, + args = type_check_args, + is_temp = True, + )) def join_with_or(a,b, make_binop_node=ExprNodes.binop_node): or_node = make_binop_node(node.pos, 'or', a, b) diff --git a/tests/run/isinstance.pyx b/tests/run/isinstance.pyx index d11b3771..ce9d0d13 100644 --- a/tests/run/isinstance.pyx +++ b/tests/run/isinstance.pyx @@ -77,6 +77,23 @@ def test_custom(): assert isinstance(A(), A) return True +cdef class B: + pass + +cdef class C: + pass + +def test_custom_tuple(obj): + """ + >>> test_custom_tuple(A()) + True + >>> test_custom_tuple(B()) + True + >>> test_custom_tuple(C()) + False + """ + return isinstance(obj, (A,B)) + def test_nested(x): """ >>> test_nested(1)