Author: Ronan Lamy <ronan.l...@gmail.com> Branch: py3k Changeset: r85926:1df40eed7b9c Date: 2016-07-30 14:17 +0100 http://bitbucket.org/pypy/pypy/changeset/1df40eed7b9c/
Log: hg merge default 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 @@ -101,3 +101,7 @@ .. branch: jitlog-32bit Resolve issues to use the new logging facility on a 32bit system + +.. branch: ep2016sprint + +Trying harder to make hash(-1) return -2, like it does on CPython diff --git a/pypy/module/cpyext/number.py b/pypy/module/cpyext/number.py --- a/pypy/module/cpyext/number.py +++ b/pypy/module/cpyext/number.py @@ -19,16 +19,12 @@ def PyNumber_Check(space, w_obj): """Returns 1 if the object o provides numeric protocols, and false otherwise. This function always succeeds.""" - try: - space.float_w(w_obj) + # According to CPython, this means: w_obj is not None, and + # the type of w_obj has got a method __int__ or __float__. + if w_obj is None: + return 0 + if space.lookup(w_obj, '__int__') or space.lookup(w_obj, '__float__'): return 1 - except OperationError: - pass - try: - space.int_w(w_obj) - return 1 - except OperationError: - pass return 0 @cpython_api([PyObject, PyObject], Py_ssize_t, error=-1) diff --git a/pypy/module/cpyext/slotdefs.py b/pypy/module/cpyext/slotdefs.py --- a/pypy/module/cpyext/slotdefs.py +++ b/pypy/module/cpyext/slotdefs.py @@ -381,6 +381,7 @@ ('tp_as_number.c_nb_invert', '__invert__'), ('tp_as_number.c_nb_index', '__index__'), ('tp_as_number.c_nb_hex', '__hex__'), + ('tp_as_number.c_nb_oct', '__oct__'), ('tp_str', '__str__'), ('tp_repr', '__repr__'), ('tp_iter', '__iter__'), diff --git a/pypy/module/cpyext/test/test_longobject.py b/pypy/module/cpyext/test/test_longobject.py --- a/pypy/module/cpyext/test/test_longobject.py +++ b/pypy/module/cpyext/test/test_longobject.py @@ -264,8 +264,19 @@ ret = PyLong_FromLong(-1); Py_DECREF(obj); return ret; + """), + ("has_oct", "METH_NOARGS", + """ + PyObject *ret, *obj = PyLong_FromLong(42); + if (obj->ob_type->tp_as_number->nb_oct) + ret = obj->ob_type->tp_as_number->nb_oct(obj); + else + ret = PyLong_FromLong(-1); + Py_DECREF(obj); + return ret; """)]) assert module.has_sub() == 0 assert module.has_pow() == 0 assert module.has_hex() == '0x2aL' + assert module.has_oct() == '052L' diff --git a/pypy/module/cpyext/test/test_number.py b/pypy/module/cpyext/test/test_number.py --- a/pypy/module/cpyext/test/test_number.py +++ b/pypy/module/cpyext/test/test_number.py @@ -12,7 +12,7 @@ assert api.PyNumber_Check(space.wraplong(-12L)) assert api.PyNumber_Check(space.wrap(12.1)) assert not api.PyNumber_Check(space.wrap('12')) - assert not api.PyNumber_Check(space.wrap(1+3j)) + assert api.PyNumber_Check(space.wrap(1+3j)) def test_number_long(self, space, api): w_l = api.PyNumber_Long(space.wrap(123)) diff --git a/pypy/module/thread/test/test_lock.py b/pypy/module/thread/test/test_lock.py --- a/pypy/module/thread/test/test_lock.py +++ b/pypy/module/thread/test/test_lock.py @@ -75,7 +75,7 @@ else: got_ovf = False lock.release() - assert (i, got_ovf) == (i, int(timeout * 1e6 + 0.999) > maxint) + assert (i, got_ovf) == (i, int(timeout * 1e6) > maxint) @py.test.mark.xfail(machine()=='s390x', reason='may fail under heavy load') def test_ping_pong(self): diff --git a/pypy/objspace/std/test/test_stdobjspace.py b/pypy/objspace/std/test/test_stdobjspace.py --- a/pypy/objspace/std/test/test_stdobjspace.py +++ b/pypy/objspace/std/test/test_stdobjspace.py @@ -66,19 +66,20 @@ def test_wrap_various_unsigned_types(self): import sys + from rpython.rlib.rarithmetic import r_uint from rpython.rtyper.lltypesystem import lltype, rffi space = self.space value = sys.maxint * 2 - x = rffi.cast(lltype.Unsigned, value) + x = r_uint(value) assert space.eq_w(space.wrap(value), space.wrap(x)) - x = rffi.cast(rffi.UINTPTR_T, value) + x = rffi.cast(rffi.UINTPTR_T, r_uint(value)) assert x > 0 assert space.eq_w(space.wrap(value), space.wrap(x)) value = 60000 - x = rffi.cast(rffi.USHORT, value) + x = rffi.cast(rffi.USHORT, r_uint(value)) assert space.eq_w(space.wrap(value), space.wrap(x)) value = 200 - x = rffi.cast(rffi.UCHAR, value) + x = rffi.cast(rffi.UCHAR, r_uint(value)) assert space.eq_w(space.wrap(value), space.wrap(x)) def test_wrap_string(self): diff --git a/rpython/jit/backend/x86/test/test_regloc.py b/rpython/jit/backend/x86/test/test_regloc.py --- a/rpython/jit/backend/x86/test/test_regloc.py +++ b/rpython/jit/backend/x86/test/test_regloc.py @@ -147,7 +147,7 @@ py.test.skip() def test_reuse_scratch_register(self): - base_addr = 0xFEDCBA9876543210 + base_addr = intmask(0xFEDCBA9876543210) cb = LocationCodeBuilder64() cb.begin_reuse_scratch_register() cb.MOV(ecx, heap(base_addr)) @@ -167,7 +167,7 @@ # ------------------------------------------------------------ def test_64bit_address_1(self): - base_addr = 0xFEDCBA9876543210 + base_addr = intmask(0xFEDCBA9876543210) cb = LocationCodeBuilder64() cb.CMP(ecx, AddressLoc(ImmedLoc(0), ImmedLoc(0), 0, base_addr)) # this case is a CMP_rj @@ -181,7 +181,7 @@ assert cb.getvalue() == expected_instructions def test_64bit_address_2(self): - base_addr = 0xFEDCBA9876543210 + base_addr = intmask(0xFEDCBA9876543210) cb = LocationCodeBuilder64() cb.MOV(ecx, AddressLoc(ImmedLoc(0), edx, 3, base_addr)) # this case is a CMP_ra @@ -195,7 +195,7 @@ assert cb.getvalue() == expected_instructions def test_64bit_address_3(self): - base_addr = 0xFEDCBA9876543210 + base_addr = intmask(0xFEDCBA9876543210) cb = LocationCodeBuilder64() cb.MOV(ecx, AddressLoc(edx, ImmedLoc(0), 0, base_addr)) # this case is a CMP_rm @@ -211,7 +211,7 @@ assert cb.getvalue() == expected_instructions def test_64bit_address_4(self): - base_addr = 0xFEDCBA9876543210 + base_addr = intmask(0xFEDCBA9876543210) cb = LocationCodeBuilder64() cb.begin_reuse_scratch_register() assert cb._reuse_scratch_register is True @@ -234,7 +234,7 @@ # ------------------------------------------------------------ def test_MOV_64bit_constant_into_r11(self): - base_constant = 0xFEDCBA9876543210 + base_constant = intmask(0xFEDCBA9876543210) cb = LocationCodeBuilder64() cb.MOV(r11, imm(base_constant)) @@ -245,7 +245,7 @@ assert cb.getvalue() == expected_instructions def test_MOV_64bit_constant_into_rax(self): - base_constant = 0xFEDCBA9876543210 + base_constant = intmask(0xFEDCBA9876543210) cb = LocationCodeBuilder64() cb.MOV(eax, imm(base_constant)) @@ -256,7 +256,7 @@ assert cb.getvalue() == expected_instructions def test_MOV_64bit_address_into_r11(self): - base_addr = 0xFEDCBA9876543210 + base_addr = intmask(0xFEDCBA9876543210) cb = LocationCodeBuilder64() cb.MOV(r11, heap(base_addr)) @@ -270,7 +270,7 @@ def test_MOV_immed32_into_64bit_address_1(self): immed = -0x01234567 - base_addr = 0xFEDCBA9876543210 + base_addr = intmask(0xFEDCBA9876543210) cb = LocationCodeBuilder64() cb.MOV(AddressLoc(ImmedLoc(0), ImmedLoc(0), 0, base_addr), ImmedLoc(immed)) @@ -286,7 +286,7 @@ def test_MOV_immed32_into_64bit_address_2(self): immed = -0x01234567 - base_addr = 0xFEDCBA9876543210 + base_addr = intmask(0xFEDCBA9876543210) cb = LocationCodeBuilder64() cb.MOV(AddressLoc(ImmedLoc(0), edx, 3, base_addr), ImmedLoc(immed)) @@ -302,7 +302,7 @@ def test_MOV_immed32_into_64bit_address_3(self): immed = -0x01234567 - base_addr = 0xFEDCBA9876543210 + base_addr = intmask(0xFEDCBA9876543210) cb = LocationCodeBuilder64() cb.MOV(AddressLoc(edx, ImmedLoc(0), 0, base_addr), ImmedLoc(immed)) @@ -320,7 +320,7 @@ def test_MOV_immed32_into_64bit_address_4(self): immed = -0x01234567 - base_addr = 0xFEDCBA9876543210 + base_addr = intmask(0xFEDCBA9876543210) cb = LocationCodeBuilder64() cb.MOV(AddressLoc(edx, esi, 2, base_addr), ImmedLoc(immed)) # this case is a MOV_ai @@ -339,7 +339,7 @@ def test_MOV_immed64_into_64bit_address_1(self): immed = 0x0123456789ABCDEF - base_addr = 0xFEDCBA9876543210 + base_addr = intmask(0xFEDCBA9876543210) cb = LocationCodeBuilder64() cb.MOV(AddressLoc(ImmedLoc(0), ImmedLoc(0), 0, base_addr), ImmedLoc(immed)) @@ -361,7 +361,7 @@ def test_MOV_immed64_into_64bit_address_2(self): immed = 0x0123456789ABCDEF - base_addr = 0xFEDCBA9876543210 + base_addr = intmask(0xFEDCBA9876543210) cb = LocationCodeBuilder64() cb.MOV(AddressLoc(ImmedLoc(0), edx, 3, base_addr), ImmedLoc(immed)) @@ -383,7 +383,7 @@ def test_MOV_immed64_into_64bit_address_3(self): immed = 0x0123456789ABCDEF - base_addr = 0xFEDCBA9876543210 + base_addr = intmask(0xFEDCBA9876543210) cb = LocationCodeBuilder64() cb.MOV(AddressLoc(eax, ImmedLoc(0), 0, base_addr), ImmedLoc(immed)) @@ -407,7 +407,7 @@ def test_MOV_immed64_into_64bit_address_4(self): immed = 0x0123456789ABCDEF - base_addr = 0xFEDCBA9876543210 + base_addr = intmask(0xFEDCBA9876543210) cb = LocationCodeBuilder64() cb.MOV(AddressLoc(edx, eax, 2, base_addr), ImmedLoc(immed)) # this case is a MOV_ai diff --git a/rpython/jit/backend/x86/test/test_ztranslation_call_assembler.py b/rpython/jit/backend/x86/test/test_ztranslation_call_assembler.py --- a/rpython/jit/backend/x86/test/test_ztranslation_call_assembler.py +++ b/rpython/jit/backend/x86/test/test_ztranslation_call_assembler.py @@ -4,6 +4,16 @@ from rpython.jit.backend.x86.arch import WORD import sys + +# On Windows, this test crashes obscurely, but only if compiled with +# Boehm, not if run with no GC at all. So for now we'll assume it is +# really a Boehm bug, or maybe a Boehm-on-Windows-specific issue, and +# skip. +if sys.platform == 'win32': + import py + py.test.skip("crashes on Windows (Boehm issue?)") + + class TestTranslationCallAssemblerX86(TranslationTestCallAssembler): def _check_cbuilder(self, cbuilder): #We assume here that we have sse2. If not, the CPUClass diff --git a/rpython/jit/metainterp/test/test_fficall.py b/rpython/jit/metainterp/test/test_fficall.py --- a/rpython/jit/metainterp/test/test_fficall.py +++ b/rpython/jit/metainterp/test/test_fficall.py @@ -11,7 +11,7 @@ from rpython.rlib.jit_libffi import (types, CIF_DESCRIPTION, FFI_TYPE_PP, jit_ffi_call) from rpython.rlib.unroll import unrolling_iterable -from rpython.rlib.rarithmetic import intmask, r_longlong, r_singlefloat +from rpython.rlib.rarithmetic import intmask, r_longlong, r_singlefloat, r_uint from rpython.rlib.longlong2float import float2longlong def get_description(atypes, rtype): @@ -230,8 +230,8 @@ def test_handle_unsigned(self): self._run([types.ulong], types.ulong, - [rffi.cast(rffi.ULONG, sys.maxint + 91348)], - rffi.cast(rffi.ULONG, sys.maxint + 4242)) + [rffi.cast(rffi.ULONG, r_uint(sys.maxint + 91348))], + rffi.cast(rffi.ULONG, r_uint(sys.maxint + 4242))) def test_handle_unsignedchar(self): self._run([types.uint8], types.uint8, diff --git a/rpython/rlib/test/test_rarithmetic.py b/rpython/rlib/test/test_rarithmetic.py --- a/rpython/rlib/test/test_rarithmetic.py +++ b/rpython/rlib/test/test_rarithmetic.py @@ -404,6 +404,8 @@ def test_int_c_div_mod(x, y): assert int_c_div(~x, y) == -(abs(~x) // y) assert int_c_div( x,-y) == -(x // y) + if (x, y) == (sys.maxint, 1): + py.test.skip("would overflow") assert int_c_div(~x,-y) == +(abs(~x) // y) for x1 in [x, ~x]: for y1 in [y, -y]: diff --git a/rpython/rtyper/lltypesystem/lltype.py b/rpython/rtyper/lltypesystem/lltype.py --- a/rpython/rtyper/lltypesystem/lltype.py +++ b/rpython/rtyper/lltypesystem/lltype.py @@ -812,8 +812,10 @@ if tp is long: if -maxint-1 <= val <= maxint: return Signed + elif longlongmask(val) == val: + return SignedLongLong else: - return SignedLongLong + raise OverflowError("integer %r is out of bounds" % (val,)) if tp is bool: return Bool if issubclass(tp, base_int): diff --git a/rpython/translator/c/genc.py b/rpython/translator/c/genc.py --- a/rpython/translator/c/genc.py +++ b/rpython/translator/c/genc.py @@ -422,14 +422,11 @@ mk.definition('PROFOPT', profopt) rules = [ - ('clean', '', 'rm -f $(OBJECTS) $(DEFAULT_TARGET) $(TARGET) $(GCMAPFILES) $(ASMFILES) *.gc?? ../module_cache/*.gc??'), - ('clean_noprof', '', 'rm -f $(OBJECTS) $(DEFAULT_TARGET) $(TARGET) $(GCMAPFILES) $(ASMFILES)'), ('debug', '', '$(MAKE) CFLAGS="$(DEBUGFLAGS) -DRPY_ASSERT" debug_target'), ('debug_exc', '', '$(MAKE) CFLAGS="$(DEBUGFLAGS) -DRPY_ASSERT -DDO_LOG_EXC" debug_target'), ('debug_mem', '', '$(MAKE) CFLAGS="$(DEBUGFLAGS) -DRPY_ASSERT -DPYPY_USE_TRIVIAL_MALLOC" debug_target'), ('llsafer', '', '$(MAKE) CFLAGS="-O2 -DRPY_LL_ASSERT" $(DEFAULT_TARGET)'), ('lldebug', '', '$(MAKE) CFLAGS="$(DEBUGFLAGS) -DRPY_ASSERT -DRPY_LL_ASSERT" debug_target'), - ('lldebug0','', '$(MAKE) CFLAGS="$(DEBUGFLAGS) -O0 -DMAX_STACK_SIZE=8192000 -DRPY_ASSERT -DRPY_LL_ASSERT" debug_target'), ('profile', '', '$(MAKE) CFLAGS="-g -O1 -pg $(CFLAGS) -fno-omit-frame-pointer" LDFLAGS="-pg $(LDFLAGS)" $(DEFAULT_TARGET)'), ] if self.has_profopt(): @@ -443,6 +440,17 @@ for rule in rules: mk.rule(*rule) + if self.translator.platform.name == 'msvc': + mk.rule('lldebug0','', '$(MAKE) CFLAGS="$(DEBUGFLAGS) -Od -DMAX_STACK_SIZE=8192000 -DRPY_ASSERT -DRPY_LL_ASSERT" debug_target'), + wildcards = '..\*.obj ..\*.pdb ..\*.lib ..\*.dll ..\*.manifest ..\*.exp *.pch' + cmd = r'del /s %s $(DEFAULT_TARGET) $(TARGET) $(GCMAPFILES) $(ASMFILES)' % wildcards + mk.rule('clean', '', cmd + ' *.gc?? ..\module_cache\*.gc??') + mk.rule('clean_noprof', '', cmd) + else: + mk.rule('lldebug0','', '$(MAKE) CFLAGS="$(DEBUGFLAGS) -O0 -DMAX_STACK_SIZE=8192000 -DRPY_ASSERT -DRPY_LL_ASSERT" debug_target'), + mk.rule('clean', '', 'rm -f $(OBJECTS) $(DEFAULT_TARGET) $(TARGET) $(GCMAPFILES) $(ASMFILES) *.gc?? ../module_cache/*.gc??') + mk.rule('clean_noprof', '', 'rm -f $(OBJECTS) $(DEFAULT_TARGET) $(TARGET) $(GCMAPFILES) $(ASMFILES)') + #XXX: this conditional part is not tested at all if self.config.translation.gcrootfinder == 'asmgcc': if self.translator.platform.name == 'msvc': @@ -507,7 +515,7 @@ else: mk.definition('DEBUGFLAGS', '-O1 -g') if self.translator.platform.name == 'msvc': - mk.rule('debug_target', '$(DEFAULT_TARGET)', 'rem') + mk.rule('debug_target', '$(DEFAULT_TARGET) $(WTARGET)', 'rem') else: mk.rule('debug_target', '$(DEFAULT_TARGET)', '#') mk.write() _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit