[pypy-commit] pypy py3.5: hg merge default
arigo
pypy.commits at gmail.com
Tue Feb 21 03:05:32 EST 2017
Author: Armin Rigo <arigo at tunes.org>
Branch: py3.5
Changeset: r90240:f9cd9cb3c6b5
Date: 2017-02-21 08:04 +0000
http://bitbucket.org/pypy/pypy/changeset/f9cd9cb3c6b5/
Log: hg merge default
diff --git a/lib-python/2.7/sysconfig.py b/lib-python/2.7/sysconfig.py
--- a/lib-python/2.7/sysconfig.py
+++ b/lib-python/2.7/sysconfig.py
@@ -529,7 +529,9 @@
for suffix, mode, type_ in imp.get_suffixes():
if type_ == imp.C_EXTENSION:
_CONFIG_VARS['SOABI'] = suffix.split('.')[1]
- break
+ break
+ _CONFIG_VARS['INCLUDEPY'] = os.path.join(_CONFIG_VARS['prefix'],
+ 'include')
if args:
vals = []
diff --git a/pypy/module/cpyext/pystate.py b/pypy/module/cpyext/pystate.py
--- a/pypy/module/cpyext/pystate.py
+++ b/pypy/module/cpyext/pystate.py
@@ -1,6 +1,6 @@
from pypy.module.cpyext.api import (
- cpython_api, generic_cpy_call, CANNOT_FAIL, CConfig, cpython_struct)
-from pypy.module.cpyext.pyobject import PyObject, Py_DecRef, make_ref, from_ref
+ cpython_api, CANNOT_FAIL, cpython_struct)
+from pypy.module.cpyext.pyobject import PyObject, Py_DecRef, make_ref
from pypy.interpreter.error import OperationError
from rpython.rtyper.lltypesystem import rffi, lltype
from rpython.rlib import rthread
@@ -29,8 +29,9 @@
the current thread must have acquired it. (This function is available even
when thread support is disabled at compile time.)"""
state = space.fromcache(InterpreterState)
- tstate = state.swap_thread_state(
- space, lltype.nullptr(PyThreadState.TO))
+ ec = space.getexecutioncontext()
+ tstate = state._get_thread_state(space, ec).memory
+ ec.cpyext_threadstate_is_current = False
return tstate
@cpython_api([PyThreadState], lltype.Void, gil="acquire")
@@ -40,8 +41,7 @@
NULL. If the lock has been created, the current thread must not have
acquired it, otherwise deadlock ensues. (This function is available even
when thread support is disabled at compile time.)"""
- state = space.fromcache(InterpreterState)
- state.swap_thread_state(space, tstate)
+ PyThreadState_Swap(space, tstate)
@cpython_api([], lltype.Void)
def PyEval_InitThreads(space):
@@ -91,9 +91,11 @@
# released, so a check against that can't be used to determine the need for
# initialization).
ExecutionContext.cpyext_initialized_threadstate = False
+ExecutionContext.cpyext_threadstate_is_current = True
def cleanup_cpyext_state(self):
self.cpyext_threadstate = None
+ self.cpyext_threadstate_is_current = True
self.cpyext_initialized_threadstate = False
ExecutionContext.cleanup_cpyext_state = cleanup_cpyext_state
@@ -162,6 +164,7 @@
if not ec.cpyext_initialized_threadstate:
ec.cpyext_threadstate = self.new_thread_state(space)
ec.cpyext_initialized_threadstate = True
+ ec.cpyext_threadstate_is_current = True
return ec.cpyext_threadstate
@cpython_api([], PyThreadState, error=CANNOT_FAIL)
@@ -185,7 +188,7 @@
meant that an exception was raised."""
state = space.fromcache(InterpreterState)
ts = state.get_thread_state(space)
- if not ts:
+ if not space.getexecutioncontext().cpyext_threadstate_is_current:
return lltype.nullptr(PyObject.TO)
return ts.c_dict
@@ -193,8 +196,21 @@
def PyThreadState_Swap(space, tstate):
"""Swap the current thread state with the thread state given by the argument
tstate, which may be NULL. The global interpreter lock must be held."""
+ ec = space.getexecutioncontext()
state = space.fromcache(InterpreterState)
- return state.swap_thread_state(space, tstate)
+ old_tstate = state.get_thread_state(space)
+ if not ec.cpyext_threadstate_is_current:
+ old_tstate = lltype.nullptr(PyThreadState.TO)
+ if tstate:
+ if tstate != state.get_thread_state(space):
+ print "Error in cpyext, CPython compatibility layer:"
+ print "PyThreadState_Swap() cannot be used to switch to another"
+ print "different PyThreadState right now"
+ raise AssertionError
+ ec.cpyext_threadstate_is_current = True
+ else:
+ ec.cpyext_threadstate_is_current = False
+ return old_tstate
@cpython_api([PyThreadState], lltype.Void, gil="acquire")
def PyEval_AcquireThread(space, tstate):
@@ -258,6 +274,7 @@
if not we_are_translated():
_workaround_cpython_untranslated(space)
#
+ ec.cpyext_threadstate_is_current = True
return rffi.cast(PyGILState_STATE, previous_state)
@cpython_api([PyGILState_STATE], lltype.Void, gil="pygilstate_release")
@@ -269,6 +286,7 @@
else:
assert ec.cpyext_gilstate_counter_noleave == 0
assert oldstate == PyGILState_UNLOCKED
+ ec.cpyext_threadstate_is_current = False
space.threadlocals.leave_thread(space)
@cpython_api([], PyInterpreterState, error=CANNOT_FAIL)
diff --git a/pypy/module/cpyext/test/test_api.py b/pypy/module/cpyext/test/test_api.py
--- a/pypy/module/cpyext/test/test_api.py
+++ b/pypy/module/cpyext/test/test_api.py
@@ -66,7 +66,7 @@
raise
try:
- self.space.getexecutioncontext().cleanup_cpyext_threadstate()
+ self.space.getexecutioncontext().cleanup_cpyext_state()
except AttributeError:
pass
diff --git a/pypy/module/cpyext/test/test_cpyext.py b/pypy/module/cpyext/test/test_cpyext.py
--- a/pypy/module/cpyext/test/test_cpyext.py
+++ b/pypy/module/cpyext/test/test_cpyext.py
@@ -105,7 +105,6 @@
del obj
import gc; gc.collect()
- space.getexecutioncontext().cleanup_cpyext_state()
for w_obj in state.non_heaptypes_w:
Py_DecRef(space, w_obj)
@@ -182,6 +181,7 @@
def teardown_method(self, meth):
if self.runappdirect:
return
+ self.space.getexecutioncontext().cleanup_cpyext_state()
self.cleanup_references(self.space)
# XXX: like AppTestCpythonExtensionBase.teardown_method:
# find out how to disable check_and_print_leaks() if the
@@ -372,6 +372,7 @@
return
for name in self.imported_module_names:
self.unimport_module(name)
+ self.space.getexecutioncontext().cleanup_cpyext_state()
self.cleanup_references(self.space)
# XXX: find out how to disable check_and_print_leaks() if the
# test failed...
diff --git a/pypy/module/cpyext/test/test_pystate.py b/pypy/module/cpyext/test/test_pystate.py
--- a/pypy/module/cpyext/test/test_pystate.py
+++ b/pypy/module/cpyext/test/test_pystate.py
@@ -79,8 +79,8 @@
return PyLong_FromLong(0);
}
- new_tstate = PyThreadState_Get(); /* fails on cpython */
- if (new_tstate != NULL) {
+ PyObject* d = PyThreadState_GetDict(); /* fails on cpython */
+ if (d != NULL) {
return PyLong_FromLong(1);
}
@@ -171,6 +171,26 @@
res = module.bounce()
assert res == 4
+ def test_nested_pygilstate_ensure(self):
+ module = self.import_extension('foo', [
+ ("bounce", "METH_NOARGS",
+ """
+ PyGILState_STATE gilstate;
+ PyThreadState *tstate;
+ PyObject *dict;
+
+ if (PyEval_ThreadsInitialized() == 0)
+ PyEval_InitThreads();
+ dict = PyThreadState_GetDict();
+ gilstate = PyGILState_Ensure();
+ PyGILState_Release(gilstate);
+ if (PyThreadState_GetDict() != dict)
+ return PyLong_FromLong(-2);
+ return PyLong_FromLong(4);
+ """)])
+ res = module.bounce()
+ assert res == 4
+
def test_threadsinitialized(self):
module = self.import_extension('foo', [
("test", "METH_NOARGS",
diff --git a/pypy/objspace/std/objspace.py b/pypy/objspace/std/objspace.py
--- a/pypy/objspace/std/objspace.py
+++ b/pypy/objspace/std/objspace.py
@@ -135,10 +135,7 @@
assert typedef is not None
return self.fromcache(TypeCache).getorbuild(typedef)
- # BACKCOMPAT: this function is still accepted for backward
- # compatibility, but its usage should be progressively removed
- # everywhere apart from tests.
- #@not_rpython # only for tests
+ @not_rpython # only for tests
@specialize.argtype(1)
def wrap(self, x):
""" Wraps the Python value 'x' into one of the wrapper classes. This
diff --git a/rpython/translator/platform/darwin.py b/rpython/translator/platform/darwin.py
--- a/rpython/translator/platform/darwin.py
+++ b/rpython/translator/platform/darwin.py
@@ -31,8 +31,12 @@
return self.rpath_flags
def _args_for_shared(self, args):
+ if hasattr(self, '_exe_name'):
+ target = os.path.basename(self._exe_name)
+ else:
+ target = '$(TARGET)' # inside a Makefile
return (list(self.shared_only)
- + ['-dynamiclib', '-install_name', '@rpath/$(TARGET)', '-undefined', 'dynamic_lookup', '-flat_namespace']
+ + ['-dynamiclib', '-install_name', '@rpath/' + target, '-undefined', 'dynamic_lookup', '-flat_namespace']
+ args)
def _include_dirs_for_libffi(self):
diff --git a/rpython/translator/platform/posix.py b/rpython/translator/platform/posix.py
--- a/rpython/translator/platform/posix.py
+++ b/rpython/translator/platform/posix.py
@@ -51,6 +51,7 @@
return ["-Wl,--export-dynamic"]
def _link(self, cc, ofiles, link_args, standalone, exe_name):
+ self._exe_name = str(exe_name)
args = [str(ofile) for ofile in ofiles] + link_args
args += ['-o', str(exe_name)]
if not standalone:
More information about the pypy-commit
mailing list