diff -r cf70f030a744 Lib/ctypes/__init__.py --- a/Lib/ctypes/__init__.py Wed Jun 18 23:07:46 2014 -0400 +++ b/Lib/ctypes/__init__.py Mon Jun 23 22:04:53 2014 +0300 @@ -54,7 +54,7 @@ create_string_buffer(anInteger) -> character array create_string_buffer(aString, anInteger) -> character array """ - if isinstance(init, (str, unicode)): + if isinstance(init, basestring): if size is None: size = len(init)+1 buftype = c_char * size @@ -267,8 +267,11 @@ _c_functype_cache.clear() if _os.name in ("nt", "ce"): _win_functype_cache.clear() - # _SimpleCData.c_wchar_p_from_param - POINTER(c_wchar).from_param = c_wchar_p.from_param + try: + # _SimpleCData.c_wchar_p_from_param + POINTER(c_wchar).from_param = c_wchar_p.from_param + except NameError: # no unicode support + pass # _SimpleCData.c_char_p_from_param POINTER(c_char).from_param = c_char_p.from_param _pointer_type_cache[None] = c_void_p @@ -299,7 +302,7 @@ create_unicode_buffer(anInteger) -> character array create_unicode_buffer(aString, anInteger) -> character array """ - if isinstance(init, (str, unicode)): + if isinstance(init, basestring): if size is None: size = len(init)+1 buftype = c_wchar * size diff -r cf70f030a744 Lib/ctypes/test/__init__.py --- a/Lib/ctypes/test/__init__.py Wed Jun 18 23:07:46 2014 -0400 +++ b/Lib/ctypes/test/__init__.py Mon Jun 23 22:04:53 2014 +0300 @@ -9,6 +9,11 @@ return unittest.skipUnless(name in ctypes_symbols, '{!r} is required'.format(name)) +try: + unicode + have_unicode = True +except NameError: + have_unicode = False class ResourceDenied(unittest.SkipTest): """Test skipped because it requested a disallowed resource. diff -r cf70f030a744 Lib/ctypes/test/test_byteswap.py --- a/Lib/ctypes/test/test_byteswap.py Wed Jun 18 23:07:46 2014 -0400 +++ b/Lib/ctypes/test/test_byteswap.py Mon Jun 23 22:04:53 2014 +0300 @@ -2,6 +2,7 @@ from binascii import hexlify from ctypes import * +from ctypes.test import ctypes_symbols def bin(s): return hexlify(memoryview(s)).upper() @@ -179,7 +180,10 @@ T._fields_ = _fields_ # these fields do not support different byte order: - for typ in c_wchar, c_void_p, POINTER(c_int): + tests = (c_void_p, POINTER(c_int)) + if 'c_wchar' in ctypes_symbols: + tests += (c_wchar,) + for typ in tests: _fields_.append(("x", typ)) class T(base): pass diff -r cf70f030a744 Lib/ctypes/test/test_parameters.py --- a/Lib/ctypes/test/test_parameters.py Wed Jun 18 23:07:46 2014 -0400 +++ b/Lib/ctypes/test/test_parameters.py Mon Jun 23 22:04:53 2014 +0300 @@ -1,5 +1,5 @@ import unittest, sys -from ctypes.test import need_symbol +from ctypes.test import need_symbol, have_unicode class SimpleTypesTestCase(unittest.TestCase): @@ -57,9 +57,10 @@ s = "123" self.assertIs(c_char_p.from_param(s)._obj, s) - # new in 0.9.1: convert (encode) unicode to ascii - self.assertEqual(c_char_p.from_param(u"123")._obj, "123") - self.assertRaises(UnicodeEncodeError, c_char_p.from_param, u"123\377") + if have_unicode: + # new in 0.9.1: convert (encode) unicode to ascii + self.assertEqual(c_char_p.from_param(u"123")._obj, "123") + self.assertRaises(UnicodeEncodeError, c_char_p.from_param, u"123\377") self.assertRaises(TypeError, c_char_p.from_param, 42) diff -r cf70f030a744 Lib/ctypes/test/test_pickling.py --- a/Lib/ctypes/test/test_pickling.py Wed Jun 18 23:07:46 2014 -0400 +++ b/Lib/ctypes/test/test_pickling.py Mon Jun 23 22:04:53 2014 +0300 @@ -2,6 +2,8 @@ import pickle from ctypes import * import _ctypes_test +from ctypes.test import ctypes_symbols + dll = CDLL(_ctypes_test.__file__) class X(Structure): @@ -56,20 +58,23 @@ prototype = CFUNCTYPE(c_int) - for item in [ + tests = [ c_char_p(), - c_wchar_p(), c_void_p(), pointer(c_int(42)), dll._testfunc_p_p, prototype(lambda: 42), - ]: + ] + if 'c_wchar_p' in ctypes_symbols: + tests.append(c_wchar_p()) + for item in tests: self.assertRaises(ValueError, lambda: self.dumps(item)) def test_wchar(self): pickle.dumps(c_char("x")) - # Issue 5049 - pickle.dumps(c_wchar(u"x")) + if 'c_wchar' in ctypes_symbols: + # Issue 5049 + pickle.dumps(c_wchar(u"x")) class PickleTest_1(PickleTest): def dumps(self, item): diff -r cf70f030a744 Lib/ctypes/test/test_structures.py --- a/Lib/ctypes/test/test_structures.py Wed Jun 18 23:07:46 2014 -0400 +++ b/Lib/ctypes/test/test_structures.py Mon Jun 23 22:04:53 2014 +0300 @@ -1,6 +1,6 @@ import unittest from ctypes import * -from ctypes.test import need_symbol +from ctypes.test import need_symbol, have_unicode from struct import calcsize import _testcapi @@ -249,6 +249,7 @@ pass self.assertRaises(TypeError, setattr, POINT, "_fields_", [("x", 1), ("y", 2)]) + @unittest.skipUnless(have_unicode, 'no unicode support') def test_invalid_name(self): # field name must be string def declare_with_name(name): diff -r cf70f030a744 Lib/ctypes/test/test_unicode.py --- a/Lib/ctypes/test/test_unicode.py Wed Jun 18 23:07:46 2014 -0400 +++ b/Lib/ctypes/test/test_unicode.py Mon Jun 23 22:04:53 2014 +0300 @@ -4,6 +4,9 @@ from ctypes.test import need_symbol import _ctypes_test +def u(s): + return unicode(s, 'unicode-escape') + @need_symbol('c_wchar') class UnicodeTestCase(unittest.TestCase): @classmethod @@ -22,35 +25,35 @@ ctypes.set_conversion_mode("ascii", "strict") # no conversions take place with unicode arguments self.assertEqual(wcslen(u"abc"), 3) - self.assertEqual(wcslen(u"ab\u2070"), 3) + self.assertEqual(wcslen(u(r"ab\u2070")), 3) # string args are converted self.assertEqual(wcslen("abc"), 3) - self.assertRaises(ctypes.ArgumentError, wcslen, "abä") + self.assertRaises(ctypes.ArgumentError, wcslen, "ab\xe4") def test_ascii_replace(self): wcslen = self.wcslen ctypes.set_conversion_mode("ascii", "replace") self.assertEqual(wcslen(u"abc"), 3) - self.assertEqual(wcslen(u"ab\u2070"), 3) + self.assertEqual(wcslen(u(r"ab\u2070")), 3) self.assertEqual(wcslen("abc"), 3) - self.assertEqual(wcslen("abä"), 3) + self.assertEqual(wcslen("ab\xe4"), 3) def test_ascii_ignore(self): wcslen = self.wcslen ctypes.set_conversion_mode("ascii", "ignore") self.assertEqual(wcslen(u"abc"), 3) - self.assertEqual(wcslen(u"ab\u2070"), 3) + self.assertEqual(wcslen(u(r"ab\u2070")), 3) # ignore error mode skips non-ascii characters self.assertEqual(wcslen("abc"), 3) - self.assertEqual(wcslen("äöüß"), 0) + self.assertEqual(wcslen("\xe4\xf6\xfc\xdf"), 0) def test_latin1_strict(self): wcslen = self.wcslen ctypes.set_conversion_mode("latin-1", "strict") self.assertEqual(wcslen(u"abc"), 3) - self.assertEqual(wcslen(u"ab\u2070"), 3) + self.assertEqual(wcslen(u(r"ab\u2070")), 3) self.assertEqual(wcslen("abc"), 3) - self.assertEqual(wcslen("äöüß"), 4) + self.assertEqual(wcslen("\xe4\xf6\xfc\xdf"), 4) def test_buffers(self): ctypes.set_conversion_mode("ascii", "strict") @@ -58,15 +61,15 @@ self.assertEqual(len(buf), 3+1) ctypes.set_conversion_mode("ascii", "replace") - buf = ctypes.create_unicode_buffer("abäöü") - self.assertEqual(buf[:], u"ab\uFFFD\uFFFD\uFFFD\0") - self.assertEqual(buf[::], u"ab\uFFFD\uFFFD\uFFFD\0") - self.assertEqual(buf[::-1], u"\0\uFFFD\uFFFD\uFFFDba") - self.assertEqual(buf[::2], u"a\uFFFD\uFFFD") + buf = ctypes.create_unicode_buffer("ab\xe4\xf6\xfc") + self.assertEqual(buf[:], u(r"ab\uFFFD\uFFFD\uFFFD\0")) + self.assertEqual(buf[::], u(r"ab\uFFFD\uFFFD\uFFFD\0")) + self.assertEqual(buf[::-1], u(r"\0\uFFFD\uFFFD\uFFFDba")) + self.assertEqual(buf[::2], u(r"a\uFFFD\uFFFD")) self.assertEqual(buf[6:5:-1], u"") ctypes.set_conversion_mode("ascii", "ignore") - buf = ctypes.create_unicode_buffer("abäöü") + buf = ctypes.create_unicode_buffer("ab\xe4\xf6\xfc") # is that correct? not sure. But with 'ignore', you get what you pay for.. self.assertEqual(buf[:], u"ab\0\0\0\0") self.assertEqual(buf[::], u"ab\0\0\0\0") @@ -98,21 +101,21 @@ ctypes.set_conversion_mode("ascii", "strict") self.assertEqual(func("abc"), "abc") self.assertEqual(func(u"abc"), "abc") - self.assertRaises(ctypes.ArgumentError, func, u"abä") + self.assertRaises(ctypes.ArgumentError, func, u"ab\xe4") def test_ascii_ignore(self): func = self.func ctypes.set_conversion_mode("ascii", "ignore") self.assertEqual(func("abc"), "abc") self.assertEqual(func(u"abc"), "abc") - self.assertEqual(func(u"äöüß"), "") + self.assertEqual(func(u"\xe4\xf6\xfc\xdf"), "") def test_ascii_replace(self): func = self.func ctypes.set_conversion_mode("ascii", "replace") self.assertEqual(func("abc"), "abc") self.assertEqual(func(u"abc"), "abc") - self.assertEqual(func(u"äöüß"), "????") + self.assertEqual(func(u"\xe4\xf6\xfc\xdf"), "????") def test_buffers(self): ctypes.set_conversion_mode("ascii", "strict") @@ -120,7 +123,7 @@ self.assertEqual(len(buf), 3+1) ctypes.set_conversion_mode("ascii", "replace") - buf = ctypes.create_string_buffer(u"abäöü") + buf = ctypes.create_string_buffer(u"ab\xe4\xf6\xfc") self.assertEqual(buf[:], "ab???\0") self.assertEqual(buf[::], "ab???\0") self.assertEqual(buf[::-1], "\0???ba") @@ -128,7 +131,7 @@ self.assertEqual(buf[6:5:-1], "") ctypes.set_conversion_mode("ascii", "ignore") - buf = ctypes.create_string_buffer(u"abäöü") + buf = ctypes.create_string_buffer(u"ab\xe4\xf6\xfc") # is that correct? not sure. But with 'ignore', you get what you pay for.. self.assertEqual(buf[:], "ab\0\0\0\0") self.assertEqual(buf[::], "ab\0\0\0\0")