test 'type_version_tag' directive and fix it in Py2 0.19b1
authorStefan Behnel <stefan_ml@behnel.de>
Sun, 7 Apr 2013 05:38:45 +0000 (07:38 +0200)
committerStefan Behnel <stefan_ml@behnel.de>
Sun, 7 Apr 2013 05:38:45 +0000 (07:38 +0200)
--HG--
rename : tests/compile/ext_attribute_cache.pyx => tests/run/ext_attribute_cache.pyx

Cython/Compiler/TypeSlots.py
tests/compile/ext_attribute_cache.pyx [deleted file]
tests/run/ext_attribute_cache.pyx [new file with mode: 0644]

index 3a3fc9c..b8d6622 100644 (file)
@@ -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 (file)
index bcc43f5..0000000
+++ /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 (file)
index 0000000..7901bfa
--- /dev/null
@@ -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 ((<PyTypeObject*>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
+