Author: Dario Bertini <berda...@gmail.com> Branch: Changeset: r45163:74eb86865bdf Date: 2011-06-28 17:05 +0200 http://bitbucket.org/pypy/pypy/changeset/74eb86865bdf/
Log: merge heads diff --git a/pypy/interpreter/test/test_typedef.py b/pypy/interpreter/test/test_typedef.py --- a/pypy/interpreter/test/test_typedef.py +++ b/pypy/interpreter/test/test_typedef.py @@ -203,3 +203,18 @@ lst = seen[:] assert lst == [5, 10, 2] raises(OSError, os.lseek, fd, 7, 0) + + def test_method_attrs(self): + class A(object): + def m(self): + "aaa" + m.x = 3 + + bm = A().m + assert bm.__func__ is bm.im_func + assert bm.__self__ is bm.im_self + assert bm.__objclass__ is bm.im_class is A + assert bm.__doc__ == "aaa" + assert bm.x == 3 + raises(AttributeError, setattr, bm, 'x', 15) + assert [].append.__objclass__ is list \ No newline at end of file diff --git a/pypy/interpreter/typedef.py b/pypy/interpreter/typedef.py --- a/pypy/interpreter/typedef.py +++ b/pypy/interpreter/typedef.py @@ -761,13 +761,17 @@ ) Function.typedef.acceptable_as_base_class = False -Method.typedef = TypeDef("method", +Method.typedef = TypeDef( + "method", __new__ = interp2app(Method.descr_method__new__.im_func), __call__ = interp2app(Method.descr_method_call), __get__ = interp2app(Method.descr_method_get), im_func = interp_attrproperty_w('w_function', cls=Method), + __func__ = interp_attrproperty_w('w_function', cls=Method), im_self = interp_attrproperty_w('w_instance', cls=Method), + __self__ = interp_attrproperty_w('w_instance', cls=Method), im_class = interp_attrproperty_w('w_class', cls=Method), + __objclass__ = interp_attrproperty_w('w_class', cls=Method), __getattribute__ = interp2app(Method.descr_method_getattribute), __eq__ = interp2app(Method.descr_method_eq), __ne__ = descr_generic_ne, diff --git a/pypy/jit/backend/x86/regloc.py b/pypy/jit/backend/x86/regloc.py --- a/pypy/jit/backend/x86/regloc.py +++ b/pypy/jit/backend/x86/regloc.py @@ -318,7 +318,9 @@ # must be careful not to combine it with location types that # might need to use the scratch register themselves. if loc2 is X86_64_SCRATCH_REG: - assert code1 != 'j' + if code1 == 'j': + assert (name.startswith("MOV") and + rx86.fits_in_32bits(loc1.value_j())) if loc1 is X86_64_SCRATCH_REG and not name.startswith("MOV"): assert code2 not in ('j', 'i') 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 @@ -6,6 +6,7 @@ ConstPtr, Box, BoxFloat, BasicFailDescr) from pypy.jit.backend.detect_cpu import getcpuclass from pypy.jit.backend.x86.arch import WORD +from pypy.jit.backend.x86.rx86 import fits_in_32bits from pypy.jit.backend.llsupport import symbolic from pypy.jit.metainterp.resoperation import rop from pypy.jit.metainterp.executor import execute @@ -241,6 +242,23 @@ c = self.execute_operation(rop.GETFIELD_GC, [res], 'int', ofsc3) assert c.value == 3 + def test_bug_setfield_64bit(self): + if WORD == 4: + py.test.skip("only for 64 bits") + TP = lltype.GcStruct('S', ('i', lltype.Signed)) + ofsi = self.cpu.fielddescrof(TP, 'i') + for i in range(500): + p = lltype.malloc(TP) + addr = rffi.cast(lltype.Signed, p) + if fits_in_32bits(addr): + break # fitting in 32 bits, good + else: + py.test.skip("cannot get a 32-bit pointer") + res = ConstPtr(rffi.cast(llmemory.GCREF, addr)) + self.execute_operation(rop.SETFIELD_RAW, [res, ConstInt(3**33)], + 'void', ofsi) + assert p.i == 3**33 + def test_nullity_with_guard(self): allops = [rop.INT_IS_TRUE] guards = [rop.GUARD_TRUE, rop.GUARD_FALSE] diff --git a/pypy/jit/metainterp/blackhole.py b/pypy/jit/metainterp/blackhole.py --- a/pypy/jit/metainterp/blackhole.py +++ b/pypy/jit/metainterp/blackhole.py @@ -3,7 +3,7 @@ from pypy.rlib.rarithmetic import intmask, LONG_BIT, r_uint, ovfcheck from pypy.rlib.objectmodel import we_are_translated from pypy.rlib.debug import debug_start, debug_stop -from pypy.rlib.debug import make_sure_not_resized, fatalerror +from pypy.rlib.debug import make_sure_not_resized from pypy.rpython.lltypesystem import lltype, llmemory, rclass from pypy.rpython.lltypesystem.lloperation import llop from pypy.rpython.llinterp import LLException diff --git a/pypy/jit/metainterp/history.py b/pypy/jit/metainterp/history.py --- a/pypy/jit/metainterp/history.py +++ b/pypy/jit/metainterp/history.py @@ -791,6 +791,7 @@ def dump(self): self.compiled_loop_token.cpu.dump_loop_token(self) + class TreeLoop(object): inputargs = None operations = None diff --git a/pypy/jit/metainterp/optimizeopt/intbounds.py b/pypy/jit/metainterp/optimizeopt/intbounds.py --- a/pypy/jit/metainterp/optimizeopt/intbounds.py +++ b/pypy/jit/metainterp/optimizeopt/intbounds.py @@ -1,7 +1,7 @@ from pypy.jit.metainterp.optimizeopt.optimizer import Optimization, CONST_1, CONST_0 from pypy.jit.metainterp.optimizeopt.util import _findall -from pypy.jit.metainterp.optimizeopt.intutils import IntBound, IntUnbounded, \ - IntLowerBound, IntUpperBound +from pypy.jit.metainterp.optimizeopt.intutils import (IntBound, IntUnbounded, + IntLowerBound, IntUpperBound) from pypy.jit.metainterp.history import Const, ConstInt from pypy.jit.metainterp.resoperation import rop, ResOperation @@ -373,6 +373,15 @@ if v2.intbound.intersect(v1.intbound): self.propagate_bounds_backward(op.getarg(1)) + def propagate_bounds_INT_IS_TRUE(self, op): + r = self.getvalue(op.result) + if r.is_constant(): + if r.box.same_constant(CONST_1): + v1 = self.getvalue(op.getarg(0)) + if v1.intbound.known_ge(IntBound(0, 0)): + v1.intbound.make_gt(IntBound(0, 0)) + self.propagate_bounds_backward(op.getarg(0)) + def propagate_bounds_INT_ADD(self, op): v1 = self.getvalue(op.getarg(0)) v2 = self.getvalue(op.getarg(1)) @@ -418,5 +427,6 @@ propagate_bounds_INT_SUB_OVF = propagate_bounds_INT_SUB propagate_bounds_INT_MUL_OVF = propagate_bounds_INT_MUL + optimize_ops = _findall(OptIntBounds, 'optimize_') propagate_bounds_ops = _findall(OptIntBounds, 'propagate_bounds_') 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 @@ -121,6 +121,41 @@ print '\n'.join([str(o) for o in loop.operations]) self.assert_equal(loop, expected) + def setup_method(self, meth=None): + class FailDescr(compile.ResumeGuardDescr): + oparse = None + def _oparser_uses_descr_of_guard(self, oparse, fail_args): + # typically called 3 times: once when parsing 'ops', + # once when parsing 'preamble', once when parsing 'expected'. + self.oparse = oparse + self.rd_frame_info_list, self.rd_snapshot = snapshot(fail_args) + def _clone_if_mutable(self): + assert self is fdescr + return fdescr2 + def __repr__(self): + if self is fdescr: + return 'fdescr' + if self is fdescr2: + return 'fdescr2' + return compile.ResumeGuardDescr.__repr__(self) + # + def snapshot(fail_args, got=[]): + if not got: # only the first time, i.e. when parsing 'ops' + rd_frame_info_list = resume.FrameInfo(None, "code", 11) + rd_snapshot = resume.Snapshot(None, fail_args) + got.append(rd_frame_info_list) + got.append(rd_snapshot) + return got + # + fdescr = instantiate(FailDescr) + self.namespace['fdescr'] = fdescr + fdescr2 = instantiate(FailDescr) + self.namespace['fdescr2'] = fdescr2 + + def teardown_method(self, meth): + self.namespace.pop('fdescr', None) + self.namespace.pop('fdescr2', None) + class BaseTestOptimizeBasic(BaseTestBasic): @@ -1875,7 +1910,6 @@ self.optimize_loop(ops, expected) def test_merge_guard_nonnull_guard_class(self): - self.make_fail_descr() ops = """ [p1, i0, i1, i2, p2] guard_nonnull(p1, descr=fdescr) [i0] @@ -1893,7 +1927,6 @@ self.check_expanded_fail_descr("i0", rop.GUARD_NONNULL_CLASS) def test_merge_guard_nonnull_guard_value(self): - self.make_fail_descr() ops = """ [p1, i0, i1, i2, p2] guard_nonnull(p1, descr=fdescr) [i0] @@ -1911,7 +1944,6 @@ self.check_expanded_fail_descr("i0", rop.GUARD_VALUE) def test_merge_guard_nonnull_guard_class_guard_value(self): - self.make_fail_descr() ops = """ [p1, i0, i1, i2, p2] guard_nonnull(p1, descr=fdescr) [i0] @@ -2204,23 +2236,6 @@ # ---------- - def make_fail_descr(self): - class FailDescr(compile.ResumeGuardDescr): - oparse = None - def _oparser_uses_descr_of_guard(self, oparse, fail_args): - # typically called twice, before and after optimization - if self.oparse is None: - fdescr.rd_frame_info_list = resume.FrameInfo(None, - "code", 11) - fdescr.rd_snapshot = resume.Snapshot(None, fail_args) - self.oparse = oparse - # - fdescr = instantiate(FailDescr) - self.namespace['fdescr'] = fdescr - - def teardown_method(self, meth): - self.namespace.pop('fdescr', None) - def _verify_fail_args(self, boxes, oparse, text): import re r = re.compile(r"\bwhere\s+(\w+)\s+is a\s+(\w+)") @@ -2329,7 +2344,6 @@ self._verify_fail_args(boxes, fdescr.oparse, expectedtext) def test_expand_fail_1(self): - self.make_fail_descr() ops = """ [i1, i3] # first rename i3 into i4 @@ -2350,7 +2364,6 @@ self.check_expanded_fail_descr('15, i3', rop.GUARD_TRUE) def test_expand_fail_2(self): - self.make_fail_descr() ops = """ [i1, i2] p1 = new_with_vtable(ConstClass(node_vtable)) @@ -2370,7 +2383,6 @@ ''', rop.GUARD_TRUE) def test_expand_fail_3(self): - self.make_fail_descr() ops = """ [i1, i2, i3, p3] p1 = new_with_vtable(ConstClass(node_vtable)) @@ -2396,7 +2408,7 @@ def test_expand_fail_4(self): for arg in ['p1', 'i2,p1', 'p1,p2', 'p2,p1', 'i2,p1,p2', 'i2,p2,p1']: - self.make_fail_descr() + self.setup_method() # humpf ops = """ [i1, i2, i3] p1 = new_with_vtable(ConstClass(node_vtable)) @@ -2421,7 +2433,6 @@ rop.GUARD_TRUE) def test_expand_fail_5(self): - self.make_fail_descr() ops = """ [i1, i2, i3, i4] p1 = new_with_vtable(ConstClass(node_vtable)) @@ -2445,7 +2456,6 @@ ''', rop.GUARD_TRUE) def test_expand_fail_6(self): - self.make_fail_descr() ops = """ [p0, i0, i1] guard_true(i0, descr=fdescr) [p0] @@ -2466,7 +2476,6 @@ ''', rop.GUARD_TRUE) def test_expand_fail_varray(self): - self.make_fail_descr() ops = """ [i1] p1 = new_array(3, descr=arraydescr) @@ -2487,7 +2496,6 @@ ''', rop.GUARD_TRUE) def test_expand_fail_vstruct(self): - self.make_fail_descr() ops = """ [i1, p1] p2 = new(descr=ssize) @@ -2509,7 +2517,6 @@ ''', rop.GUARD_TRUE) def test_expand_fail_v_all_1(self): - self.make_fail_descr() ops = """ [i1, p1a, i2] p6s = getarrayitem_gc(p1a, 0, descr=arraydescr2) @@ -2551,7 +2558,6 @@ ''', rop.GUARD_TRUE) def test_expand_fail_lazy_setfield_1(self): - self.make_fail_descr() ops = """ [p1, i2, i3] p2 = new_with_vtable(ConstClass(node_vtable)) @@ -2577,7 +2583,6 @@ ''', rop.GUARD_TRUE) def test_expand_fail_lazy_setfield_2(self): - self.make_fail_descr() ops = """ [i2, i3] p2 = new_with_vtable(ConstClass(node_vtable)) @@ -2601,9 +2606,6 @@ where p2 is a node_vtable, valuedescr=i2 ''', rop.GUARD_TRUE) - -class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin): - def test_residual_call_does_not_invalidate_caches(self): ops = """ [p1, p2] @@ -2895,7 +2897,6 @@ self.optimize_loop(ops, expected) def test_vref_virtual_2(self): - self.make_fail_descr() ops = """ [p0, i1] # @@ -2941,7 +2942,6 @@ ''', rop.GUARD_NOT_FORCED) def test_vref_virtual_and_lazy_setfield(self): - self.make_fail_descr() ops = """ [p0, i1] # @@ -2980,7 +2980,6 @@ ''', rop.GUARD_NO_EXCEPTION) def test_vref_virtual_after_finish(self): - self.make_fail_descr() ops = """ [i1] p1 = new_with_vtable(ConstClass(node_vtable)) @@ -3007,7 +3006,6 @@ self.optimize_loop(ops, expected) def test_vref_nonvirtual_and_lazy_setfield(self): - self.make_fail_descr() ops = """ [i1, p1] p2 = virtual_ref(p1, 23) @@ -4499,6 +4497,29 @@ """ self.optimize_loop(ops, expected) + def test_int_is_true_bounds(self): + ops = """ + [p0] + i0 = strlen(p0) + i1 = int_is_true(i0) + guard_true(i1) [] + i2 = int_ge(0, i0) + guard_false(i2) [] + jump(p0) + """ + expected = """ + [p0] + i0 = strlen(p0) + i1 = int_is_true(i0) + guard_true(i1) [] + jump(p0) + """ + self.optimize_loop(ops, expected) + + +class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin): + pass + ##class TestOOtype(BaseTestOptimizeBasic, OOtypeMixin): diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py --- a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py +++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py @@ -2742,8 +2742,6 @@ # ---------- -class TestLLtype(OptimizeOptTest, LLtypeMixin): - def test_residual_call_does_not_invalidate_caches(self): ops = """ [p1, p2] @@ -5899,3 +5897,6 @@ jump(i0, i1) """ self.optimize_loop(ops, expected) + +class TestLLtype(OptimizeOptTest, LLtypeMixin): + pass diff --git a/pypy/jit/tool/pypytrace-mode.el b/pypy/jit/tool/pypytrace-mode.el --- a/pypy/jit/tool/pypytrace-mode.el +++ b/pypy/jit/tool/pypytrace-mode.el @@ -32,7 +32,7 @@ ("<.*FieldDescr \\([^ ]*\\)" (1 'font-lock-variable-name-face)) ;; comment out debug_merge_point, but then highlight specific part of it ("^debug_merge_point.*" . font-lock-comment-face) - ("^\\(debug_merge_point\\).*code object\\(.*\\), file \\('.*'\\), \\(line .*\\)> \\(.*\\)" + ("^\\(debug_merge_point\\).*code object\\(.*\\). file \\('.*'\\). \\(line .*\\)> \\(.*\\)" (1 'compilation-warning t) (2 'escape-glyph t) (3 'font-lock-string-face t) diff --git a/pypy/module/pypyjit/test_pypy_c/test_00_model.py b/pypy/module/pypyjit/test_pypy_c/test_00_model.py --- a/pypy/module/pypyjit/test_pypy_c/test_00_model.py +++ b/pypy/module/pypyjit/test_pypy_c/test_00_model.py @@ -58,6 +58,8 @@ stdout, stderr = pipe.communicate() if stderr.startswith('SKIP:'): py.test.skip(stderr) + if stderr.startswith('debug_alloc.h:'): # lldebug builds + stderr = '' assert not stderr # # parse the JIT log diff --git a/pypy/rlib/rsdl/RMix.py b/pypy/rlib/rsdl/RMix.py --- a/pypy/rlib/rsdl/RMix.py +++ b/pypy/rlib/rsdl/RMix.py @@ -52,7 +52,8 @@ ChunkPtr) def LoadWAV(filename_ccharp): - return LoadWAV_RW(RSDL.RWFromFile(filename_ccharp, rffi.str2charp('rb')), 1) + with rffi.scoped_str2charp('rb') as mode: + return LoadWAV_RW(RSDL.RWFromFile(filename_ccharp, mode), 1) PlayChannelTimed = external('Mix_PlayChannelTimed', @@ -64,4 +65,4 @@ """Returns zero if the channel is not playing. Otherwise if you passed in -1, the number of channels playing is returned""" -ChannelPlaying = external('Mix_Playing', [ rffi.INT]) \ No newline at end of file +ChannelPlaying = external('Mix_Playing', [rffi.INT], rffi.INT) diff --git a/pypy/rpython/lltypesystem/ll2ctypes.py b/pypy/rpython/lltypesystem/ll2ctypes.py --- a/pypy/rpython/lltypesystem/ll2ctypes.py +++ b/pypy/rpython/lltypesystem/ll2ctypes.py @@ -37,7 +37,9 @@ if far_regions: import random pieces = far_regions._ll2ctypes_pieces - num = random.randrange(len(pieces)) + num = random.randrange(len(pieces)+1) + if num == len(pieces): + return ctype() i1, stop = pieces[num] i2 = i1 + ((ctypes.sizeof(ctype) or 1) + 7) & ~7 if i2 > stop: diff --git a/pypy/rpython/memory/gc/minimark.py b/pypy/rpython/memory/gc/minimark.py --- a/pypy/rpython/memory/gc/minimark.py +++ b/pypy/rpython/memory/gc/minimark.py @@ -1107,8 +1107,11 @@ return True # ^^^ a fast path of write-barrier # - if (source_hdr.tid & GCFLAG_NO_YOUNG_PTRS == 0 or - source_hdr.tid & GCFLAG_CARDS_SET != 0): + if source_hdr.tid & GCFLAG_CARDS_SET != 0: + # there might be young objects, let ll_arraycopy find them + return False + # + if source_hdr.tid & GCFLAG_NO_YOUNG_PTRS == 0: # there might be in source a pointer to a young object self.old_objects_pointing_to_young.append(dest_addr) dest_hdr.tid &= ~GCFLAG_NO_YOUNG_PTRS diff --git a/pypy/rpython/memory/gc/test/test_direct.py b/pypy/rpython/memory/gc/test/test_direct.py --- a/pypy/rpython/memory/gc/test/test_direct.py +++ b/pypy/rpython/memory/gc/test/test_direct.py @@ -522,5 +522,44 @@ self.stackroots.pop() test_card_marker.GC_PARAMS = {"card_page_indices": 4} + def test_writebarrier_before_copy(self): + from pypy.rpython.memory.gc import minimark + largeobj_size = self.gc.nonlarge_max + 1 + p_src = self.malloc(VAR, largeobj_size) + p_dst = self.malloc(VAR, largeobj_size) + # make them old + self.stackroots.append(p_src) + self.stackroots.append(p_dst) + self.gc.collect() + p_dst = self.stackroots.pop() + p_src = self.stackroots.pop() + # + addr_src = llmemory.cast_ptr_to_adr(p_src) + addr_dst = llmemory.cast_ptr_to_adr(p_dst) + hdr_src = self.gc.header(addr_src) + hdr_dst = self.gc.header(addr_dst) + # + assert hdr_src.tid & minimark.GCFLAG_NO_YOUNG_PTRS + assert hdr_dst.tid & minimark.GCFLAG_NO_YOUNG_PTRS + # + res = self.gc.writebarrier_before_copy(addr_src, addr_dst) + assert res + assert hdr_dst.tid & minimark.GCFLAG_NO_YOUNG_PTRS + # + hdr_src.tid &= ~minimark.GCFLAG_NO_YOUNG_PTRS # pretend we have young ptrs + res = self.gc.writebarrier_before_copy(addr_src, addr_dst) + assert res # we optimized it + assert hdr_dst.tid & minimark.GCFLAG_NO_YOUNG_PTRS == 0 # and we copied the flag + # + # in this case, we have cards, so GCFLAG_NO_YOUNG_PTRS is set (because + # cards takes precedence over it) + hdr_src.tid |= minimark.GCFLAG_NO_YOUNG_PTRS + hdr_dst.tid |= minimark.GCFLAG_NO_YOUNG_PTRS + hdr_src.tid |= minimark.GCFLAG_CARDS_SET + res = self.gc.writebarrier_before_copy(addr_src, addr_dst) + assert not res # there might be young ptrs, let ll_arraycopy to find them + assert hdr_dst.tid & minimark.GCFLAG_NO_YOUNG_PTRS + + class TestMiniMarkGCFull(DirectGCTest): from pypy.rpython.memory.gc.minimark import MiniMarkGC as GCClass _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit