Author: Armin Rigo <ar...@tunes.org> Branch: stmgc-c4 Changeset: r66881:6bcc88ab4f2b Date: 2013-09-09 22:17 +0200 http://bitbucket.org/pypy/pypy/changeset/6bcc88ab4f2b/
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 @@ -80,6 +80,7 @@ .. branch: reflex-support .. branch: numpypy-inplace-op .. branch: rewritten-loop-logging +.. branch: no-release-gil .. branch: nobold-backtrace Work on improving UnionError messages and stack trace displays. diff --git a/rpython/jit/backend/llgraph/runner.py b/rpython/jit/backend/llgraph/runner.py --- a/rpython/jit/backend/llgraph/runner.py +++ b/rpython/jit/backend/llgraph/runner.py @@ -418,7 +418,6 @@ bh_setfield_raw = bh_setfield_gc bh_setfield_raw_i = bh_setfield_raw - bh_setfield_raw_r = bh_setfield_raw bh_setfield_raw_f = bh_setfield_raw def bh_arraylen_gc(self, a, descr): diff --git a/rpython/jit/backend/llsupport/gc.py b/rpython/jit/backend/llsupport/gc.py --- a/rpython/jit/backend/llsupport/gc.py +++ b/rpython/jit/backend/llsupport/gc.py @@ -65,11 +65,6 @@ return True def initialize(self): pass - @specialize.argtype(1) - def do_stm_barrier(self, gcref, cat): - return gcref - def do_write_barrier(self, gcref_struct, gcref_newptr): - pass def can_use_nursery_malloc(self, size): return False def has_write_barrier_class(self): @@ -150,9 +145,7 @@ def malloc_jitframe(self, frame_info): """ Allocate a new frame, overwritten by tests """ - frame = jitframe.JITFRAME.allocate(frame_info) - llop.gc_writebarrier(lltype.Void, frame) - return frame + return jitframe.JITFRAME.allocate(frame_info) class JitFrameDescrs: def _freeze_(self): @@ -585,30 +578,11 @@ def _setup_write_barrier(self): if self.stm: - self._setup_barriers_for_stm() + self.P2Rdescr = STMReadBarrierDescr(self, 'P2R') + self.P2Wdescr = STMWriteBarrierDescr(self, 'P2W') + self.write_barrier_descr = "wbdescr: do not use" else: self.write_barrier_descr = WriteBarrierDescr(self) - def do_write_barrier(gcref_struct, gcref_newptr): - self.write_barrier_descr._do_barrier(gcref_struct, False) - self.do_write_barrier = do_write_barrier - - def _setup_barriers_for_stm(self): - self.P2Rdescr = STMReadBarrierDescr(self, 'P2R') - self.P2Wdescr = STMWriteBarrierDescr(self, 'P2W') - self.write_barrier_descr = "wbdescr: do not use" - # - @specialize.argtype(0) - def do_stm_barrier(gcref, cat): - if lltype.typeOf(gcref) is lltype.Signed: # ignore if 'raw' - # we are inevitable already because llmodel - # does everything with raw-references - return gcref - if cat == 'W': - descr = self.P2Wdescr - else: - descr = self.P2Rdescr - return descr._do_barrier(gcref, True) - self.do_stm_barrier = do_stm_barrier def _make_functions(self, really_not_translated): from rpython.memory.gctypelayout import check_typeid diff --git a/rpython/jit/backend/llsupport/llmodel.py b/rpython/jit/backend/llsupport/llmodel.py --- a/rpython/jit/backend/llsupport/llmodel.py +++ b/rpython/jit/backend/llsupport/llmodel.py @@ -252,6 +252,7 @@ else: assert kind == history.REF self.set_ref_value(ll_frame, num, arg) + llop.gc_writebarrier(lltype.Void, ll_frame) # This is the line that calls the assembler code. # 'func(ll_frame)' would work here too, producing an # indirect_call(func, ll_frame, None). The main difference @@ -401,9 +402,11 @@ else: raise NotImplementedError("size = %d" % size) + @specialize.argtype(1) def read_ref_at_mem(self, gcref, ofs): return llop.raw_load(llmemory.GCREF, gcref, ofs) + # non-@specialized: must only be called with llmemory.GCREF def write_ref_at_mem(self, gcref, ofs, newvalue): llop.raw_store(lltype.Void, gcref, ofs, newvalue) # the write barrier is implied above @@ -552,6 +555,7 @@ ofs, size, sign = self.unpack_fielddescr_size(fielddescr) return self.read_int_at_mem(struct, ofs, size, sign) + @specialize.argtype(1) def bh_getfield_gc_r(self, struct, fielddescr): ofs = self.unpack_fielddescr(fielddescr) return self.read_ref_at_mem(struct, ofs) @@ -562,6 +566,7 @@ return self.read_float_at_mem(struct, ofs) bh_getfield_raw_i = bh_getfield_gc_i + bh_getfield_raw_r = bh_getfield_gc_r bh_getfield_raw_f = bh_getfield_gc_f @specialize.argtype(1) diff --git a/rpython/jit/backend/llsupport/test/test_gc.py b/rpython/jit/backend/llsupport/test/test_gc.py --- a/rpython/jit/backend/llsupport/test/test_gc.py +++ b/rpython/jit/backend/llsupport/test/test_gc.py @@ -176,26 +176,6 @@ repr(basesize), repr(itemsize), repr(ofs_length), p)] - def test_do_write_barrier(self): - gc_ll_descr = self.gc_ll_descr - R = lltype.GcStruct('R') - S = lltype.GcStruct('S', ('r', lltype.Ptr(R))) - s = lltype.malloc(S) - r = lltype.malloc(R) - s_hdr = gc_ll_descr.gcheaderbuilder.new_header(s) - s_gcref = lltype.cast_opaque_ptr(llmemory.GCREF, s) - r_gcref = lltype.cast_opaque_ptr(llmemory.GCREF, r) - s_adr = llmemory.cast_ptr_to_adr(s) - llmemory.cast_ptr_to_adr(r) - # - s_hdr.tid &= ~gc_ll_descr.GCClass.JIT_WB_IF_FLAG - gc_ll_descr.do_write_barrier(s_gcref, r_gcref) - assert self.llop1.record == [] # not called - # - s_hdr.tid |= gc_ll_descr.GCClass.JIT_WB_IF_FLAG - gc_ll_descr.do_write_barrier(s_gcref, r_gcref) - assert self.llop1.record == [('barrier', s_adr)] - def test_gen_write_barrier(self): from rpython.jit.backend.llsupport.rewrite import GcRewriterAssembler gc_ll_descr = self.gc_ll_descr diff --git a/rpython/jit/backend/model.py b/rpython/jit/backend/model.py --- a/rpython/jit/backend/model.py +++ b/rpython/jit/backend/model.py @@ -264,8 +264,6 @@ def bh_setfield_raw_i(self, struct, newvalue, fielddescr): raise NotImplementedError - def bh_setfield_raw_r(self, struct, newvalue, fielddescr): - raise NotImplementedError def bh_setfield_raw_f(self, struct, newvalue, fielddescr): raise NotImplementedError diff --git a/rpython/jit/codewriter/jtransform.py b/rpython/jit/codewriter/jtransform.py --- a/rpython/jit/codewriter/jtransform.py +++ b/rpython/jit/codewriter/jtransform.py @@ -688,6 +688,10 @@ kind = getkind(RESULT)[0] op1 = SpaceOperation('getfield_%s_%s%s' % (argname, kind, pure), [v_inst, descr], op.result) + if op1.opname == 'getfield_raw_r': + # note: 'getfield_raw_r_pure' is used e.g. to load class + # attributes that are GC objects, so that one is supported. + raise Exception("getfield_raw_r (without _pure) not supported") # if immut in (IR_QUASIIMMUTABLE, IR_QUASIIMMUTABLE_ARRAY): descr1 = self.cpu.fielddescrof( @@ -720,6 +724,8 @@ descr = self.cpu.fielddescrof(v_inst.concretetype.TO, c_fieldname.value) kind = getkind(RESULT)[0] + if argname == 'raw' and kind == 'r': + raise Exception("setfield_raw_r not supported") return SpaceOperation('setfield_%s_%s' % (argname, kind), [v_inst, v_value, descr], None) diff --git a/rpython/jit/metainterp/blackhole.py b/rpython/jit/metainterp/blackhole.py --- a/rpython/jit/metainterp/blackhole.py +++ b/rpython/jit/metainterp/blackhole.py @@ -1263,14 +1263,15 @@ def bhimpl_getfield_raw_i(cpu, struct, fielddescr): return cpu.bh_getfield_raw_i(struct, fielddescr) @arguments("cpu", "i", "d", returns="r") - def bhimpl_getfield_raw_r(cpu, struct, fielddescr): + def _bhimpl_getfield_raw_r(cpu, struct, fielddescr): + # only for 'getfield_raw_r_pure' return cpu.bh_getfield_raw_r(struct, fielddescr) @arguments("cpu", "i", "d", returns="f") def bhimpl_getfield_raw_f(cpu, struct, fielddescr): return cpu.bh_getfield_raw_f(struct, fielddescr) bhimpl_getfield_raw_i_pure = bhimpl_getfield_raw_i - bhimpl_getfield_raw_r_pure = bhimpl_getfield_raw_r + bhimpl_getfield_raw_r_pure = _bhimpl_getfield_raw_r bhimpl_getfield_raw_f_pure = bhimpl_getfield_raw_f @arguments("cpu", "r", "i", "d") @@ -1290,9 +1291,6 @@ @arguments("cpu", "i", "i", "d") def bhimpl_setfield_raw_i(cpu, struct, newvalue, fielddescr): cpu.bh_setfield_raw_i(struct, newvalue, fielddescr) - @arguments("cpu", "i", "r", "d") - def bhimpl_setfield_raw_r(cpu, struct, newvalue, fielddescr): - cpu.bh_setfield_raw_r(struct, newvalue, fielddescr) @arguments("cpu", "i", "f", "d") def bhimpl_setfield_raw_f(cpu, struct, newvalue, fielddescr): cpu.bh_setfield_raw_f(struct, newvalue, fielddescr) diff --git a/rpython/jit/metainterp/executor.py b/rpython/jit/metainterp/executor.py --- a/rpython/jit/metainterp/executor.py +++ b/rpython/jit/metainterp/executor.py @@ -177,9 +177,8 @@ def do_setfield_raw(cpu, _, structbox, itembox, fielddescr): struct = structbox.getint() - if fielddescr.is_pointer_field(): - cpu.bh_setfield_raw_r(struct, itembox.getref_base(), fielddescr) - elif fielddescr.is_float_field(): + assert not fielddescr.is_pointer_field() + if fielddescr.is_float_field(): cpu.bh_setfield_raw_f(struct, itembox.getfloatstorage(), fielddescr) else: cpu.bh_setfield_raw_i(struct, itembox.getint(), fielddescr) diff --git a/rpython/jit/metainterp/pyjitpl.py b/rpython/jit/metainterp/pyjitpl.py --- a/rpython/jit/metainterp/pyjitpl.py +++ b/rpython/jit/metainterp/pyjitpl.py @@ -643,7 +643,6 @@ def _opimpl_getfield_raw_any(self, box, fielddescr): return self.execute_with_descr(rop.GETFIELD_RAW, fielddescr, box) opimpl_getfield_raw_i = _opimpl_getfield_raw_any - opimpl_getfield_raw_r = _opimpl_getfield_raw_any opimpl_getfield_raw_f = _opimpl_getfield_raw_any @arguments("box", "descr") @@ -657,7 +656,6 @@ def _opimpl_setfield_raw_any(self, box, valuebox, fielddescr): self.execute_with_descr(rop.SETFIELD_RAW, fielddescr, box, valuebox) opimpl_setfield_raw_i = _opimpl_setfield_raw_any - opimpl_setfield_raw_r = _opimpl_setfield_raw_any opimpl_setfield_raw_f = _opimpl_setfield_raw_any @arguments("box", "box", "box", "descr") diff --git a/rpython/rtyper/lltypesystem/opimpl.py b/rpython/rtyper/lltypesystem/opimpl.py --- a/rpython/rtyper/lltypesystem/opimpl.py +++ b/rpython/rtyper/lltypesystem/opimpl.py @@ -680,7 +680,6 @@ def op_raw_store(p, ofs, newvalue): from rpython.rtyper.lltypesystem import rffi - TP = lltype.typeOf(p) p = rffi.cast(llmemory.Address, p) TVAL = lltype.typeOf(newvalue) p = rffi.cast(rffi.CArrayPtr(TVAL), p + ofs) @@ -688,7 +687,6 @@ def op_raw_load(TVAL, p, ofs): from rpython.rtyper.lltypesystem import rffi - TP = lltype.typeOf(p) p = rffi.cast(llmemory.Address, p) p = rffi.cast(rffi.CArrayPtr(TVAL), p + ofs) return p[0] diff --git a/rpython/rtyper/rpbc.py b/rpython/rtyper/rpbc.py --- a/rpython/rtyper/rpbc.py +++ b/rpython/rtyper/rpbc.py @@ -596,6 +596,9 @@ def ll_str(self, none): return llstr("None") + def get_ll_eq_function(self): + return None + def get_ll_hash_function(self): return ll_none_hash diff --git a/rpython/rtyper/test/test_rdict.py b/rpython/rtyper/test/test_rdict.py --- a/rpython/rtyper/test/test_rdict.py +++ b/rpython/rtyper/test/test_rdict.py @@ -1051,6 +1051,13 @@ finally: lltype._array._check_range = original_check_range + def test_dict_with_none_key(self): + def func(i): + d = {None: i} + return d[None] + res = self.interpret(func, [42]) + assert res == 42 + class TestStress: _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit