Author: Armin Rigo <ar...@tunes.org> Branch: py3.5 Changeset: r92235:d4535b1f44cd Date: 2017-08-23 18:55 +0200 http://bitbucket.org/pypy/pypy/changeset/d4535b1f44cd/
Log: hg merge default diff --git a/lib-python/2.7/ctypes/__init__.py b/lib-python/2.7/ctypes/__init__.py --- a/lib-python/2.7/ctypes/__init__.py +++ b/lib-python/2.7/ctypes/__init__.py @@ -364,7 +364,7 @@ pypy_dll = _ffi.CDLL(name, mode) else: pypy_dll = _ffi.WinDLL(name, mode) - self._pypy_dll = pypy_dll + self.__pypy_dll__ = pypy_dll handle = int(pypy_dll) if _sys.maxint > 2 ** 32: handle = int(handle) # long -> int diff --git a/lib_pypy/_ctypes/basics.py b/lib_pypy/_ctypes/basics.py --- a/lib_pypy/_ctypes/basics.py +++ b/lib_pypy/_ctypes/basics.py @@ -82,7 +82,7 @@ return False def in_dll(self, dll, name): - return self.from_address(dll._pypy_dll.getaddressindll(name)) + return self.from_address(dll.__pypy_dll__.getaddressindll(name)) def from_buffer(self, obj, offset=0): size = self._sizeofinstances() diff --git a/lib_pypy/_ctypes/function.py b/lib_pypy/_ctypes/function.py --- a/lib_pypy/_ctypes/function.py +++ b/lib_pypy/_ctypes/function.py @@ -430,7 +430,7 @@ ffires = restype.get_ffi_argtype() return _ffi.FuncPtr.fromaddr(ptr, '', ffiargs, ffires, self._flags_) - cdll = self.dll._pypy_dll + cdll = self.dll.__pypy_dll__ try: ffi_argtypes = [argtype.get_ffi_argtype() for argtype in argtypes] ffi_restype = restype.get_ffi_argtype() 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 @@ -311,7 +311,7 @@ PyErr_BadInternalCall(space) @cpython_api([PyObject, PyObject, rffi.INT_real], rffi.INT_real, error=-1) -def PyObject_RichCompareBool(space, ref1, ref2, opid_int): +def PyObject_RichCompareBool(space, w_o1, w_o2, opid_int): """Compare the values of o1 and o2 using the operation specified by opid, which must be one of Py_LT, Py_LE, Py_EQ, Py_NE, Py_GT, or Py_GE, corresponding to <, @@ -321,13 +321,13 @@ opid.""" # Quick result when objects are the same. # Guarantees that identity implies equality. - if ref1 is ref2: + if space.is_w(w_o1, w_o2): opid = rffi.cast(lltype.Signed, opid_int) if opid == Py_EQ: return 1 if opid == Py_NE: return 0 - w_res = PyObject_RichCompare(space, ref1, ref2, opid_int) + w_res = PyObject_RichCompare(space, w_o1, w_o2, opid_int) return int(space.is_true(w_res)) @cpython_api([PyObject], PyObject, result_is_ll=True) 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 @@ -294,6 +294,23 @@ def getitems_fixedsize(self, w_list): return self.getitems_unroll(w_list) + def copy_into(self, w_list, w_other): + w_other.strategy = self + w_other.lstorage = self.getstorage_copy(w_list) + + def clone(self, w_list): + storage = self.getstorage_copy(w_list) + w_clone = W_ListObject.from_storage_and_strategy(self.space, storage, + self) + return w_clone + + def getitems_copy(self, w_list): + return self.getitems(w_list) # getitems copies anyway + + def getstorage_copy(self, w_list): + lst = self.getitems(w_list) + return self.erase(CPyListStorage(w_list.space, lst)) + #------------------------------------------ # all these methods fail or switch strategy and then call ListObjectStrategy's method @@ -301,23 +318,9 @@ w_list.switch_to_object_strategy() w_list.strategy.setslice(w_list, start, stop, step, length) - def get_sizehint(self): - return -1 - def init_from_list_w(self, w_list, list_w): raise NotImplementedError - def clone(self, w_list): - storage = w_list.lstorage # lstorage is tuple, no need to clone - w_clone = W_ListObject.from_storage_and_strategy(self.space, storage, - self) - w_clone.switch_to_object_strategy() - return w_clone - - def copy_into(self, w_list, w_other): - w_list.switch_to_object_strategy() - w_list.strategy.copy_into(w_list, w_other) - def _resize_hint(self, w_list, hint): pass @@ -325,13 +328,6 @@ w_list.switch_to_object_strategy() return w_list.strategy.find(w_list, w_item, start, stop) - def getitems_copy(self, w_list): - w_list.switch_to_object_strategy() - return w_list.strategy.getitems_copy(w_list) - - def getstorage_copy(self, w_list): - raise NotImplementedError - def append(self, w_list, w_item): w_list.switch_to_object_strategy() w_list.strategy.append(w_list, w_item) diff --git a/pypy/module/cpyext/stubs.py b/pypy/module/cpyext/stubs.py --- a/pypy/module/cpyext/stubs.py +++ b/pypy/module/cpyext/stubs.py @@ -1516,13 +1516,6 @@ raise NotImplementedError -@cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL) -def PyType_IS_GC(space, o): - """Return true if the type object includes support for the cycle detector; this - tests the type flag Py_TPFLAGS_HAVE_GC.""" - raise NotImplementedError - - @cpython_api([], rffi.INT_real, error=-1) def PyUnicode_ClearFreeList(space, ): """Clear the free list. Return the total number of freed items.""" 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 @@ -416,7 +416,7 @@ Py_buffer passed to it. """ module = self.import_extension('foo', [ - ("fillinfo", "METH_VARARGS", + ("fillinfo", "METH_NOARGS", """ Py_buffer buf; PyObject *str = PyBytes_FromString("hello, world."); @@ -468,7 +468,7 @@ object. """ module = self.import_extension('foo', [ - ("fillinfo", "METH_VARARGS", + ("fillinfo", "METH_NOARGS", """ Py_buffer buf; PyObject *str = PyBytes_FromString("hello, world."); @@ -514,7 +514,7 @@ PyBuffer_FillInfo fails if WRITABLE is passed but object is readonly. """ module = self.import_extension('foo', [ - ("fillinfo", "METH_VARARGS", + ("fillinfo", "METH_NOARGS", """ Py_buffer buf; PyObject *str = PyBytes_FromString("hello, world."); @@ -541,7 +541,7 @@ decremented by PyBuffer_Release. """ module = self.import_extension('foo', [ - ("release", "METH_VARARGS", + ("release", "METH_NOARGS", """ Py_buffer buf; buf.obj = PyBytes_FromString("release me!"); @@ -560,3 +560,20 @@ Py_RETURN_NONE; """)]) assert module.release() is None + + +class AppTestPyBuffer_Release(AppTestCpythonExtensionBase): + def test_richcomp_nan(self): + module = self.import_extension('foo', [ + ("comp_eq", "METH_VARARGS", + """ + PyObject *a = PyTuple_GetItem(args, 0); + PyObject *b = PyTuple_GetItem(args, 1); + int res = PyObject_RichCompareBool(a, b, Py_EQ); + return PyLong_FromLong(res); + """),]) + a = float('nan') + b = float('nan') + assert a is b + res = module.comp_eq(a, b) + assert res == 1 diff --git a/pypy/module/cpyext/test/test_sequence.py b/pypy/module/cpyext/test/test_sequence.py --- a/pypy/module/cpyext/test/test_sequence.py +++ b/pypy/module/cpyext/test/test_sequence.py @@ -226,6 +226,15 @@ w_l.inplace_mul(2) assert space.int_w(space.len(w_l)) == 10 + def test_getstorage_copy(self, space, api): + w = space.wrap + w_l = w([1, 2, 3, 4]) + api.PySequence_Fast(w_l, "foo") # converts + + w_l1 = w([]) + space.setitem(w_l1, space.newslice(w(0), w(0), w(1)), w_l) + assert map(space.unwrap, space.unpackiterable(w_l1)) == [1, 2, 3, 4] + class AppTestSequenceObject(AppTestCpythonExtensionBase): def test_fast(self): diff --git a/pypy/module/test_lib_pypy/README.txt b/pypy/module/test_lib_pypy/README.txt --- a/pypy/module/test_lib_pypy/README.txt +++ b/pypy/module/test_lib_pypy/README.txt @@ -1,4 +1,7 @@ This directory contains app-level tests are supposed to be run *after* translation. So you run them by saying: -pypy pytest.py <testfile.py> +../../goal/pypy-c pytest.py <testfile.py> + +Note that if you run it with a PyPy from elsewhere, it will not pick +up the changes to lib-python and lib_pypy. diff --git a/pypy/objspace/std/typeobject.py b/pypy/objspace/std/typeobject.py --- a/pypy/objspace/std/typeobject.py +++ b/pypy/objspace/std/typeobject.py @@ -546,19 +546,24 @@ space = self.space if self.is_heaptype(): return self.getdictvalue(space, '__module__') + elif self.is_cpytype(): + dot = self.name.rfind('.') else: dot = self.name.find('.') - if dot >= 0: - mod = self.name[:dot] - else: - mod = "builtins" - return space.newtext(mod) + if dot >= 0: + mod = self.name[:dot] + else: + mod = "builtins" + return space.newtext(mod) def getname(self, space): if self.is_heaptype(): result = self.name else: - dot = self.name.find('.') + if self.is_cpytype(): + dot = self.name.rfind('.') + else: + dot = self.name.find('.') if dot >= 0: result = self.name[dot+1:] else: diff --git a/rpython/jit/backend/llsupport/regalloc.py b/rpython/jit/backend/llsupport/regalloc.py --- a/rpython/jit/backend/llsupport/regalloc.py +++ b/rpython/jit/backend/llsupport/regalloc.py @@ -552,10 +552,11 @@ self.reg_bindings[result_v] = loc return loc if v not in self.reg_bindings: + # v not in a register. allocate one for result_v and move v there prev_loc = self.frame_manager.loc(v) - loc = self.force_allocate_reg(v, forbidden_vars) + loc = self.force_allocate_reg(result_v, forbidden_vars) self.assembler.regalloc_mov(prev_loc, loc) - assert v in self.reg_bindings + return loc if self.longevity[v][1] > self.position: # we need to find a new place for variable v and # store result in the same place diff --git a/rpython/jit/backend/x86/assembler.py b/rpython/jit/backend/x86/assembler.py --- a/rpython/jit/backend/x86/assembler.py +++ b/rpython/jit/backend/x86/assembler.py @@ -504,7 +504,7 @@ clt.frame_info = rffi.cast(jitframe.JITFRAMEINFOPTR, frame_info) clt.frame_info.clear() # for now - if log: + if log or self._debug: number = looptoken.number operations = self._inject_debugging_code(looptoken, operations, 'e', number) @@ -589,7 +589,7 @@ faildescr.adr_jump_offset) self.mc.force_frame_size(DEFAULT_FRAME_BYTES) descr_number = compute_unique_id(faildescr) - if log: + if log or self._debug: operations = self._inject_debugging_code(faildescr, operations, 'b', descr_number) arglocs = self.rebuild_faillocs_from_descr(faildescr, inputargs) @@ -1618,18 +1618,6 @@ else: not_implemented("save_into_mem size = %d" % size) - def _genop_getfield(self, op, arglocs, resloc): - base_loc, ofs_loc, size_loc, sign_loc = arglocs - assert isinstance(size_loc, ImmedLoc) - source_addr = AddressLoc(base_loc, ofs_loc) - self.load_from_mem(resloc, source_addr, size_loc, sign_loc) - - genop_getfield_gc_i = _genop_getfield - genop_getfield_gc_r = _genop_getfield - genop_getfield_gc_f = _genop_getfield - genop_getfield_raw_i = _genop_getfield - genop_getfield_raw_f = _genop_getfield - def _genop_gc_load(self, op, arglocs, resloc): base_loc, ofs_loc, size_loc, sign_loc = arglocs assert isinstance(size_loc, ImmedLoc) diff --git a/rpython/jit/backend/x86/regalloc.py b/rpython/jit/backend/x86/regalloc.py --- a/rpython/jit/backend/x86/regalloc.py +++ b/rpython/jit/backend/x86/regalloc.py @@ -1305,7 +1305,7 @@ self.rm.possibly_free_var(tmpbox_high) def compute_hint_frame_locations(self, operations): - # optimization only: fill in the 'hint_frame_locations' dictionary + # optimization only: fill in the 'hint_frame_pos' dictionary # of 'fm' based on the JUMP at the end of the loop, by looking # at where we would like the boxes to be after the jump. op = operations[-1] @@ -1320,7 +1320,7 @@ self._compute_hint_frame_locations_from_descr(descr) #else: # The loop ends in a JUMP going back to a LABEL in the same loop. - # We cannot fill 'hint_frame_locations' immediately, but we can + # We cannot fill 'hint_frame_pos' immediately, but we can # wait until the corresponding consider_label() to know where the # we would like the boxes to be after the jump. diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py --- a/rpython/rlib/rposix.py +++ b/rpython/rlib/rposix.py @@ -205,6 +205,18 @@ if not is_valid_fd(fd): from errno import EBADF raise OSError(EBADF, 'Bad file descriptor') + + def _bound_for_write(fd, count): + if count > 32767 and c_isatty(fd): + # CPython Issue #11395, PyPy Issue #2636: the Windows console + # returns an error (12: not enough space error) on writing into + # stdout if stdout mode is binary and the length is greater than + # 66,000 bytes (or less, depending on heap usage). Can't easily + # test that, because we need 'fd' to be non-redirected... + count = 32767 + elif count > 0x7fffffff: + count = 0x7fffffff + return count else: def is_valid_fd(fd): return 1 @@ -213,6 +225,9 @@ def validate_fd(fd): pass + def _bound_for_write(fd, count): + return count + def closerange(fd_low, fd_high): # this behaves like os.closerange() from Python 2.6. for fd in xrange(fd_low, fd_high): @@ -449,6 +464,7 @@ def write(fd, data): count = len(data) validate_fd(fd) + count = _bound_for_write(fd, count) with rffi.scoped_nonmovingbuffer(data) as buf: return handle_posix_error('write', c_write(fd, buf, count)) diff --git a/rpython/rtyper/tool/rffi_platform.py b/rpython/rtyper/tool/rffi_platform.py --- a/rpython/rtyper/tool/rffi_platform.py +++ b/rpython/rtyper/tool/rffi_platform.py @@ -710,7 +710,8 @@ size, _ = expected_size_and_sign return lltype.FixedSizeArray(fieldtype.OF, size/_sizeof(fieldtype.OF)) raise TypeError("conflict between translating python and compiler field" - " type %r for %r" % (fieldtype, fieldname)) + " type %r for symbol %r, expected size+sign %r" % ( + fieldtype, fieldname, expected_size_and_sign)) def expose_value_as_rpython(value): if intmask(value) == value: _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit