Author: Armin Rigo <ar...@tunes.org> Branch: cffi-1.0 Changeset: r1937:8e9329205207 Date: 2015-05-08 20:48 +0200 http://bitbucket.org/cffi/cffi/changeset/8e9329205207/
Log: Accept unicode literals for type specifications too diff --git a/_cffi1/ffi_obj.c b/_cffi1/ffi_obj.c --- a/_cffi1/ffi_obj.c +++ b/_cffi1/ffi_obj.c @@ -158,6 +158,17 @@ else if ((accept & ACCEPT_CDATA) && CData_Check(arg)) { return ((CDataObject *)arg)->c_type; } +#if PY_MAJOR_VERSION < 3 + else if (PyUnicode_Check(arg)) { + CTypeDescrObject *result; + arg = PyUnicode_AsASCIIString(arg); + if (arg == NULL) + return NULL; + result = _ffi_type(ffi, arg, accept); + Py_DECREF(arg); + return result; + } +#endif else { const char *m1 = (accept & ACCEPT_STRING) ? "string" : ""; const char *m2 = (accept & ACCEPT_CTYPE) ? "ctype object" : ""; diff --git a/_cffi1/test_recompiler.py b/_cffi1/test_recompiler.py --- a/_cffi1/test_recompiler.py +++ b/_cffi1/test_recompiler.py @@ -281,6 +281,7 @@ # assert ffi.offsetof("struct foo_s", "a") == 0 assert ffi.offsetof("struct foo_s", "b") == 4 + assert ffi.offsetof(u"struct foo_s", u"b") == 4 # py.test.raises(TypeError, ffi.addressof, p) assert ffi.addressof(p[0]) == p @@ -606,3 +607,22 @@ p = lib.ff7() assert ffi.cast("int *", p)[0] == 42 assert lib.ff7b(p) == 42 + +def test_unicode_libraries(): + try: + unicode + except NameError: + py.test.skip("for python 2.x") + # + import math + lib_m = "m" + if sys.platform == 'win32': + #there is a small chance this fails on Mingw via environ $CC + import distutils.ccompiler + if distutils.ccompiler.get_default_compiler() == 'msvc': + lib_m = 'msvcrt' + ffi = FFI() + ffi.cdef(unicode("float sin(double); double cos(double);")) + lib = verify(ffi, 'test_math_sin_unicode', unicode('#include <math.h>'), + libraries=[unicode(lib_m)]) + assert lib.cos(1.43) == math.cos(1.43) diff --git a/_cffi1/test_unicode_literals.py b/_cffi1/test_unicode_literals.py --- a/_cffi1/test_unicode_literals.py +++ b/_cffi1/test_unicode_literals.py @@ -7,16 +7,7 @@ # # # -import sys, math from _cffi_backend import FFI -from _cffi1 import recompiler - -lib_m = "m" -if sys.platform == 'win32': - #there is a small chance this fails on Mingw via environ $CC - import distutils.ccompiler - if distutils.ccompiler.get_default_compiler() == 'msvc': - lib_m = 'msvcrt' def test_cast(): @@ -45,43 +36,8 @@ assert ffi.getctype("int**") == "int * *" # unicode literal assert type(ffi.getctype("int**")) is str -def test_cdef(): - ffi = FFI() - ffi.cdef("typedef int foo_t[50];") # unicode literal - -def test_offsetof(): - ffi = FFI() - ffi.cdef("typedef struct { int x, y; } foo_t;") - assert ffi.offsetof("foo_t", "y") == 4 # unicode literal - -def test_enum(): - ffi = FFI() - ffi.cdef("enum foo_e { AA, BB, CC };") # unicode literal - x = ffi.cast("enum foo_e", 1) - assert int(ffi.cast("int", x)) == 1 - -def test_dlopen(): - ffi = FFI() - ffi.cdef("double sin(double x);") - m = ffi.dlopen(lib_m) # unicode literal - x = m.sin(1.23) - assert x == math.sin(1.23) - -def test_verify(): - ffi = FFI() - ffi.cdef("double test_verify_1(double x);") # unicode literal - lib = ffi.verify("double test_verify_1(double x) { return x * 42.0; }") - assert lib.test_verify_1(-1.5) == -63.0 - def test_callback(): ffi = FFI() cb = ffi.callback("int(int)", # unicode literal lambda x: x + 42) assert cb(5) == 47 - -def test_math_sin_unicode(): - ffi = FFI() - ffi.cdef("float sin(double); double cos(double);") - lib = recompiler.verify(ffi, 'test_math_sin_unicode', '#include <math.h>', - libraries=[lib_m]) - assert lib.cos(1.43) == math.cos(1.43) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit