[pypy-commit] cffi default: Compatibility with PyPy: support running on top of a narrow CPython

arigo noreply at buildbot.pypy.org
Sun Aug 12 22:48:37 CEST 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r834:562746df3428
Date: 2012-08-12 22:48 +0200
http://bitbucket.org/cffi/cffi/changeset/562746df3428/

Log:	Compatibility with PyPy: support running on top of a narrow CPython
	build with sizeof(wchar_t) == 4, which is a bit hackish because we
	are trying to emulate a wide build of PyPy but fail in some details.

diff --git a/c/test_c.py b/c/test_c.py
--- a/c/test_c.py
+++ b/c/test_c.py
@@ -1,15 +1,10 @@
-import sys
-
 import py
-
-if '__pypy__' in sys.modules:
-    py.test.skip("C backend in CPython only")
-
 from _cffi_backend import *
 from _cffi_backend import _getfields, _testfunc
 
 # ____________________________________________________________
 
+import sys
 if sys.version_info < (3,):
     type_or_class = "type"
     mandatory_b_prefix = ''
@@ -1098,6 +1093,10 @@
     assert f(0) == b'\x00'
     assert f(255) == b'\xFF'
 
+def _hacked_pypy_uni4():
+    pyuni4 = {1: True, 2: False}[len(u'\U00012345')]
+    return 'PY_DOT_PY' in globals() and not pyuni4
+
 def test_callback_returning_wchar_t():
     BInt = new_primitive_type("int")
     BWChar = new_primitive_type("wchar_t")
@@ -1112,7 +1111,7 @@
     assert f(0) == unichr(0)
     assert f(255) == unichr(255)
     assert f(0x1234) == u'\u1234'
-    if sizeof(BWChar) == 4:
+    if sizeof(BWChar) == 4 and not _hacked_pypy_uni4():
         assert f(-1) == u'\U00012345'
     assert f(-2) == u'\x00'   # and an exception printed to stderr
 
@@ -1512,10 +1511,11 @@
     assert str(cast(BWChar, 0x1234)) == "<cdata 'wchar_t' %s'\u1234'>" % (
         mandatory_u_prefix,)
     if wchar4:
-        x = cast(BWChar, 0x12345)
-        assert str(x) == "<cdata 'wchar_t' %s'\U00012345'>" % (
-            mandatory_u_prefix,)
-        assert int(x) == 0x12345
+        if not _hacked_pypy_uni4():
+            x = cast(BWChar, 0x12345)
+            assert str(x) == "<cdata 'wchar_t' %s'\U00012345'>" % (
+                mandatory_u_prefix,)
+            assert int(x) == 0x12345
     else:
         assert not pyuni4
     #
@@ -1536,10 +1536,11 @@
         s.a1 = u'\U00012345'
         assert s.a1 == u'\U00012345'
     elif wchar4:
-        s.a1 = cast(BWChar, 0x12345)
-        assert s.a1 == u'\ud808\udf45'
-        s.a1 = u'\ud807\udf44'
-        assert s.a1 == u'\U00011f44'
+        if not _hacked_pypy_uni4():
+            s.a1 = cast(BWChar, 0x12345)
+            assert s.a1 == u'\ud808\udf45'
+            s.a1 = u'\ud807\udf44'
+            assert s.a1 == u'\U00011f44'
     else:
         py.test.raises(TypeError, "s.a1 = u'\U00012345'")
     #
@@ -1555,7 +1556,7 @@
     assert string(a) == u'hello - world!'
     assert str(a) == repr(a)
     #
-    if wchar4:
+    if wchar4 and not _hacked_pypy_uni4():
         u = u'\U00012345\U00012346\U00012347'
         a = newp(BWCharArray, u)
         assert len(a) == 4
@@ -1584,7 +1585,7 @@
     assert int(w) == 0x8234
     w = cast(BInt, u'\u1234')
     assert repr(w) == "<cdata 'int' 4660>"
-    if wchar4:
+    if wchar4 and not _hacked_pypy_uni4():
         w = cast(BWChar, u'\U00012345')
         assert repr(w) == "<cdata 'wchar_t' %s'\U00012345'>" % (
             mandatory_u_prefix,)
@@ -1620,7 +1621,7 @@
     f = callback(BFunc, cb, -42)
     assert f(u'a\u1234b') == 3
     #
-    if wchar4 and not pyuni4:
+    if wchar4 and not pyuni4 and not _hacked_pypy_uni4():
         # try out-of-range wchar_t values
         x = cast(BWChar, 1114112)
         py.test.raises(ValueError, string, x)


More information about the pypy-commit mailing list