[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