From: Stefan Behnel Date: Sun, 7 Apr 2013 05:38:45 +0000 (+0200) Subject: test 'type_version_tag' directive and fix it in Py2 X-Git-Tag: 0.19b1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Ftags%2F0.19b1;p=platform%2Fupstream%2Fpython-cython.git test 'type_version_tag' directive and fix it in Py2 --HG-- rename : tests/compile/ext_attribute_cache.pyx => tests/run/ext_attribute_cache.pyx --- diff --git a/Cython/Compiler/TypeSlots.py b/Cython/Compiler/TypeSlots.py index 3a3fc9c..b8d6622 100644 --- a/Cython/Compiler/TypeSlots.py +++ b/Cython/Compiler/TypeSlots.py @@ -383,7 +383,7 @@ class TypeFlagsSlot(SlotDescriptor): value += "|Py_TPFLAGS_HAVE_VERSION_TAG" else: # it's enabled in 'Py_TPFLAGS_DEFAULT' in Py3 - value = "(%s^Py_TPFLAGS_HAVE_VERSION_TAG)" % value + value = "(%s&~Py_TPFLAGS_HAVE_VERSION_TAG)" % value value += "|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER" if not scope.parent_type.is_final_type: value += "|Py_TPFLAGS_BASETYPE" diff --git a/tests/compile/ext_attribute_cache.pyx b/tests/compile/ext_attribute_cache.pyx deleted file mode 100644 index bcc43f5..0000000 --- a/tests/compile/ext_attribute_cache.pyx +++ /dev/null @@ -1,13 +0,0 @@ -# mode: compile - -cimport cython - -cdef class AttrCache(object): - cdef public int x - cdef object y - -@cython.type_version_tag(False) -cdef class NoAttrCache(object): - cdef public int x - cdef object y - diff --git a/tests/run/ext_attribute_cache.pyx b/tests/run/ext_attribute_cache.pyx new file mode 100644 index 0000000..7901bfa --- /dev/null +++ b/tests/run/ext_attribute_cache.pyx @@ -0,0 +1,52 @@ +# mode: run +# tag: tpflags, type_version_tag + +cimport cython + + +cdef extern from *: + unsigned long PY_VERSION_HEX + unsigned long Py_TPFLAGS_HAVE_VERSION_TAG + ctypedef struct PyTypeObject: + unsigned long tp_flags + + +SHOULD_HAVE_FLAG = PY_VERSION_HEX >= 0x02060000 + + +def test_flag(t): + return ((t).tp_flags & Py_TPFLAGS_HAVE_VERSION_TAG) != 0 + + +cdef class ImplicitAttrCache(object): + """ + >>> flag = test_flag(ImplicitAttrCache) + >>> if SHOULD_HAVE_FLAG: print(flag) + ... else: print(True) + True + """ + cdef public int x + cdef object y + + +@cython.type_version_tag(True) +cdef class ExplicitAttrCache(object): + """ + >>> flag = test_flag(ImplicitAttrCache) + >>> if SHOULD_HAVE_FLAG: print(flag) + ... else: print(True) + True + """ + cdef public int x + cdef object y + + +@cython.type_version_tag(False) +cdef class NoAttrCache(object): + """ + >>> test_flag(NoAttrCache) + False + """ + cdef public int x + cdef object y +