[pypy-commit] pypy stmgc-c4: hg merge default

arigo noreply at buildbot.pypy.org
Mon Sep 9 22:18:20 CEST 2013


Author: Armin Rigo <arigo at 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- at 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:
 


More information about the pypy-commit mailing list