Author: Matti Picus <matti.pi...@gmail.com> Branch: py3.5 Changeset: r91636:c378444b2cf5 Date: 2017-06-22 23:14 +0300 http://bitbucket.org/pypy/pypy/changeset/c378444b2cf5/
Log: hg merge default diff --git a/lib_pypy/cffi/_cffi_errors.h b/lib_pypy/cffi/_cffi_errors.h --- a/lib_pypy/cffi/_cffi_errors.h +++ b/lib_pypy/cffi/_cffi_errors.h @@ -36,7 +36,11 @@ if (result == NULL) goto error; +#if PY_MAJOR_VERSION >= 3 + bi = PyImport_ImportModule("builtins"); +#else bi = PyImport_ImportModule("__builtin__"); +#endif if (bi == NULL) goto error; PyDict_SetItemString(result, "__builtins__", bi); diff --git a/lib_pypy/cffi/api.py b/lib_pypy/cffi/api.py --- a/lib_pypy/cffi/api.py +++ b/lib_pypy/cffi/api.py @@ -765,7 +765,7 @@ if sys.platform != "win32": return backend.load_library(None, flags) name = "c" # Windows: load_library(None) fails, but this works - # (backward compatibility hack only) + # on Python 2 (backward compatibility hack only) first_error = None if '.' in name or '/' in name or os.sep in name: try: @@ -775,6 +775,9 @@ import ctypes.util path = ctypes.util.find_library(name) if path is None: + if name == "c" and sys.platform == "win32" and sys.version_info >= (3,): + raise OSError("dlopen(None) cannot work on Windows for Python 3 " + "(see http://bugs.python.org/issue23606)") msg = ("ctypes.util.find_library() did not manage " "to locate a library called %r" % (name,)) if first_error is not None: diff --git a/pypy/doc/project-ideas.rst b/pypy/doc/project-ideas.rst --- a/pypy/doc/project-ideas.rst +++ b/pypy/doc/project-ideas.rst @@ -238,18 +238,17 @@ using more pypy-friendly technologies, e.g. cffi. Here is a partial list of good work that needs to be finished: -**matplotlib** https://github.com/mattip/matplotlib +**matplotlib** https://github.com/matplotlib/matplotlib - Status: the repo is an older version of matplotlib adapted to pypy and cpyext + TODO: the tkagg backend does not work, which makes tests fail on downstream + projects like Pandas, SciPy. It uses id(obj) as a c-pointer to obj in + tkagg.py, which requires refactoring - TODO: A suggested first step would be to merge the differences into - matplotlib/HEAD. The major problem is the use of a generic view into a - numpy ndarray. The int* fields would need to be converted into int[MAX_DIMS] - c-arrays and filled in. +**wxPython** https://bitbucket.org/amauryfa/wxpython-cffi -**wxPython** https://bitbucket.org/waedt/wxpython_cffi + Status: A project by a PyPy developer to adapt the Phoenix sip build system to cffi - Status: A GSOC 2013 project to adapt the Phoenix sip build system to cffi + The project is a continuation of a 2013 GSOC https://bitbucket.org/waedt/wxpython_cffi TODO: Merge the latest version of the wrappers and finish the sip conversion diff --git a/pypy/doc/whatsnew-head.rst b/pypy/doc/whatsnew-head.rst --- a/pypy/doc/whatsnew-head.rst +++ b/pypy/doc/whatsnew-head.rst @@ -17,3 +17,7 @@ .. branch: vmprof-0.4.8 Improve and fix issues with vmprof + +.. branch: issue-2592 + +CPyext PyListObject.pop must return the value diff --git a/pypy/module/_cffi_backend/test/_backend_test_c.py b/pypy/module/_cffi_backend/test/_backend_test_c.py --- a/pypy/module/_cffi_backend/test/_backend_test_c.py +++ b/pypy/module/_cffi_backend/test/_backend_test_c.py @@ -50,6 +50,10 @@ path = None else: path = ctypes.util.find_library(name) + if path is None and name == 'c': + assert sys.platform == 'win32' + assert sys.version_info >= (3,) + py.test.skip("dlopen(None) cannot work on Windows with Python 3") return load_library(path, flags) def test_load_library(): diff --git a/pypy/module/cpyext/dictobject.py b/pypy/module/cpyext/dictobject.py --- a/pypy/module/cpyext/dictobject.py +++ b/pypy/module/cpyext/dictobject.py @@ -286,6 +286,7 @@ pvalue[0] = as_pyobj(space, w_value) return 1 + _frozendict_cache[space].flag_map_or_seq = 'M' @cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL) def _PyDict_HasOnlyStringKeys(space, w_dict): keys_w = space.unpackiterable(w_dict) diff --git a/pypy/module/cpyext/sequence.py b/pypy/module/cpyext/sequence.py --- a/pypy/module/cpyext/sequence.py +++ b/pypy/module/cpyext/sequence.py @@ -346,11 +346,11 @@ def pop(self, w_list, index): w_list.switch_to_object_strategy() - w_list.strategy.pop(w_list, index) + return w_list.strategy.pop(w_list, index) def pop_end(self, w_list): w_list.switch_to_object_strategy() - w_list.strategy.pop_end(w_list) + return w_list.strategy.pop_end(w_list) def insert(self, w_list, index, w_item): w_list.switch_to_object_strategy() diff --git a/pypy/module/cpyext/test/test_iterator.py b/pypy/module/cpyext/test/test_iterator.py --- a/pypy/module/cpyext/test/test_iterator.py +++ b/pypy/module/cpyext/test/test_iterator.py @@ -33,6 +33,11 @@ return obj; ''' ), + ("get_dictproxy", "METH_O", + ''' + return PyDictProxy_New(args); + ''' + ), ("check", "METH_O", ''' return PyLong_FromLong( @@ -70,6 +75,10 @@ assert str(e.value).endswith("object is not iterable") # assert module.check(obj) == 2 + # make sure dictionaries return false for PySequence_Check + assert module.check({'a': 1}) == 2 + obj = module.get_dictproxy({'a': 10}) + assert module.check(obj) == 2 def test_iterable_nonmapping_object(self): module = self.import_extension('foo', [ diff --git a/pypy/module/cpyext/test/test_listobject.py b/pypy/module/cpyext/test/test_listobject.py --- a/pypy/module/cpyext/test/test_listobject.py +++ b/pypy/module/cpyext/test/test_listobject.py @@ -150,6 +150,13 @@ # tp_as_sequence should be filled, but tp_as_number should be NULL assert module.test_tp_as_() == 3 + l = module.newlist() + p = l.pop() + assert p == 1000 + p = l.pop(0) + assert p == 3 + assert l == [-5] + def test_list_macros(self): """The PyList_* macros cast, and calls expecting that build.""" module = self.import_extension('foo', [ diff --git a/pypy/module/test_lib_pypy/cffi_tests/cffi0/backend_tests.py b/pypy/module/test_lib_pypy/cffi_tests/cffi0/backend_tests.py --- a/pypy/module/test_lib_pypy/cffi_tests/cffi0/backend_tests.py +++ b/pypy/module/test_lib_pypy/cffi_tests/cffi0/backend_tests.py @@ -11,6 +11,10 @@ SIZE_OF_PTR = ctypes.sizeof(ctypes.c_void_p) SIZE_OF_WCHAR = ctypes.sizeof(ctypes.c_wchar) +def needs_dlopen_none(): + if sys.platform == 'win32' and sys.version_info >= (3,): + py.test.skip("dlopen(None) cannot work on Windows for Python 3") + class BackendTests: @@ -355,7 +359,6 @@ # p = ffi.new("wchar_t[]", u+'\U00023456') if SIZE_OF_WCHAR == 2: - assert sys.maxunicode == 0xffff assert len(p) == 3 assert p[0] == u+'\ud84d' assert p[1] == u+'\udc56' @@ -938,6 +941,7 @@ def test_enum_partial(self): ffi = FFI(backend=self.Backend()) ffi.cdef(r"enum foo {A, ...}; enum bar { B, C };") + needs_dlopen_none() lib = ffi.dlopen(None) assert lib.B == 0 py.test.raises(VerificationMissing, getattr, lib, "A") @@ -1845,6 +1849,7 @@ #define DOT_UL 1000UL enum foo {AA, BB=DOT, CC}; """) + needs_dlopen_none() lib = ffi.dlopen(None) assert ffi.string(ffi.cast("enum foo", 100)) == "BB" assert lib.DOT_0 == 0 @@ -1874,6 +1879,7 @@ ffi = FFI() ffi.include(ffi1) ffi.cdef("enum { EE2, EE3 };") + needs_dlopen_none() lib = ffi.dlopen(None) assert lib.EE1 == 0 assert lib.EE2 == 0 diff --git a/pypy/module/test_lib_pypy/cffi_tests/cffi0/test_function.py b/pypy/module/test_lib_pypy/cffi_tests/cffi0/test_function.py --- a/pypy/module/test_lib_pypy/cffi_tests/cffi0/test_function.py +++ b/pypy/module/test_lib_pypy/cffi_tests/cffi0/test_function.py @@ -6,6 +6,7 @@ from cffi.backend_ctypes import CTypesBackend from pypy.module.test_lib_pypy.cffi_tests.udir import udir from pypy.module.test_lib_pypy.cffi_tests.support import FdWriteCapture +from .backend_tests import needs_dlopen_none try: from StringIO import StringIO @@ -112,6 +113,7 @@ int fputs(const char *, void *); void *stderr; """) + needs_dlopen_none() ffi.C = ffi.dlopen(None) ffi.C.fputs # fetch before capturing, for easier debugging with FdWriteCapture() as fd: @@ -128,6 +130,7 @@ int fputs(char *, void *); void *stderr; """) + needs_dlopen_none() ffi.C = ffi.dlopen(None) ffi.C.fputs # fetch before capturing, for easier debugging with FdWriteCapture() as fd: @@ -144,6 +147,7 @@ int fprintf(void *, const char *format, ...); void *stderr; """) + needs_dlopen_none() ffi.C = ffi.dlopen(None) with FdWriteCapture() as fd: ffi.C.fprintf(ffi.C.stderr, b"hello with no arguments\n") @@ -170,6 +174,7 @@ ffi.cdef(""" int printf(const char *format, ...); """) + needs_dlopen_none() ffi.C = ffi.dlopen(None) e = py.test.raises(TypeError, ffi.C.printf, b"hello %d\n", 42) assert str(e.value) == ("argument 2 passed in the variadic part " @@ -180,6 +185,7 @@ ffi.cdef(""" int puts(const char *); """) + needs_dlopen_none() ffi.C = ffi.dlopen(None) fptr = ffi.C.puts assert ffi.typeof(fptr) == ffi.typeof("int(*)(const char*)") @@ -203,6 +209,7 @@ int fputs(const char *, void *); void *stderr; """) + needs_dlopen_none() ffi.C = ffi.dlopen(None) fptr = ffi.cast("int(*)(const char *txt, void *)", ffi.C.fputs) assert fptr == ffi.C.fputs @@ -236,6 +243,7 @@ ffi.cdef(""" int strlen(char[]); """) + needs_dlopen_none() ffi.C = ffi.dlopen(None) p = ffi.new("char[]", b"hello") res = ffi.C.strlen(p) @@ -248,6 +256,7 @@ ffi.cdef(""" void *stdout; """) + needs_dlopen_none() C = ffi.dlopen(None) pout = C.stdout C.stdout = ffi.NULL @@ -260,6 +269,7 @@ ffi.cdef(""" char *strchr(const char *s, int c); """) + needs_dlopen_none() ffi.C = ffi.dlopen(None) p = ffi.new("char[]", b"hello world!") q = ffi.C.strchr(p, ord('w')) @@ -276,6 +286,7 @@ struct in_addr { unsigned int s_addr; }; char *inet_ntoa(struct in_addr in); """) + needs_dlopen_none() ffi.C = ffi.dlopen(None) ina = ffi.new("struct in_addr *", [0x04040404]) a = ffi.C.inet_ntoa(ina[0]) @@ -297,6 +308,7 @@ filename = str(udir.join('fputs_custom_FILE')) ffi = FFI(backend=self.Backend()) ffi.cdef("int fputs(const char *, FILE *);") + needs_dlopen_none() C = ffi.dlopen(None) with open(filename, 'wb') as f: f.write(b'[') @@ -312,6 +324,7 @@ ffi = FFI(backend=self.Backend()) ffi.cdef("""enum foo_e { AA, BB, CC=5, DD }; typedef enum { EE=-5, FF } some_enum_t;""") + needs_dlopen_none() lib = ffi.dlopen(None) assert lib.AA == 0 assert lib.BB == 1 @@ -323,6 +336,7 @@ def test_void_star_accepts_string(self): ffi = FFI(backend=self.Backend()) ffi.cdef("""int strlen(const void *);""") + needs_dlopen_none() lib = ffi.dlopen(None) res = lib.strlen(b"hello") assert res == 5 @@ -332,6 +346,7 @@ py.test.skip("not supported by the ctypes backend") ffi = FFI(backend=self.Backend()) ffi.cdef("""int strlen(signed char *);""") + needs_dlopen_none() lib = ffi.dlopen(None) res = lib.strlen(b"hello") assert res == 5 @@ -341,6 +356,7 @@ py.test.skip("not supported by the ctypes backend") ffi = FFI(backend=self.Backend()) ffi.cdef("""int strlen(unsigned char *);""") + needs_dlopen_none() lib = ffi.dlopen(None) res = lib.strlen(b"hello") assert res == 5 diff --git a/pypy/module/test_lib_pypy/cffi_tests/cffi0/test_parsing.py b/pypy/module/test_lib_pypy/cffi_tests/cffi0/test_parsing.py --- a/pypy/module/test_lib_pypy/cffi_tests/cffi0/test_parsing.py +++ b/pypy/module/test_lib_pypy/cffi_tests/cffi0/test_parsing.py @@ -1,6 +1,8 @@ # Generated by pypy/tool/import_cffi.py import py, sys, re from cffi import FFI, FFIError, CDefError, VerificationError +from .backend_tests import needs_dlopen_none + class FakeBackend(object): @@ -91,6 +93,7 @@ def test_pipe(): ffi = FFI(backend=FakeBackend()) ffi.cdef("int pipe(int pipefd[2]);") + needs_dlopen_none() C = ffi.dlopen(None) func = C.pipe assert func.name == 'pipe' @@ -99,6 +102,7 @@ def test_vararg(): ffi = FFI(backend=FakeBackend()) ffi.cdef("short foo(int, ...);") + needs_dlopen_none() C = ffi.dlopen(None) func = C.foo assert func.name == 'foo' @@ -109,6 +113,7 @@ ffi.cdef(""" int foo(void); """) + needs_dlopen_none() C = ffi.dlopen(None) assert C.foo.BType == '<func (), <int>, False>' @@ -119,6 +124,7 @@ typedef UInt UIntReally; UInt foo(void); """) + needs_dlopen_none() C = ffi.dlopen(None) assert str(ffi.typeof("UIntReally")) == '<unsigned int>' assert C.foo.BType == '<func (), <unsigned int>, False>' @@ -129,6 +135,7 @@ typedef struct { int a, b; } foo_t, *foo_p; int foo(foo_p[]); """) + needs_dlopen_none() C = ffi.dlopen(None) assert str(ffi.typeof("foo_t")) == '<int>a, <int>b' assert str(ffi.typeof("foo_p")) == '<pointer to <int>a, <int>b>' @@ -218,6 +225,7 @@ def test_override(): ffi = FFI(backend=FakeBackend()) + needs_dlopen_none() C = ffi.dlopen(None) ffi.cdef("int foo(void);") py.test.raises(FFIError, ffi.cdef, "long foo(void);") @@ -404,6 +412,7 @@ ffi.cdef(""" enum Enum { POS = +1, TWO = 2, NIL = 0, NEG = -1, OP = (POS+TWO)-1}; """) + needs_dlopen_none() C = ffi.dlopen(None) assert C.POS == 1 assert C.TWO == 2 diff --git a/pypy/module/test_lib_pypy/cffi_tests/cffi1/test_new_ffi_1.py b/pypy/module/test_lib_pypy/cffi_tests/cffi1/test_new_ffi_1.py --- a/pypy/module/test_lib_pypy/cffi_tests/cffi1/test_new_ffi_1.py +++ b/pypy/module/test_lib_pypy/cffi_tests/cffi1/test_new_ffi_1.py @@ -419,7 +419,6 @@ # p = ffi.new("wchar_t[]", u+'\U00023456') if SIZE_OF_WCHAR == 2: - assert sys.maxunicode == 0xffff assert len(p) == 3 assert p[0] == u+'\ud84d' assert p[1] == u+'\udc56' diff --git a/pypy/module/test_lib_pypy/cffi_tests/cffi1/test_re_python.py b/pypy/module/test_lib_pypy/cffi_tests/cffi1/test_re_python.py --- a/pypy/module/test_lib_pypy/cffi_tests/cffi1/test_re_python.py +++ b/pypy/module/test_lib_pypy/cffi_tests/cffi1/test_re_python.py @@ -95,6 +95,8 @@ if sys.platform == 'win32': import ctypes.util name = ctypes.util.find_msvcrt() + if name is None: + py.test.skip("dlopen(None) cannot work on Windows with Python 3") lib = ffi.dlopen(name) assert lib.strlen(b"hello") == 5 diff --git a/pypy/module/test_lib_pypy/cffi_tests/cffi1/test_recompiler.py b/pypy/module/test_lib_pypy/cffi_tests/cffi1/test_recompiler.py --- a/pypy/module/test_lib_pypy/cffi_tests/cffi1/test_recompiler.py +++ b/pypy/module/test_lib_pypy/cffi_tests/cffi1/test_recompiler.py @@ -2260,6 +2260,9 @@ assert ffi.typeof("int16_t") is ffi.typeof("char16_t") is ffi.typeof("long") def test_char16_char32_type(no_cpp=False): + if no_cpp is False and sys.platform == "win32": + py.test.skip("aaaaaaa why do modern MSVC compilers still define " + "a very old __cplusplus value") ffi = FFI() ffi.cdef(""" char16_t foo_2bytes(char16_t); @@ -2270,7 +2273,7 @@ typedef uint_least16_t char16_t; typedef uint_least32_t char32_t; #endif - + char16_t foo_2bytes(char16_t a) { return (char16_t)(a + 42); } char32_t foo_4bytes(char32_t a) { return (char32_t)(a + 42); } """, no_cpp=no_cpp) diff --git a/pypy/module/test_lib_pypy/cffi_tests/embedding/initerror.py b/pypy/module/test_lib_pypy/cffi_tests/embedding/initerror.py new file mode 100644 --- /dev/null +++ b/pypy/module/test_lib_pypy/cffi_tests/embedding/initerror.py @@ -0,0 +1,19 @@ +# Generated by pypy/tool/import_cffi.py +import cffi + +ffi = cffi.FFI() + +ffi.embedding_api(""" + int add1(int, int); +""") + +ffi.embedding_init_code(r""" + raise KeyError +""") + +ffi.set_source("_initerror_cffi", """ +""") + +fn = ffi.compile(verbose=True) +print('FILENAME: %s' % (fn,)) + _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit