Author: Hakan Ardo <ha...@debian.org> Branch: jit-targets Changeset: r49353:5dcec5762796 Date: 2011-11-12 10:01 +0100 http://bitbucket.org/pypy/pypy/changeset/5dcec5762796/
Log: hg merge jit-refactor-tests diff --git a/lib-python/2.7/test/test_os.py b/lib-python/2.7/test/test_os.py --- a/lib-python/2.7/test/test_os.py +++ b/lib-python/2.7/test/test_os.py @@ -74,7 +74,8 @@ self.assertFalse(os.path.exists(name), "file already exists for temporary file") # make sure we can create the file - open(name, "w") + f = open(name, "w") + f.close() self.files.append(name) def test_tempnam(self): diff --git a/lib-python/2.7/pkgutil.py b/lib-python/modified-2.7/pkgutil.py copy from lib-python/2.7/pkgutil.py copy to lib-python/modified-2.7/pkgutil.py --- a/lib-python/2.7/pkgutil.py +++ b/lib-python/modified-2.7/pkgutil.py @@ -244,7 +244,8 @@ return mod def get_data(self, pathname): - return open(pathname, "rb").read() + with open(pathname, "rb") as f: + return f.read() def _reopen(self): if self.file and self.file.closed: diff --git a/lib_pypy/_ctypes/pointer.py b/lib_pypy/_ctypes/pointer.py --- a/lib_pypy/_ctypes/pointer.py +++ b/lib_pypy/_ctypes/pointer.py @@ -124,7 +124,8 @@ # for now, we always allow types.pointer, else a lot of tests # break. We need to rethink how pointers are represented, though if my_ffitype is not ffitype and ffitype is not _ffi.types.void_p: - raise ArgumentError, "expected %s instance, got %s" % (type(value), ffitype) + raise ArgumentError("expected %s instance, got %s" % (type(value), + ffitype)) return value._get_buffer_value() def _cast_addr(obj, _, tp): diff --git a/lib_pypy/pyrepl/commands.py b/lib_pypy/pyrepl/commands.py --- a/lib_pypy/pyrepl/commands.py +++ b/lib_pypy/pyrepl/commands.py @@ -33,10 +33,9 @@ class Command(object): finish = 0 kills_digit_arg = 1 - def __init__(self, reader, (event_name, event)): + def __init__(self, reader, cmd): self.reader = reader - self.event = event - self.event_name = event_name + self.event_name, self.event = cmd def do(self): pass diff --git a/lib_pypy/pyrepl/pygame_console.py b/lib_pypy/pyrepl/pygame_console.py --- a/lib_pypy/pyrepl/pygame_console.py +++ b/lib_pypy/pyrepl/pygame_console.py @@ -130,7 +130,7 @@ s.fill(c, [0, 600 - bmargin, 800, bmargin]) s.fill(c, [800 - rmargin, 0, lmargin, 600]) - def refresh(self, screen, (cx, cy)): + def refresh(self, screen, cxy): self.screen = screen self.pygame_screen.fill(colors.bg, [0, tmargin + self.cur_top + self.scroll, @@ -139,8 +139,8 @@ line_top = self.cur_top width, height = self.fontsize - self.cxy = (cx, cy) - cp = self.char_pos(cx, cy) + self.cxy = cxy + cp = self.char_pos(*cxy) if cp[1] < tmargin: self.scroll = - (cy*self.fh + self.cur_top) self.repaint() @@ -148,7 +148,7 @@ self.scroll += (600 - bmargin) - (cp[1] + self.fh) self.repaint() if self.curs_vis: - self.pygame_screen.blit(self.cursor, self.char_pos(cx, cy)) + self.pygame_screen.blit(self.cursor, self.char_pos(*cxy)) for line in screen: if 0 <= line_top + self.scroll <= (600 - bmargin - tmargin - self.fh): if line: diff --git a/lib_pypy/pyrepl/unix_console.py b/lib_pypy/pyrepl/unix_console.py --- a/lib_pypy/pyrepl/unix_console.py +++ b/lib_pypy/pyrepl/unix_console.py @@ -163,7 +163,7 @@ def change_encoding(self, encoding): self.encoding = encoding - def refresh(self, screen, (cx, cy)): + def refresh(self, screen, cxy): # this function is still too long (over 90 lines) if not self.__gone_tall: @@ -198,6 +198,7 @@ # we make sure the cursor is on the screen, and that we're # using all of the screen if we can + cx, cy = cxy if cy < offset: offset = cy elif cy >= offset + height: diff --git a/pypy/jit/backend/llsupport/descr.py b/pypy/jit/backend/llsupport/descr.py --- a/pypy/jit/backend/llsupport/descr.py +++ b/pypy/jit/backend/llsupport/descr.py @@ -305,12 +305,16 @@ _clsname = '' loop_token = None arg_classes = '' # <-- annotation hack - ffi_flags = 0 + ffi_flags = 1 - def __init__(self, arg_classes, extrainfo=None, ffi_flags=0): + def __init__(self, arg_classes, extrainfo=None, ffi_flags=1): self.arg_classes = arg_classes # string of "r" and "i" (ref/int) self.extrainfo = extrainfo self.ffi_flags = ffi_flags + # NB. the default ffi_flags is 1, meaning FUNCFLAG_CDECL, which + # makes sense on Windows as it's the one for all the C functions + # we are compiling together with the JIT. On non-Windows platforms + # it is just ignored anyway. def __repr__(self): res = '%s(%s)' % (self.__class__.__name__, self.arg_classes) @@ -445,7 +449,7 @@ """ _clsname = 'DynamicIntCallDescr' - def __init__(self, arg_classes, result_size, result_sign, extrainfo=None, ffi_flags=0): + def __init__(self, arg_classes, result_size, result_sign, extrainfo, ffi_flags): BaseIntCallDescr.__init__(self, arg_classes, extrainfo, ffi_flags) assert isinstance(result_sign, bool) self._result_size = chr(result_size) diff --git a/pypy/jit/backend/llsupport/ffisupport.py b/pypy/jit/backend/llsupport/ffisupport.py --- a/pypy/jit/backend/llsupport/ffisupport.py +++ b/pypy/jit/backend/llsupport/ffisupport.py @@ -8,7 +8,7 @@ class UnsupportedKind(Exception): pass -def get_call_descr_dynamic(cpu, ffi_args, ffi_result, extrainfo=None, ffi_flags=0): +def get_call_descr_dynamic(cpu, ffi_args, ffi_result, extrainfo, ffi_flags): """Get a call descr: the types of result and args are represented by rlib.libffi.types.*""" try: diff --git a/pypy/jit/backend/llsupport/test/test_ffisupport.py b/pypy/jit/backend/llsupport/test/test_ffisupport.py --- a/pypy/jit/backend/llsupport/test/test_ffisupport.py +++ b/pypy/jit/backend/llsupport/test/test_ffisupport.py @@ -13,44 +13,46 @@ def test_call_descr_dynamic(): args = [types.sint, types.pointer] - descr = get_call_descr_dynamic(FakeCPU(), args, types.sint, ffi_flags=42) + descr = get_call_descr_dynamic(FakeCPU(), args, types.sint, None, + ffi_flags=42) assert isinstance(descr, DynamicIntCallDescr) assert descr.arg_classes == 'ii' assert descr.get_ffi_flags() == 42 args = [types.sint, types.double, types.pointer] - descr = get_call_descr_dynamic(FakeCPU(), args, types.void) + descr = get_call_descr_dynamic(FakeCPU(), args, types.void, None, 42) assert descr is None # missing floats descr = get_call_descr_dynamic(FakeCPU(supports_floats=True), - args, types.void, ffi_flags=43) + args, types.void, None, ffi_flags=43) assert isinstance(descr, VoidCallDescr) assert descr.arg_classes == 'ifi' assert descr.get_ffi_flags() == 43 - descr = get_call_descr_dynamic(FakeCPU(), [], types.sint8) + descr = get_call_descr_dynamic(FakeCPU(), [], types.sint8, None, 42) assert isinstance(descr, DynamicIntCallDescr) assert descr.get_result_size(False) == 1 assert descr.is_result_signed() == True - descr = get_call_descr_dynamic(FakeCPU(), [], types.uint8) + descr = get_call_descr_dynamic(FakeCPU(), [], types.uint8, None, 42) assert isinstance(descr, DynamicIntCallDescr) assert descr.get_result_size(False) == 1 assert descr.is_result_signed() == False if not is_64_bit: - descr = get_call_descr_dynamic(FakeCPU(), [], types.slonglong) + descr = get_call_descr_dynamic(FakeCPU(), [], types.slonglong, + None, 42) assert descr is None # missing longlongs descr = get_call_descr_dynamic(FakeCPU(supports_longlong=True), - [], types.slonglong, ffi_flags=43) + [], types.slonglong, None, ffi_flags=43) assert isinstance(descr, LongLongCallDescr) assert descr.get_ffi_flags() == 43 else: assert types.slonglong is types.slong - descr = get_call_descr_dynamic(FakeCPU(), [], types.float) + descr = get_call_descr_dynamic(FakeCPU(), [], types.float, None, 42) assert descr is None # missing singlefloats descr = get_call_descr_dynamic(FakeCPU(supports_singlefloats=True), - [], types.float, ffi_flags=44) + [], types.float, None, ffi_flags=44) SingleFloatCallDescr = getCallDescrClass(rffi.FLOAT) assert isinstance(descr, SingleFloatCallDescr) assert descr.get_ffi_flags() == 44 diff --git a/pypy/jit/backend/x86/test/test_runner.py b/pypy/jit/backend/x86/test/test_runner.py --- a/pypy/jit/backend/x86/test/test_runner.py +++ b/pypy/jit/backend/x86/test/test_runner.py @@ -460,6 +460,9 @@ EffectInfo.MOST_GENERAL, ffi_flags=-1) calldescr.get_call_conv = lambda: ffi # <==== hack + # ^^^ we patch get_call_conv() so that the test also makes sense + # on Linux, because clibffi.get_call_conv() would always + # return FFI_DEFAULT_ABI on non-Windows platforms. funcbox = ConstInt(rawstart) i1 = BoxInt() i2 = BoxInt() diff --git a/pypy/jit/codewriter/effectinfo.py b/pypy/jit/codewriter/effectinfo.py --- a/pypy/jit/codewriter/effectinfo.py +++ b/pypy/jit/codewriter/effectinfo.py @@ -78,6 +78,9 @@ # OS_MATH_SQRT = 100 + # for debugging: + _OS_CANRAISE = set([OS_NONE, OS_STR2UNICODE, OS_LIBFFI_CALL]) + def __new__(cls, readonly_descrs_fields, readonly_descrs_arrays, write_descrs_fields, write_descrs_arrays, extraeffect=EF_CAN_RAISE, @@ -116,6 +119,8 @@ result.extraeffect = extraeffect result.can_invalidate = can_invalidate result.oopspecindex = oopspecindex + if result.check_can_raise(): + assert oopspecindex in cls._OS_CANRAISE cls._cache[key] = result return result @@ -125,6 +130,10 @@ def check_can_invalidate(self): return self.can_invalidate + def check_is_elidable(self): + return (self.extraeffect == self.EF_ELIDABLE_CAN_RAISE or + self.extraeffect == self.EF_ELIDABLE_CANNOT_RAISE) + def check_forces_virtual_or_virtualizable(self): return self.extraeffect >= self.EF_FORCES_VIRTUAL_OR_VIRTUALIZABLE diff --git a/pypy/jit/codewriter/test/test_flatten.py b/pypy/jit/codewriter/test/test_flatten.py --- a/pypy/jit/codewriter/test/test_flatten.py +++ b/pypy/jit/codewriter/test/test_flatten.py @@ -5,7 +5,7 @@ from pypy.jit.codewriter.format import assert_format from pypy.jit.codewriter import longlong from pypy.jit.metainterp.history import AbstractDescr -from pypy.rpython.lltypesystem import lltype, rclass, rstr +from pypy.rpython.lltypesystem import lltype, rclass, rstr, rffi from pypy.objspace.flow.model import SpaceOperation, Variable, Constant from pypy.translator.unsimplify import varoftype from pypy.rlib.rarithmetic import ovfcheck, r_uint, r_longlong, r_ulonglong @@ -743,7 +743,6 @@ """, transform=True) def test_force_cast(self): - from pypy.rpython.lltypesystem import rffi # NB: we don't need to test for INT here, the logic in jtransform is # general enough so that if we have the below cases it should # generalize also to INT @@ -849,7 +848,6 @@ transform=True) def test_force_cast_pointer(self): - from pypy.rpython.lltypesystem import rffi def h(p): return rffi.cast(rffi.VOIDP, p) self.encoding_test(h, [lltype.nullptr(rffi.CCHARP.TO)], """ @@ -857,7 +855,6 @@ """, transform=True) def test_force_cast_floats(self): - from pypy.rpython.lltypesystem import rffi # Caststs to lltype.Float def f(n): return rffi.cast(lltype.Float, n) @@ -964,7 +961,6 @@ """, transform=True) def test_direct_ptradd(self): - from pypy.rpython.lltypesystem import rffi def f(p, n): return lltype.direct_ptradd(p, n) self.encoding_test(f, [lltype.nullptr(rffi.CCHARP.TO), 123], """ @@ -975,7 +971,6 @@ def check_force_cast(FROM, TO, operations, value): """Check that the test is correctly written...""" - from pypy.rpython.lltypesystem import rffi import re r = re.compile('(\w+) \%i\d, \$(-?\d+)') # diff --git a/pypy/jit/metainterp/optimizeopt/intutils.py b/pypy/jit/metainterp/optimizeopt/intutils.py --- a/pypy/jit/metainterp/optimizeopt/intutils.py +++ b/pypy/jit/metainterp/optimizeopt/intutils.py @@ -1,4 +1,4 @@ -from pypy.rlib.rarithmetic import ovfcheck, ovfcheck_lshift, LONG_BIT +from pypy.rlib.rarithmetic import ovfcheck, LONG_BIT from pypy.rlib.objectmodel import we_are_translated from pypy.jit.metainterp.resoperation import rop, ResOperation from pypy.jit.metainterp.history import BoxInt, ConstInt @@ -174,10 +174,10 @@ other.known_ge(IntBound(0, 0)) and \ other.known_lt(IntBound(LONG_BIT, LONG_BIT)): try: - vals = (ovfcheck_lshift(self.upper, other.upper), - ovfcheck_lshift(self.upper, other.lower), - ovfcheck_lshift(self.lower, other.upper), - ovfcheck_lshift(self.lower, other.lower)) + vals = (ovfcheck(self.upper << other.upper), + ovfcheck(self.upper << other.lower), + ovfcheck(self.lower << other.upper), + ovfcheck(self.lower << other.lower)) return IntBound(min4(vals), max4(vals)) except (OverflowError, ValueError): return IntUnbounded() diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py --- a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py +++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py @@ -5003,6 +5003,34 @@ """ self.optimize_loop(ops, expected) + def test_known_equal_ints(self): + py.test.skip("in-progress") + ops = """ + [i0, i1, i2, p0] + i3 = int_eq(i0, i1) + guard_true(i3) [] + + i4 = int_lt(i2, i0) + guard_true(i4) [] + i5 = int_lt(i2, i1) + guard_true(i5) [] + + i6 = getarrayitem_gc(p0, i2) + finish(i6) + """ + expected = """ + [i0, i1, i2, p0] + i3 = int_eq(i0, i1) + guard_true(i3) [] + + i4 = int_lt(i2, i0) + guard_true(i4) [] + + i6 = getarrayitem_gc(p0, i3) + finish(i6) + """ + self.optimize_loop(ops, expected) + class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin): pass diff --git a/pypy/jit/metainterp/optimizeopt/test/test_util.py b/pypy/jit/metainterp/optimizeopt/test/test_util.py --- a/pypy/jit/metainterp/optimizeopt/test/test_util.py +++ b/pypy/jit/metainterp/optimizeopt/test/test_util.py @@ -184,6 +184,7 @@ can_invalidate=True)) arraycopydescr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT, EffectInfo([], [arraydescr], [], [arraydescr], + EffectInfo.EF_CANNOT_RAISE, oopspecindex=EffectInfo.OS_ARRAYCOPY)) @@ -213,12 +214,14 @@ _oopspecindex = getattr(EffectInfo, _os) locals()[_name] = \ cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT, - EffectInfo([], [], [], [], oopspecindex=_oopspecindex)) + EffectInfo([], [], [], [], EffectInfo.EF_CANNOT_RAISE, + oopspecindex=_oopspecindex)) # _oopspecindex = getattr(EffectInfo, _os.replace('STR', 'UNI')) locals()[_name.replace('str', 'unicode')] = \ cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT, - EffectInfo([], [], [], [], oopspecindex=_oopspecindex)) + EffectInfo([], [], [], [], EffectInfo.EF_CANNOT_RAISE, + oopspecindex=_oopspecindex)) s2u_descr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT, EffectInfo([], [], [], [], oopspecindex=EffectInfo.OS_STR2UNICODE)) diff --git a/pypy/jit/metainterp/pyjitpl.py b/pypy/jit/metainterp/pyjitpl.py --- a/pypy/jit/metainterp/pyjitpl.py +++ b/pypy/jit/metainterp/pyjitpl.py @@ -1344,10 +1344,8 @@ if effect == effectinfo.EF_LOOPINVARIANT: return self.execute_varargs(rop.CALL_LOOPINVARIANT, allboxes, descr, False, False) - exc = (effect != effectinfo.EF_CANNOT_RAISE and - effect != effectinfo.EF_ELIDABLE_CANNOT_RAISE) - pure = (effect == effectinfo.EF_ELIDABLE_CAN_RAISE or - effect == effectinfo.EF_ELIDABLE_CANNOT_RAISE) + exc = effectinfo.check_can_raise() + pure = effectinfo.check_is_elidable() return self.execute_varargs(rop.CALL, allboxes, descr, exc, pure) def do_residual_or_indirect_call(self, funcbox, calldescr, argboxes): diff --git a/pypy/jit/metainterp/test/test_ajit.py b/pypy/jit/metainterp/test/test_ajit.py --- a/pypy/jit/metainterp/test/test_ajit.py +++ b/pypy/jit/metainterp/test/test_ajit.py @@ -3644,3 +3644,16 @@ # bridge as a preamble since it does not start with a # label. The alternative would be to have all such bridges # start with labels. I dont know which is better... + + def test_ll_arraycopy(self): + from pypy.rlib import rgc + A = lltype.GcArray(lltype.Char) + a = lltype.malloc(A, 10) + for i in range(10): a[i] = chr(i) + b = lltype.malloc(A, 10) + # + def f(c, d, e): + rgc.ll_arraycopy(a, b, c, d, e) + return 42 + self.interp_operations(f, [1, 2, 3]) + self.check_operations_history(call=1, guard_no_exception=0) diff --git a/pypy/jit/tl/spli/test/test_jit.py b/pypy/jit/tl/spli/test/test_jit.py --- a/pypy/jit/tl/spli/test/test_jit.py +++ b/pypy/jit/tl/spli/test/test_jit.py @@ -36,7 +36,7 @@ i = i + 1 return i self.interpret(f, []) - self.check_loops(new_with_vtable=0) + self.check_resops(new_with_vtable=0) def test_bridge(self): py.test.skip('We currently cant virtualize across bridges') @@ -52,7 +52,7 @@ return total self.interpret(f, [1, 10]) - self.check_loops(new_with_vtable=0) + self.check_resops(new_with_vtable=0) def test_bridge_bad_case(self): py.test.skip('We currently cant virtualize across bridges') @@ -67,7 +67,7 @@ return a + b self.interpret(f, [1, 10]) - self.check_loops(new_with_vtable=1) # XXX should eventually be 0? + self.check_resops(new_with_vtable=1) # XXX should eventually be 0? # I think it should be either 0 or 2, 1 makes little sense # If the loop after entering goes first time to the bridge, a # is rewrapped again, without preserving the identity. I'm not diff --git a/pypy/module/cpyext/include/patchlevel.h b/pypy/module/cpyext/include/patchlevel.h --- a/pypy/module/cpyext/include/patchlevel.h +++ b/pypy/module/cpyext/include/patchlevel.h @@ -29,7 +29,7 @@ #define PY_VERSION "2.7.1" /* PyPy version as a string */ -#define PYPY_VERSION "1.6.1" +#define PYPY_VERSION "1.7.1" /* Subversion Revision number of this file (not of the repository). * Empty since Mercurial migration. */ diff --git a/pypy/module/micronumpy/test/test_zjit.py b/pypy/module/micronumpy/test/test_zjit.py --- a/pypy/module/micronumpy/test/test_zjit.py +++ b/pypy/module/micronumpy/test/test_zjit.py @@ -51,9 +51,11 @@ b = a + a b -> 3 """) - self.check_loops({'getarrayitem_raw': 2, 'float_add': 1, - 'setarrayitem_raw': 1, 'int_add': 1, - 'int_lt': 1, 'guard_true': 1, 'jump': 1}) + self.check_resops({'setarrayitem_raw': 2, 'getfield_gc': 11, + 'guard_class': 7, 'guard_true': 2, + 'guard_isnull': 1, 'jump': 2, 'int_lt': 2, + 'float_add': 2, 'int_add': 2, 'guard_value': 1, + 'getarrayitem_raw': 4}) assert result == 3 + 3 def test_floatadd(self): @@ -62,9 +64,11 @@ a -> 3 """) assert result == 3 + 3 - self.check_loops({"getarrayitem_raw": 1, "float_add": 1, - "setarrayitem_raw": 1, "int_add": 1, - "int_lt": 1, "guard_true": 1, "jump": 1}) + self.check_resops({'setarrayitem_raw': 2, 'getfield_gc': 11, + 'guard_class': 7, 'guard_true': 2, + 'guard_isnull': 1, 'jump': 2, 'int_lt': 2, + 'float_add': 2, 'int_add': 2, 'guard_value': 1, + 'getarrayitem_raw': 2}) def test_sum(self): result = self.run(""" @@ -73,9 +77,10 @@ sum(b) """) assert result == 2 * sum(range(30)) - self.check_loops({"getarrayitem_raw": 2, "float_add": 2, - "int_add": 1, - "int_lt": 1, "guard_true": 1, "jump": 1}) + self.check_resops({'guard_class': 7, 'getfield_gc': 11, + 'guard_true': 2, 'jump': 2, 'getarrayitem_raw': 4, + 'guard_value': 2, 'guard_isnull': 1, 'int_lt': 2, + 'float_add': 4, 'int_add': 2}) def test_prod(self): result = self.run(""" @@ -87,9 +92,10 @@ for i in range(30): expected *= i * 2 assert result == expected - self.check_loops({"getarrayitem_raw": 2, "float_add": 1, - "float_mul": 1, "int_add": 1, - "int_lt": 1, "guard_true": 1, "jump": 1}) + self.check_resops({'int_lt': 2, 'getfield_gc': 11, 'guard_class': 7, + 'float_mul': 2, 'guard_true': 2, 'guard_isnull': 1, + 'jump': 2, 'getarrayitem_raw': 4, 'float_add': 2, + 'int_add': 2, 'guard_value': 2}) def test_max(self): py.test.skip("broken, investigate") @@ -125,10 +131,10 @@ any(b) """) assert result == 1 - self.check_loops({"getarrayitem_raw": 2, "float_add": 1, - "float_ne": 1, "int_add": 1, - "int_lt": 1, "guard_true": 1, "jump": 1, - "guard_false": 1}) + self.check_resops({'int_lt': 2, 'getfield_gc': 9, 'guard_class': 7, + 'guard_value': 1, 'int_add': 2, 'guard_true': 2, + 'guard_isnull': 1, 'jump': 2, 'getarrayitem_raw': 4, + 'float_add': 2, 'guard_false': 2, 'float_ne': 2}) def test_already_forced(self): result = self.run(""" @@ -142,9 +148,12 @@ # This is the sum of the ops for both loops, however if you remove the # optimization then you end up with 2 float_adds, so we can still be # sure it was optimized correctly. - self.check_loops({"getarrayitem_raw": 2, "float_mul": 1, "float_add": 1, - "setarrayitem_raw": 2, "int_add": 2, - "int_lt": 2, "guard_true": 2, "jump": 2}) + self.check_resops({'setarrayitem_raw': 4, 'guard_nonnull': 1, + 'getfield_gc': 23, 'guard_class': 14, + 'guard_true': 4, 'float_mul': 2, 'guard_isnull': 2, + 'jump': 4, 'int_lt': 4, 'float_add': 2, + 'int_add': 4, 'guard_value': 2, + 'getarrayitem_raw': 4}) def test_ufunc(self): result = self.run(""" @@ -154,10 +163,11 @@ c -> 3 """) assert result == -6 - self.check_loops({"getarrayitem_raw": 2, "float_add": 1, "float_neg": 1, - "setarrayitem_raw": 1, "int_add": 1, - "int_lt": 1, "guard_true": 1, "jump": 1, - }) + self.check_resops({'setarrayitem_raw': 2, 'getfield_gc': 15, + 'guard_class': 9, 'float_neg': 2, 'guard_true': 2, + 'guard_isnull': 2, 'jump': 2, 'int_lt': 2, + 'float_add': 2, 'int_add': 2, 'guard_value': 2, + 'getarrayitem_raw': 4}) def test_specialization(self): self.run(""" @@ -202,9 +212,11 @@ return v.get_concrete().eval(3).val result = self.meta_interp(f, [5], listops=True, backendopt=True) - self.check_loops({'int_mul': 1, 'getarrayitem_raw': 2, 'float_add': 1, - 'setarrayitem_raw': 1, 'int_add': 1, - 'int_lt': 1, 'guard_true': 1, 'jump': 1}) + self.check_resops({'setarrayitem_raw': 2, 'getfield_gc': 9, + 'guard_true': 2, 'guard_isnull': 1, 'jump': 2, + 'int_lt': 2, 'float_add': 2, 'int_mul': 2, + 'int_add': 2, 'guard_value': 1, + 'getarrayitem_raw': 4}) assert result == f(5) def test_slice2(self): @@ -224,9 +236,11 @@ return v.get_concrete().eval(3).val result = self.meta_interp(f, [5], listops=True, backendopt=True) - self.check_loops({'int_mul': 2, 'getarrayitem_raw': 2, 'float_add': 1, - 'setarrayitem_raw': 1, 'int_add': 1, - 'int_lt': 1, 'guard_true': 1, 'jump': 1}) + self.check_resops({'setarrayitem_raw': 2, 'getfield_gc': 11, + 'guard_true': 2, 'guard_isnull': 1, 'jump': 2, + 'int_lt': 2, 'float_add': 2, 'int_mul': 4, + 'int_add': 2, 'guard_value': 1, + 'getarrayitem_raw': 4}) assert result == f(5) def test_setslice(self): @@ -243,10 +257,12 @@ return ar.get_concrete().eval(3).val result = self.meta_interp(f, [5], listops=True, backendopt=True) - self.check_loops({'getarrayitem_raw': 2, - 'float_add' : 1, - 'setarrayitem_raw': 1, 'int_add': 2, - 'int_lt': 1, 'guard_true': 1, 'jump': 1}) + self.check_resops({'int_is_true': 1, 'setarrayitem_raw': 2, + 'guard_nonnull': 1, 'getfield_gc': 9, + 'guard_false': 1, 'guard_true': 3, + 'guard_isnull': 1, 'jump': 2, 'int_lt': 2, + 'float_add': 2, 'int_gt': 1, 'int_add': 4, + 'guard_value': 1, 'getarrayitem_raw': 4}) assert result == 11.0 def test_int32_sum(self): diff --git a/pypy/module/sys/version.py b/pypy/module/sys/version.py --- a/pypy/module/sys/version.py +++ b/pypy/module/sys/version.py @@ -10,7 +10,7 @@ CPYTHON_VERSION = (2, 7, 1, "final", 42) #XXX # sync patchlevel.h CPYTHON_API_VERSION = 1013 #XXX # sync with include/modsupport.h -PYPY_VERSION = (1, 6, 1, "dev", 0) #XXX # sync patchlevel.h +PYPY_VERSION = (1, 7, 1, "dev", 0) #XXX # sync patchlevel.h if platform.name == 'msvc': COMPILER_INFO = 'MSC v.%d 32 bit' % (platform.version * 10 + 600) diff --git a/pypy/objspace/flow/operation.py b/pypy/objspace/flow/operation.py --- a/pypy/objspace/flow/operation.py +++ b/pypy/objspace/flow/operation.py @@ -11,7 +11,7 @@ from pypy.interpreter.baseobjspace import ObjSpace from pypy.interpreter.error import OperationError from pypy.tool.sourcetools import compile2 -from pypy.rlib.rarithmetic import ovfcheck, ovfcheck_lshift +from pypy.rlib.rarithmetic import ovfcheck from pypy.objspace.flow import model @@ -144,7 +144,7 @@ return ovfcheck(x % y) def lshift_ovf(x, y): - return ovfcheck_lshift(x, y) + return ovfcheck(x << y) # slicing: operator.{get,set,del}slice() don't support b=None or c=None def do_getslice(a, b, c): diff --git a/pypy/objspace/std/intobject.py b/pypy/objspace/std/intobject.py --- a/pypy/objspace/std/intobject.py +++ b/pypy/objspace/std/intobject.py @@ -6,7 +6,7 @@ from pypy.objspace.std.noneobject import W_NoneObject from pypy.objspace.std.register_all import register_all from pypy.rlib import jit -from pypy.rlib.rarithmetic import ovfcheck, ovfcheck_lshift, LONG_BIT, r_uint +from pypy.rlib.rarithmetic import ovfcheck, LONG_BIT, r_uint from pypy.rlib.rbigint import rbigint """ @@ -245,7 +245,7 @@ b = w_int2.intval if r_uint(b) < LONG_BIT: # 0 <= b < LONG_BIT try: - c = ovfcheck_lshift(a, b) + c = ovfcheck(a << b) except OverflowError: raise FailedToImplementArgs(space.w_OverflowError, space.wrap("integer left shift")) 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 @@ -1,5 +1,6 @@ from pypy.interpreter.error import OperationError from pypy.interpreter.gateway import app2interp +from pypy.conftest import gettestobjspace class TestW_StdObjSpace: @@ -60,3 +61,10 @@ typedef = None assert space.isinstance_w(X(), space.w_str) + + def test_withstrbuf_fastpath_isinstance(self): + from pypy.objspace.std.stringobject import W_StringObject + + space = gettestobjspace(withstrbuf=True) + assert space._get_interplevel_cls(space.w_str) is W_StringObject + diff --git a/pypy/rlib/listsort.py b/pypy/rlib/listsort.py --- a/pypy/rlib/listsort.py +++ b/pypy/rlib/listsort.py @@ -1,4 +1,4 @@ -from pypy.rlib.rarithmetic import ovfcheck, ovfcheck_lshift +from pypy.rlib.rarithmetic import ovfcheck ## ------------------------------------------------------------------------ @@ -136,7 +136,7 @@ if lower(a.list[p + ofs], key): lastofs = ofs try: - ofs = ovfcheck_lshift(ofs, 1) + ofs = ovfcheck(ofs << 1) except OverflowError: ofs = maxofs else: @@ -161,7 +161,7 @@ # key <= a[hint - ofs] lastofs = ofs try: - ofs = ovfcheck_lshift(ofs, 1) + ofs = ovfcheck(ofs << 1) except OverflowError: ofs = maxofs else: diff --git a/pypy/rlib/rarithmetic.py b/pypy/rlib/rarithmetic.py --- a/pypy/rlib/rarithmetic.py +++ b/pypy/rlib/rarithmetic.py @@ -12,9 +12,6 @@ back to a signed int value ovfcheck check on CPython whether the result of a signed integer operation did overflow -ovfcheck_lshift - << with oveflow checking - catering to 2.3/2.4 differences about << ovfcheck_float_to_int convert to an integer or raise OverflowError r_longlong @@ -111,18 +108,6 @@ raise OverflowError, "signed integer expression did overflow" return r -def _local_ovfcheck(r): - # a copy of the above, because we cannot call ovfcheck - # in a context where no primitiveoperator is involved. - assert not isinstance(r, r_uint), "unexpected ovf check on unsigned" - if isinstance(r, long): - raise OverflowError, "signed integer expression did overflow" - return r - -def ovfcheck_lshift(a, b): - "NOT_RPYTHON" - return _local_ovfcheck(int(long(a) << b)) - # Strange things happening for float to int on 64 bit: # int(float(i)) != i because of rounding issues. # These are the minimum and maximum float value that can diff --git a/pypy/rlib/rgc.py b/pypy/rlib/rgc.py --- a/pypy/rlib/rgc.py +++ b/pypy/rlib/rgc.py @@ -163,8 +163,10 @@ source_start, dest_start, length): # if the write barrier is not supported, copy by hand - for i in range(length): + i = 0 + while i < length: dest[i + dest_start] = source[i + source_start] + i += 1 return source_addr = llmemory.cast_ptr_to_adr(source) dest_addr = llmemory.cast_ptr_to_adr(dest) @@ -214,8 +216,8 @@ func._gc_no_collect_ = True return func -def is_light_finalizer(func): - func._is_light_finalizer_ = True +def must_be_light_finalizer(func): + func._must_be_light_finalizer_ = True return func # ____________________________________________________________ diff --git a/pypy/rlib/rsre/test/test_zjit.py b/pypy/rlib/rsre/test/test_zjit.py --- a/pypy/rlib/rsre/test/test_zjit.py +++ b/pypy/rlib/rsre/test/test_zjit.py @@ -96,7 +96,7 @@ def test_fast_search(self): res = self.meta_interp_search(r"<foo\w+>", "e<f<f<foxd<f<fh<foobar>ua") assert res == 15 - self.check_loops(guard_value=0) + self.check_resops(guard_value=0) def test_regular_search(self): res = self.meta_interp_search(r"<\w+>", "eiofweoxdiwhdoh<foobar>ua") @@ -120,7 +120,7 @@ def test_aorbstar(self): res = self.meta_interp_match("(a|b)*a", "a" * 100) assert res == 100 - self.check_loops(guard_value=0) + self.check_resops(guard_value=0) # group guards tests @@ -165,4 +165,4 @@ def test_find_repetition_end_fastpath(self): res = self.meta_interp_search(r"b+", "a"*30 + "b") assert res == 30 - self.check_loops(call=0) + self.check_resops(call=0) diff --git a/pypy/rpython/llinterp.py b/pypy/rpython/llinterp.py --- a/pypy/rpython/llinterp.py +++ b/pypy/rpython/llinterp.py @@ -1,6 +1,6 @@ from pypy.objspace.flow.model import FunctionGraph, Constant, Variable, c_last_exception from pypy.rlib.rarithmetic import intmask, r_uint, ovfcheck, r_longlong -from pypy.rlib.rarithmetic import r_ulonglong, ovfcheck_lshift +from pypy.rlib.rarithmetic import r_ulonglong from pypy.rpython.lltypesystem import lltype, llmemory, lloperation, llheap from pypy.rpython.lltypesystem import rclass from pypy.rpython.ootypesystem import ootype @@ -1035,7 +1035,7 @@ assert isinstance(x, int) assert isinstance(y, int) try: - return ovfcheck_lshift(x, y) + return ovfcheck(x << y) except OverflowError: self.make_llexception() diff --git a/pypy/rpython/lltypesystem/module/ll_math.py b/pypy/rpython/lltypesystem/module/ll_math.py --- a/pypy/rpython/lltypesystem/module/ll_math.py +++ b/pypy/rpython/lltypesystem/module/ll_math.py @@ -11,15 +11,17 @@ from pypy.translator.platform import platform from pypy.rlib.rfloat import isfinite, isinf, isnan, INFINITY, NAN +use_library_isinf_isnan = False if sys.platform == "win32": if platform.name == "msvc": # When compiled with /O2 or /Oi (enable intrinsic functions) # It's no more possible to take the address of some math functions. # Ensure that the compiler chooses real functions instead. eci = ExternalCompilationInfo( - includes = ['math.h'], + includes = ['math.h', 'float.h'], post_include_bits = ['#pragma function(floor)'], ) + use_library_isinf_isnan = True else: eci = ExternalCompilationInfo() # Some math functions are C99 and not defined by the Microsoft compiler @@ -108,18 +110,32 @@ # # Custom implementations +VERY_LARGE_FLOAT = 1.0 +while VERY_LARGE_FLOAT * 100.0 != INFINITY: + VERY_LARGE_FLOAT *= 64.0 + +_lib_isnan = rffi.llexternal("_isnan", [lltype.Float], lltype.Signed, + compilation_info=eci) +_lib_finite = rffi.llexternal("_finite", [lltype.Float], lltype.Signed, + compilation_info=eci) + def ll_math_isnan(y): # By not calling into the external function the JIT can inline this. # Floats are awesome. + if use_library_isinf_isnan and not jit.we_are_jitted(): + return bool(_lib_isnan(y)) return y != y def ll_math_isinf(y): - # Use a bitwise OR so the JIT doesn't produce 2 different guards. - return (y == INFINITY) | (y == -INFINITY) + if use_library_isinf_isnan and not jit.we_are_jitted(): + return not _lib_finite(y) and not _lib_isnan(y) + return (y + VERY_LARGE_FLOAT) == y def ll_math_isfinite(y): # Use a custom hack that is reasonably well-suited to the JIT. # Floats are awesome (bis). + if use_library_isinf_isnan and not jit.we_are_jitted(): + return bool(_lib_finite(y)) z = 0.0 * y return z == z # i.e.: z is not a NaN @@ -136,10 +152,12 @@ Windows, FreeBSD and alpha Tru64 are amongst platforms that don't always follow C99. """ - if isnan(x) or isnan(y): + if isnan(x): return NAN - if isinf(y): + if not isfinite(y): + if isnan(y): + return NAN if isinf(x): if math_copysign(1.0, x) == 1.0: # atan2(+-inf, +inf) == +-pi/4 @@ -168,7 +186,7 @@ def ll_math_frexp(x): # deal with special cases directly, to sidestep platform differences - if isnan(x) or isinf(x) or not x: + if not isfinite(x) or not x: mantissa = x exponent = 0 else: @@ -185,7 +203,7 @@ INT_MIN = int(-2**31) def ll_math_ldexp(x, exp): - if x == 0.0 or isinf(x) or isnan(x): + if x == 0.0 or not isfinite(x): return x # NaNs, zeros and infinities are returned unchanged if exp > INT_MAX: # overflow (64-bit platforms only) @@ -209,10 +227,11 @@ def ll_math_modf(x): # some platforms don't do the right thing for NaNs and # infinities, so we take care of special cases directly. - if isinf(x): - return (math_copysign(0.0, x), x) - elif isnan(x): - return (x, x) + if not isfinite(x): + if isnan(x): + return (x, x) + else: # isinf(x) + return (math_copysign(0.0, x), x) intpart_p = lltype.malloc(rffi.DOUBLEP.TO, 1, flavor='raw') try: fracpart = math_modf(x, intpart_p) @@ -223,13 +242,21 @@ def ll_math_fmod(x, y): - if isinf(x) and not isnan(y): - raise ValueError("math domain error") + # fmod(x, +/-Inf) returns x for finite x. + if isinf(y) and isfinite(x): + return x - if y == 0: - raise ValueError("math domain error") - - return math_fmod(x, y) + _error_reset() + r = math_fmod(x, y) + errno = rposix.get_errno() + if isnan(r): + if isnan(x) or isnan(y): + errno = 0 + else: + errno = EDOM + if errno: + _likely_raise(errno, r) + return r def ll_math_hypot(x, y): @@ -242,16 +269,17 @@ _error_reset() r = math_hypot(x, y) errno = rposix.get_errno() - if isnan(r): - if isnan(x) or isnan(y): - errno = 0 - else: - errno = EDOM - elif isinf(r): - if isinf(x) or isnan(x) or isinf(y) or isnan(y): - errno = 0 - else: - errno = ERANGE + if not isfinite(r): + if isnan(r): + if isnan(x) or isnan(y): + errno = 0 + else: + errno = EDOM + else: # isinf(r) + if isfinite(x) and isfinite(y): + errno = ERANGE + else: + errno = 0 if errno: _likely_raise(errno, r) return r @@ -261,30 +289,30 @@ # deal directly with IEEE specials, to cope with problems on various # platforms whose semantics don't exactly match C99 - if isnan(x): - if y == 0.0: - return 1.0 # NaN**0 = 1 - return x - - elif isnan(y): + if isnan(y): if x == 1.0: return 1.0 # 1**Nan = 1 return y - elif isinf(x): - odd_y = not isinf(y) and math_fmod(math_fabs(y), 2.0) == 1.0 - if y > 0.0: - if odd_y: - return x - return math_fabs(x) - elif y == 0.0: - return 1.0 - else: # y < 0.0 - if odd_y: - return math_copysign(0.0, x) - return 0.0 + if not isfinite(x): + if isnan(x): + if y == 0.0: + return 1.0 # NaN**0 = 1 + return x + else: # isinf(x) + odd_y = not isinf(y) and math_fmod(math_fabs(y), 2.0) == 1.0 + if y > 0.0: + if odd_y: + return x + return math_fabs(x) + elif y == 0.0: + return 1.0 + else: # y < 0.0 + if odd_y: + return math_copysign(0.0, x) + return 0.0 - elif isinf(y): + if isinf(y): if math_fabs(x) == 1.0: return 1.0 elif y > 0.0 and math_fabs(x) > 1.0: @@ -299,17 +327,18 @@ _error_reset() r = math_pow(x, y) errno = rposix.get_errno() - if isnan(r): - # a NaN result should arise only from (-ve)**(finite non-integer) - errno = EDOM - elif isinf(r): - # an infinite result here arises either from: - # (A) (+/-0.)**negative (-> divide-by-zero) - # (B) overflow of x**y with x and y finite - if x == 0.0: + if not isfinite(r): + if isnan(r): + # a NaN result should arise only from (-ve)**(finite non-integer) errno = EDOM - else: - errno = ERANGE + else: # isinf(r) + # an infinite result here arises either from: + # (A) (+/-0.)**negative (-> divide-by-zero) + # (B) overflow of x**y with x and y finite + if x == 0.0: + errno = EDOM + else: + errno = ERANGE if errno: _likely_raise(errno, r) return r @@ -358,18 +387,19 @@ r = c_func(x) # Error checking fun. Copied from CPython 2.6 errno = rposix.get_errno() - if isnan(r): - if isnan(x): - errno = 0 - else: - errno = EDOM - elif isinf(r): - if isinf(x) or isnan(x): - errno = 0 - elif can_overflow: - errno = ERANGE - else: - errno = EDOM + if not isfinite(r): + if isnan(r): + if isnan(x): + errno = 0 + else: + errno = EDOM + else: # isinf(r) + if not isfinite(x): + errno = 0 + elif can_overflow: + errno = ERANGE + else: + errno = EDOM if errno: _likely_raise(errno, r) return r diff --git a/pypy/translator/backendopt/finalizer.py b/pypy/translator/backendopt/finalizer.py --- a/pypy/translator/backendopt/finalizer.py +++ b/pypy/translator/backendopt/finalizer.py @@ -4,7 +4,7 @@ class FinalizerError(Exception): """ __del__ marked as lightweight finalizer, but the analyzer did - not agreed + not agree """ class FinalizerAnalyzer(graphanalyze.BoolGraphAnalyzer): @@ -23,7 +23,7 @@ def analyze_light_finalizer(self, graph): result = self.analyze_direct_call(graph) if (result is self.top_result() and - getattr(graph.func, '_is_light_finalizer_', False)): + getattr(graph.func, '_must_be_light_finalizer_', False)): raise FinalizerError(FinalizerError.__doc__, graph) return result diff --git a/pypy/translator/backendopt/test/test_canraise.py b/pypy/translator/backendopt/test/test_canraise.py --- a/pypy/translator/backendopt/test/test_canraise.py +++ b/pypy/translator/backendopt/test/test_canraise.py @@ -201,6 +201,16 @@ result = ra.can_raise(ggraph.startblock.operations[0]) assert result + def test_ll_arraycopy(self): + from pypy.rpython.lltypesystem import rffi + from pypy.rlib.rgc import ll_arraycopy + def f(a, b, c, d, e): + ll_arraycopy(a, b, c, d, e) + t, ra = self.translate(f, [rffi.CCHARP, rffi.CCHARP, int, int, int]) + fgraph = graphof(t, f) + result = ra.can_raise(fgraph.startblock.operations[0]) + assert not result + class TestOOType(OORtypeMixin, BaseTestCanRaise): def test_can_raise_recursive(self): diff --git a/pypy/translator/backendopt/test/test_finalizer.py b/pypy/translator/backendopt/test/test_finalizer.py --- a/pypy/translator/backendopt/test/test_finalizer.py +++ b/pypy/translator/backendopt/test/test_finalizer.py @@ -126,13 +126,13 @@ r = self.analyze(f, [], A.__del__.im_func) assert r - def test_is_light_finalizer_decorator(self): + def test_must_be_light_finalizer_decorator(self): S = lltype.GcStruct('S') - @rgc.is_light_finalizer + @rgc.must_be_light_finalizer def f(): lltype.malloc(S) - @rgc.is_light_finalizer + @rgc.must_be_light_finalizer def g(): pass self.analyze(g, []) # did not explode diff --git a/pypy/translator/c/genc.py b/pypy/translator/c/genc.py --- a/pypy/translator/c/genc.py +++ b/pypy/translator/c/genc.py @@ -521,13 +521,13 @@ rules = [ ('clean', '', 'rm -f $(OBJECTS) $(TARGET) $(GCMAPFILES) $(ASMFILES) *.gc?? ../module_cache/*.gc??'), ('clean_noprof', '', 'rm -f $(OBJECTS) $(TARGET) $(GCMAPFILES) $(ASMFILES)'), - ('debug', '', '$(MAKE) CFLAGS="$(DEBUGFLAGS) -DRPY_ASSERT" $(TARGET)'), - ('debug_exc', '', '$(MAKE) CFLAGS="$(DEBUGFLAGS) -DRPY_ASSERT -DDO_LOG_EXC" $(TARGET)'), - ('debug_mem', '', '$(MAKE) CFLAGS="$(DEBUGFLAGS) -DRPY_ASSERT -DTRIVIAL_MALLOC_DEBUG" $(TARGET)'), + ('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 -DTRIVIAL_MALLOC_DEBUG" debug_target'), ('no_obmalloc', '', '$(MAKE) CFLAGS="-g -O2 -DRPY_ASSERT -DNO_OBMALLOC" $(TARGET)'), - ('linuxmemchk', '', '$(MAKE) CFLAGS="$(DEBUGFLAGS) -DRPY_ASSERT -DLINUXMEMCHK" $(TARGET)'), + ('linuxmemchk', '', '$(MAKE) CFLAGS="$(DEBUGFLAGS) -DRPY_ASSERT -DLINUXMEMCHK" debug_target'), ('llsafer', '', '$(MAKE) CFLAGS="-O2 -DRPY_LL_ASSERT" $(TARGET)'), - ('lldebug', '', '$(MAKE) CFLAGS="$(DEBUGFLAGS) -DRPY_ASSERT -DRPY_LL_ASSERT" $(TARGET)'), + ('lldebug', '', '$(MAKE) CFLAGS="$(DEBUGFLAGS) -DRPY_ASSERT -DRPY_LL_ASSERT" debug_target'), ('profile', '', '$(MAKE) CFLAGS="-g -O1 -pg $(CFLAGS) -fno-omit-frame-pointer" LDFLAGS="-pg $(LDFLAGS)" $(TARGET)'), ] if self.has_profopt(): @@ -554,7 +554,7 @@ mk.definition('ASMLBLFILES', lblsfiles) mk.definition('GCMAPFILES', gcmapfiles) if sys.platform == 'win32': - mk.definition('DEBUGFLAGS', '/Zi') + mk.definition('DEBUGFLAGS', '/MD /Zi') else: mk.definition('DEBUGFLAGS', '-O2 -fomit-frame-pointer -g') @@ -618,9 +618,13 @@ else: if sys.platform == 'win32': - mk.definition('DEBUGFLAGS', '/Zi') + mk.definition('DEBUGFLAGS', '/MD /Zi') else: mk.definition('DEBUGFLAGS', '-O1 -g') + if sys.platform == 'win32': + mk.rule('debug_target', 'debugmode_$(DEFAULT_TARGET)', 'rem') + else: + mk.rule('debug_target', '$(TARGET)', '#') mk.write() #self.translator.platform, # , diff --git a/pypy/translator/cli/test/test_snippet.py b/pypy/translator/cli/test/test_snippet.py --- a/pypy/translator/cli/test/test_snippet.py +++ b/pypy/translator/cli/test/test_snippet.py @@ -28,14 +28,14 @@ res = self.interpret(fn, [], backendopt=False) def test_link_vars_overlapping(self): - from pypy.rlib.rarithmetic import ovfcheck, ovfcheck_lshift + from pypy.rlib.rarithmetic import ovfcheck def fn(maxofs): lastofs = 0 ofs = 1 while ofs < maxofs: lastofs = ofs try: - ofs = ovfcheck_lshift(ofs, 1) + ofs = ovfcheck(ofs << 1) except OverflowError: ofs = maxofs else: diff --git a/pypy/translator/platform/__init__.py b/pypy/translator/platform/__init__.py --- a/pypy/translator/platform/__init__.py +++ b/pypy/translator/platform/__init__.py @@ -102,6 +102,8 @@ bits = [self.__class__.__name__, 'cc=%r' % self.cc] for varname in self.relevant_environ: bits.append('%s=%r' % (varname, os.environ.get(varname))) + # adding sys.maxint to disambiguate windows + bits.append('%s=%r' % ('sys.maxint', sys.maxint)) return ' '.join(bits) # some helpers which seem to be cross-platform enough diff --git a/pypy/translator/platform/windows.py b/pypy/translator/platform/windows.py --- a/pypy/translator/platform/windows.py +++ b/pypy/translator/platform/windows.py @@ -294,6 +294,9 @@ ['$(CC_LINK) /nologo $(LDFLAGS) $(LDFLAGSEXTRA) $(OBJECTS) $(LINKFILES) /out:$@ $(LIBDIRS) $(LIBS) /MANIFEST /MANIFESTFILE:$*.manifest', 'mt.exe -nologo -manifest $*.manifest -outputresource:$@;1', ]) + m.rule('debugmode_$(TARGET)', '$(OBJECTS)', + ['$(CC_LINK) /nologo /DEBUG $(LDFLAGS) $(LDFLAGSEXTRA) $(OBJECTS) $(LINKFILES) /out:$@ $(LIBDIRS) $(LIBS)', + ]) if shared: m.definition('SHARED_IMPORT_LIB', so_name.new(ext='lib').basename) @@ -307,6 +310,9 @@ ['$(CC_LINK) /nologo main.obj $(SHARED_IMPORT_LIB) /out:$@ /MANIFEST /MANIFESTFILE:$*.manifest', 'mt.exe -nologo -manifest $*.manifest -outputresource:$@;1', ]) + m.rule('debugmode_$(DEFAULT_TARGET)', ['debugmode_$(TARGET)', 'main.obj'], + ['$(CC_LINK) /nologo /DEBUG main.obj $(SHARED_IMPORT_LIB) /out:$@' + ]) return m diff --git a/pypy/translator/simplify.py b/pypy/translator/simplify.py --- a/pypy/translator/simplify.py +++ b/pypy/translator/simplify.py @@ -111,16 +111,13 @@ # the while loop above will simplify recursively the new link def transform_ovfcheck(graph): - """The special function calls ovfcheck and ovfcheck_lshift need to + """The special function calls ovfcheck needs to be translated into primitive operations. ovfcheck is called directly after an operation that should be turned into an overflow-checked version. It is considered a syntax error if the resulting <op>_ovf is not defined in objspace/flow/objspace.py. - ovfcheck_lshift is special because there is no preceding operation. - Instead, it will be replaced by an OP_LSHIFT_OVF operation. """ covf = Constant(rarithmetic.ovfcheck) - covfls = Constant(rarithmetic.ovfcheck_lshift) def check_syntax(opname): exlis = operation.implicit_exceptions.get("%s_ovf" % (opname,), []) @@ -154,9 +151,6 @@ op1.opname += '_ovf' del block.operations[i] block.renamevariables({op.result: op1.result}) - elif op.args[0] == covfls: - op.opname = 'lshift_ovf' - del op.args[0] def simplify_exceptions(graph): """The exception handling caused by non-implicit exceptions diff --git a/pypy/translator/test/snippet.py b/pypy/translator/test/snippet.py --- a/pypy/translator/test/snippet.py +++ b/pypy/translator/test/snippet.py @@ -1210,7 +1210,7 @@ return istk.top(), sstk.top() -from pypy.rlib.rarithmetic import ovfcheck, ovfcheck_lshift +from pypy.rlib.rarithmetic import ovfcheck def add_func(i=numtype): try: @@ -1253,7 +1253,7 @@ def lshift_func(i=numtype): try: hugo(2, 3, 5) - return ovfcheck_lshift((-maxint-1), i) + return ovfcheck((-maxint-1) << i) except (hugelmugel, OverflowError, StandardError, ValueError): raise _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit