Author: Wim Lavrijsen <wlavrij...@lbl.gov> Branch: cppyy-packaging Changeset: r94810:935c38f271a8 Date: 2018-07-05 17:37 -0700 http://bitbucket.org/pypy/pypy/changeset/935c38f271a8/
Log: merge default into cppyy-packaging diff --git a/lib-python/2.7/code.py b/lib-python/2.7/code.py --- a/lib-python/2.7/code.py +++ b/lib-python/2.7/code.py @@ -104,6 +104,12 @@ except SystemExit: raise except: + if softspace(sys.stdout, 0): + print + try: + sys.stdout.flush() + except: + pass self.showtraceback() else: if softspace(sys.stdout, 0): diff --git a/pypy/doc/sandbox.rst b/pypy/doc/sandbox.rst --- a/pypy/doc/sandbox.rst +++ b/pypy/doc/sandbox.rst @@ -3,6 +3,11 @@ PyPy's sandboxing features ========================== +.. warning:: This is not actively maintained. You will likely have to fix + some issues yourself, or otherwise play around on your own. We provide + this documentation for historical reasions, it will not translate or + run on the latest PyPy code base. + Introduction ------------ diff --git a/pypy/interpreter/test/test_raise.py b/pypy/interpreter/test/test_raise.py --- a/pypy/interpreter/test/test_raise.py +++ b/pypy/interpreter/test/test_raise.py @@ -280,3 +280,15 @@ def __new__(cls, *args): return object() raises(TypeError, "raise MyException") + + def test_with_exit_True(self): + class X: + def __enter__(self): + pass + def __exit__(self, *args): + return True + def g(): + with X(): + return 42 + assert False, "unreachable" + assert g() == 42 diff --git a/pypy/module/cpyext/api.py b/pypy/module/cpyext/api.py --- a/pypy/module/cpyext/api.py +++ b/pypy/module/cpyext/api.py @@ -643,7 +643,7 @@ '_PyTraceMalloc_Track', '_PyTraceMalloc_Untrack', 'PyMem_Malloc', 'PyObject_Free', 'PyObject_GC_Del', 'PyType_GenericAlloc', '_PyObject_New', '_PyObject_NewVar', - '_PyObject_GC_New', '_PyObject_GC_NewVar', + '_PyObject_GC_Malloc', '_PyObject_GC_New', '_PyObject_GC_NewVar', 'PyObject_Init', 'PyObject_InitVar', 'PyInt_FromLong', 'PyTuple_New', '_Py_Dealloc', ] @@ -772,6 +772,9 @@ # a pointer to PyObject PyObjectP = rffi.CArrayPtr(PyObject) +# int * +INTP_real = rffi.CArrayPtr(rffi.INT_real) + def configure_types(): for config in (CConfig, CConfig2): for name, TYPE in rffi_platform.configure(config).iteritems(): diff --git a/pypy/module/cpyext/include/object.h b/pypy/module/cpyext/include/object.h --- a/pypy/module/cpyext/include/object.h +++ b/pypy/module/cpyext/include/object.h @@ -383,6 +383,7 @@ PyAPI_FUNC(PyObject *) _PyObject_New(PyTypeObject *); PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, Py_ssize_t); +PyAPI_FUNC(PyObject *) _PyObject_GC_Malloc(size_t); PyAPI_FUNC(PyObject *) _PyObject_GC_New(PyTypeObject *); PyAPI_FUNC(PyVarObject *) _PyObject_GC_NewVar(PyTypeObject *, Py_ssize_t); diff --git a/pypy/module/cpyext/longobject.py b/pypy/module/cpyext/longobject.py --- a/pypy/module/cpyext/longobject.py +++ b/pypy/module/cpyext/longobject.py @@ -1,7 +1,7 @@ from rpython.rtyper.lltypesystem import lltype, rffi from pypy.module.cpyext.api import ( cpython_api, PyObject, build_type_checkers_flags, Py_ssize_t, - CONST_STRING, ADDR, CANNOT_FAIL) + CONST_STRING, ADDR, CANNOT_FAIL, INTP_real) from pypy.objspace.std.longobject import W_LongObject from pypy.interpreter.error import OperationError, oefmt from pypy.module.cpyext.intobject import PyInt_AsUnsignedLongMask @@ -112,7 +112,7 @@ num = space.bigint_w(w_long) return num.ulonglongmask() -@cpython_api([PyObject, rffi.CArrayPtr(rffi.INT_real)], lltype.Signed, +@cpython_api([PyObject, INTP_real], lltype.Signed, error=-1) def PyLong_AsLongAndOverflow(space, w_long, overflow_ptr): """ @@ -133,7 +133,7 @@ overflow_ptr[0] = rffi.cast(rffi.INT_real, -1) return -1 -@cpython_api([PyObject, rffi.CArrayPtr(rffi.INT_real)], rffi.LONGLONG, +@cpython_api([PyObject, INTP_real], rffi.LONGLONG, error=-1) def PyLong_AsLongLongAndOverflow(space, w_long, overflow_ptr): """ diff --git a/pypy/module/cpyext/object.py b/pypy/module/cpyext/object.py --- a/pypy/module/cpyext/object.py +++ b/pypy/module/cpyext/object.py @@ -1,7 +1,7 @@ from rpython.rtyper.lltypesystem import rffi, lltype from pypy.module.cpyext.api import ( cpython_api, generic_cpy_call, CANNOT_FAIL, Py_ssize_t, Py_ssize_tP, - PyVarObject, size_t, slot_function, + PyVarObject, size_t, slot_function, INTP_real, Py_TPFLAGS_HEAPTYPE, Py_LT, Py_LE, Py_EQ, Py_NE, Py_GT, Py_GE, CONST_STRING, FILEP, fwrite, c_only) from pypy.module.cpyext.pyobject import ( @@ -221,14 +221,14 @@ expression cmp(o1, o2).""" return space.int_w(space.cmp(w_o1, w_o2)) -@cpython_api([PyObject, PyObject, rffi.INTP], rffi.INT_real, error=-1) +@cpython_api([PyObject, PyObject, INTP_real], rffi.INT_real, error=-1) def PyObject_Cmp(space, w_o1, w_o2, result): """Compare the values of o1 and o2 using a routine provided by o1, if one exists, otherwise with a routine provided by o2. The result of the comparison is returned in result. Returns -1 on failure. This is the equivalent of the Python statement result = cmp(o1, o2).""" res = space.int_w(space.cmp(w_o1, w_o2)) - result[0] = rffi.cast(rffi.INT, res) + result[0] = rffi.cast(rffi.INT_real, res) return 0 @cpython_api([PyObject, PyObject, rffi.INT_real], PyObject) diff --git a/pypy/module/cpyext/pystrtod.py b/pypy/module/cpyext/pystrtod.py --- a/pypy/module/cpyext/pystrtod.py +++ b/pypy/module/cpyext/pystrtod.py @@ -1,6 +1,6 @@ import errno from pypy.interpreter.error import oefmt -from pypy.module.cpyext.api import cpython_api, CONST_STRING +from pypy.module.cpyext.api import cpython_api, CONST_STRING, INTP_real from pypy.module.cpyext.pyobject import PyObject from rpython.rlib import rdtoa from rpython.rlib import rfloat @@ -80,7 +80,7 @@ if not user_endptr: lltype.free(endptr, flavor='raw') -@cpython_api([rffi.DOUBLE, lltype.Char, rffi.INT_real, rffi.INT_real, rffi.INTP], rffi.CCHARP) +@cpython_api([rffi.DOUBLE, lltype.Char, rffi.INT_real, rffi.INT_real, INTP_real], rffi.CCHARP) def PyOS_double_to_string(space, val, format_code, precision, flags, ptype): """Convert a double val to a string using supplied format_code, precision, and flags. @@ -114,7 +114,7 @@ buffer, rtype = rfloat.double_to_string(val, format_code, intmask(precision), intmask(flags)) - if ptype != lltype.nullptr(rffi.INTP.TO): - ptype[0] = rffi.cast(rffi.INT, DOUBLE_TO_STRING_TYPES_MAP[rtype]) + if ptype != lltype.nullptr(INTP_real.TO): + ptype[0] = rffi.cast(rffi.INT_real, DOUBLE_TO_STRING_TYPES_MAP[rtype]) bufp = rffi.str2charp(buffer) return bufp diff --git a/pypy/module/cpyext/src/object.c b/pypy/module/cpyext/src/object.c --- a/pypy/module/cpyext/src/object.c +++ b/pypy/module/cpyext/src/object.c @@ -60,6 +60,11 @@ return (PyObject*)_PyObject_NewVar(type, 0); } +PyObject * _PyObject_GC_Malloc(size_t size) +{ + return (PyObject *)PyObject_Malloc(size); +} + PyObject * _PyObject_GC_New(PyTypeObject *type) { return _PyObject_New(type); diff --git a/pypy/module/cpyext/test/test_object.py b/pypy/module/cpyext/test/test_object.py --- a/pypy/module/cpyext/test/test_object.py +++ b/pypy/module/cpyext/test/test_object.py @@ -5,7 +5,7 @@ from rpython.rtyper.lltypesystem import rffi, lltype from pypy.module.cpyext.pyobject import get_w_obj_and_decref from pypy.module.cpyext.api import ( - Py_LT, Py_LE, Py_NE, Py_EQ, Py_GE, Py_GT) + Py_LT, Py_LE, Py_NE, Py_EQ, Py_GE, Py_GT, INTP_real) from pypy.module.cpyext.object import ( PyObject_IsTrue, PyObject_Not, PyObject_GetAttrString, PyObject_DelAttrString, PyObject_GetAttr, PyObject_DelAttr, @@ -205,7 +205,7 @@ def test_cmp(self, space, api): w = space.wrap - with lltype.scoped_alloc(rffi.INTP.TO, 1) as ptr: + with lltype.scoped_alloc(INTP_real.TO, 1) as ptr: assert api.PyObject_Cmp(w(42), w(72), ptr) == 0 assert ptr[0] == -1 assert api.PyObject_Cmp(w("a"), w("a"), ptr) == 0 diff --git a/pypy/module/cpyext/test/test_pystrtod.py b/pypy/module/cpyext/test/test_pystrtod.py --- a/pypy/module/cpyext/test/test_pystrtod.py +++ b/pypy/module/cpyext/test/test_pystrtod.py @@ -4,7 +4,7 @@ from pypy.module.cpyext.test.test_api import BaseApiTest, raises_w from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype -from pypy.module.cpyext.pystrtod import PyOS_string_to_double +from pypy.module.cpyext.pystrtod import PyOS_string_to_double, INTP_real class TestPyOS_string_to_double(BaseApiTest): @@ -90,7 +90,7 @@ class TestPyOS_double_to_string(BaseApiTest): def test_format_code(self, api): - ptype = lltype.malloc(rffi.INTP.TO, 1, flavor='raw') + ptype = lltype.malloc(INTP_real.TO, 1, flavor='raw') r = api.PyOS_double_to_string(150.0, 'e', 1, 0, ptype) assert '1.5e+02' == rffi.charp2str(r) type_value = rffi.cast(lltype.Signed, ptype[0]) @@ -99,7 +99,7 @@ lltype.free(ptype, flavor='raw') def test_precision(self, api): - ptype = lltype.malloc(rffi.INTP.TO, 1, flavor='raw') + ptype = lltype.malloc(INTP_real.TO, 1, flavor='raw') r = api.PyOS_double_to_string(3.14159269397, 'g', 5, 0, ptype) assert '3.1416' == rffi.charp2str(r) type_value = rffi.cast(lltype.Signed, ptype[0]) @@ -108,7 +108,7 @@ lltype.free(ptype, flavor='raw') def test_flags_sign(self, api): - ptype = lltype.malloc(rffi.INTP.TO, 1, flavor='raw') + ptype = lltype.malloc(INTP_real.TO, 1, flavor='raw') r = api.PyOS_double_to_string(-3.14, 'g', 3, 1, ptype) assert '-3.14' == rffi.charp2str(r) type_value = rffi.cast(lltype.Signed, ptype[0]) @@ -117,7 +117,7 @@ lltype.free(ptype, flavor='raw') def test_flags_add_dot_0(self, api): - ptype = lltype.malloc(rffi.INTP.TO, 1, flavor='raw') + ptype = lltype.malloc(INTP_real.TO, 1, flavor='raw') r = api.PyOS_double_to_string(3, 'g', 5, 2, ptype) assert '3.0' == rffi.charp2str(r) type_value = rffi.cast(lltype.Signed, ptype[0]) @@ -126,7 +126,7 @@ lltype.free(ptype, flavor='raw') def test_flags_alt(self, api): - ptype = lltype.malloc(rffi.INTP.TO, 1, flavor='raw') + ptype = lltype.malloc(INTP_real.TO, 1, flavor='raw') r = api.PyOS_double_to_string(314., 'g', 3, 4, ptype) assert '314.' == rffi.charp2str(r) type_value = rffi.cast(lltype.Signed, ptype[0]) @@ -135,7 +135,7 @@ lltype.free(ptype, flavor='raw') def test_ptype_nan(self, api): - ptype = lltype.malloc(rffi.INTP.TO, 1, flavor='raw') + ptype = lltype.malloc(INTP_real.TO, 1, flavor='raw') r = api.PyOS_double_to_string(float('nan'), 'g', 3, 4, ptype) assert 'nan' == rffi.charp2str(r) type_value = rffi.cast(lltype.Signed, ptype[0]) @@ -144,7 +144,7 @@ lltype.free(ptype, flavor='raw') def test_ptype_infinity(self, api): - ptype = lltype.malloc(rffi.INTP.TO, 1, flavor='raw') + ptype = lltype.malloc(INTP_real.TO, 1, flavor='raw') r = api.PyOS_double_to_string(1e200 * 1e200, 'g', 0, 0, ptype) assert 'inf' == rffi.charp2str(r) type_value = rffi.cast(lltype.Signed, ptype[0]) @@ -153,8 +153,8 @@ lltype.free(ptype, flavor='raw') def test_ptype_null(self, api): - ptype = lltype.nullptr(rffi.INTP.TO) + ptype = lltype.nullptr(INTP_real.TO) r = api.PyOS_double_to_string(3.14, 'g', 3, 0, ptype) assert '3.14' == rffi.charp2str(r) - assert ptype == lltype.nullptr(rffi.INTP.TO) + assert ptype == lltype.nullptr(INTP_real.TO) rffi.free_charp(r) diff --git a/pypy/module/cpyext/test/test_unicodeobject.py b/pypy/module/cpyext/test/test_unicodeobject.py --- a/pypy/module/cpyext/test/test_unicodeobject.py +++ b/pypy/module/cpyext/test/test_unicodeobject.py @@ -4,7 +4,7 @@ from pypy.module.cpyext.test.test_cpyext import AppTestCpythonExtensionBase from pypy.module.cpyext.unicodeobject import ( Py_UNICODE, PyUnicodeObject, new_empty_unicode) -from pypy.module.cpyext.api import PyObjectP, PyObject +from pypy.module.cpyext.api import PyObjectP, PyObject, INTP_real from pypy.module.cpyext.pyobject import decref, from_ref from rpython.rtyper.lltypesystem import rffi, lltype import sys, py @@ -464,8 +464,8 @@ value = 1 else: value = 0 - pendian = lltype.malloc(rffi.INTP.TO, 1, flavor='raw') - pendian[0] = rffi.cast(rffi.INT, value) + pendian = lltype.malloc(INTP_real.TO, 1, flavor='raw') + pendian[0] = rffi.cast(rffi.INT_real, value) else: pendian = None @@ -477,7 +477,7 @@ rffi.free_charp(strict_charp) if pendian: if realendian is not None: - assert rffi.cast(rffi.INT, realendian) == pendian[0] + assert rffi.cast(rffi.INT_real, realendian) == pendian[0] lltype.free(pendian, flavor='raw') test("\x61\x00\x62\x00\x63\x00\x64\x00", -1) @@ -500,8 +500,8 @@ value = 1 else: value = 0 - pendian = lltype.malloc(rffi.INTP.TO, 1, flavor='raw') - pendian[0] = rffi.cast(rffi.INT, value) + pendian = lltype.malloc(INTP_real.TO, 1, flavor='raw') + pendian[0] = rffi.cast(rffi.INT_real, value) else: pendian = None diff --git a/pypy/module/cpyext/unicodeobject.py b/pypy/module/cpyext/unicodeobject.py --- a/pypy/module/cpyext/unicodeobject.py +++ b/pypy/module/cpyext/unicodeobject.py @@ -3,7 +3,7 @@ from pypy.module.unicodedata import unicodedb from pypy.module.cpyext.api import ( CANNOT_FAIL, Py_ssize_t, build_type_checkers_flags, cpython_api, - bootstrap_function, CONST_STRING, + bootstrap_function, CONST_STRING, INTP_real, CONST_WSTRING, slot_function, cts, parse_dir) from pypy.module.cpyext.pyerrors import PyErr_BadArgument from pypy.module.cpyext.pyobject import ( @@ -526,7 +526,7 @@ if sys.platform == 'win32': make_conversion_functions('MBCS', 'mbcs') -@cpython_api([CONST_STRING, Py_ssize_t, CONST_STRING, rffi.INTP], PyObject) +@cpython_api([CONST_STRING, Py_ssize_t, CONST_STRING, INTP_real], PyObject) def PyUnicode_DecodeUTF16(space, s, size, llerrors, pbyteorder): """Decode length bytes from a UTF-16 encoded buffer string and return the corresponding Unicode object. errors (if non-NULL) defines the error @@ -576,11 +576,11 @@ None, # errorhandler byteorder) if pbyteorder is not None: - pbyteorder[0] = rffi.cast(rffi.INT, byteorder) + pbyteorder[0] = rffi.cast(rffi.INT_real, byteorder) return space.newunicode(result) -@cpython_api([CONST_STRING, Py_ssize_t, CONST_STRING, rffi.INTP], PyObject) +@cpython_api([CONST_STRING, Py_ssize_t, CONST_STRING, INTP_real], PyObject) def PyUnicode_DecodeUTF32(space, s, size, llerrors, pbyteorder): """Decode length bytes from a UTF-32 encoded buffer string and return the corresponding Unicode object. errors (if non-NULL) @@ -632,7 +632,7 @@ None, # errorhandler byteorder) if pbyteorder is not None: - pbyteorder[0] = rffi.cast(rffi.INT, byteorder) + pbyteorder[0] = rffi.cast(rffi.INT_real, byteorder) return space.newunicode(result) diff --git a/pypy/module/sys/app.py b/pypy/module/sys/app.py --- a/pypy/module/sys/app.py +++ b/pypy/module/sys/app.py @@ -11,6 +11,11 @@ # Flush stdout as well, both files may refer to the same file try: + if sys.stdout.softspace: + print + except: + pass + try: sys.stdout.flush() except: pass diff --git a/pypy/module/sys/test/test_sysmodule.py b/pypy/module/sys/test/test_sysmodule.py --- a/pypy/module/sys/test/test_sysmodule.py +++ b/pypy/module/sys/test/test_sysmodule.py @@ -256,6 +256,30 @@ print repr(err.getvalue()) assert err.getvalue().endswith("ValueError: %s\n" % expectedoutput) + def test_excepthook_flushes_stdout(self): + import sys, cStringIO + savestdout = sys.stdout + out = cStringIO.StringIO() + sys.stdout = out + + eh = sys.__excepthook__ + + try: + raise ValueError(42) + except ValueError as exc: + print "hello" # with end-of-line + eh(*sys.exc_info()) + try: + raise ValueError(42) + except ValueError as exc: + print 123, 456, # no end-of-line here + assert sys.stdout.softspace + eh(*sys.exc_info()) + assert not sys.stdout.softspace + + sys.stdout = savestdout + assert out.getvalue() == 'hello\n123 456\n' # with a final \n added + # FIXME: testing the code for a lost or replaced excepthook in # Python/pythonrun.c::PyErr_PrintEx() is tricky. diff --git a/pypy/module/test_lib_pypy/test_code_extra.py b/pypy/module/test_lib_pypy/test_code_extra.py new file mode 100644 --- /dev/null +++ b/pypy/module/test_lib_pypy/test_code_extra.py @@ -0,0 +1,19 @@ +import py +import sys +import cStringIO +import code + + +def test_flush_stdout_on_error(): + runner = code.InteractiveInterpreter() + old_stdout = sys.stdout + try: + mystdout = cStringIO.StringIO() + sys.stdout = mystdout + runner.runcode(compile("print 5,;0/0", "<interactive>", "exec")) + finally: + sys.stdout = old_stdout + + if '__pypy__' not in sys.builtin_module_names: + py.test.skip('pypy only test') + assert mystdout.getvalue() == "5\n" diff --git a/rpython/rlib/rvmprof/dummy.py b/rpython/rlib/rvmprof/dummy.py --- a/rpython/rlib/rvmprof/dummy.py +++ b/rpython/rlib/rvmprof/dummy.py @@ -23,4 +23,4 @@ pass def stop_sampling(self): - pass + return -1 _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit