[pypy-commit] pypy py3k: merge default

pjenvey noreply at buildbot.pypy.org
Thu Sep 12 00:25:42 CEST 2013


Author: Philip Jenvey <pjenvey at underboss.org>
Branch: py3k
Changeset: r66919:f1e02da40fe0
Date: 2013-09-10 11:19 -0700
http://bitbucket.org/pypy/pypy/changeset/f1e02da40fe0/

Log:	merge default

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
@@ -64,8 +64,6 @@
         return True
     def initialize(self):
         pass
-    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):
@@ -135,9 +133,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):
@@ -547,17 +543,6 @@
         hdr = llmemory.cast_adr_to_ptr(hdr_addr, self.HDRPTR)
         hdr.tid = tid
 
-    def do_write_barrier(self, gcref_struct, gcref_newptr):
-        hdr_addr = llmemory.cast_ptr_to_adr(gcref_struct)
-        hdr_addr -= self.gcheaderbuilder.size_gc_header
-        hdr = llmemory.cast_adr_to_ptr(hdr_addr, self.HDRPTR)
-        if hdr.tid & self.GCClass.JIT_WB_IF_FLAG:
-            # get a pointer to the 'remember_young_pointer' function from
-            # the GC, and call it immediately
-            llop1 = self.llop1
-            funcptr = llop1.get_write_barrier_failing_case(self.WB_FUNCPTR)
-            funcptr(llmemory.cast_ptr_to_adr(gcref_struct))
-
     def can_use_nursery_malloc(self, size):
         return size < self.max_size_of_young_obj
 
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
@@ -247,6 +247,7 @@
                     else:
                         assert kind == history.REF
                         self.set_ref_value(ll_frame, num, arg)
+                llop.gc_writebarrier(lltype.Void, ll_frame)
                 ll_frame = func(ll_frame)
             finally:
                 if not self.translate_support_code:
@@ -390,9 +391,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
@@ -541,6 +544,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)
@@ -551,6 +555,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
@@ -175,26 +175,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):
         gc_ll_descr = self.gc_ll_descr
         llop1 = self.llop1
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/rlib/rsre/rpy/__init__.py b/rpython/rlib/rsre/rpy/__init__.py
new file mode 100644
--- /dev/null
+++ b/rpython/rlib/rsre/rpy/__init__.py
@@ -0,0 +1,1 @@
+from ._sre import get_code
diff --git a/rpython/rlib/rsre/rpy.py b/rpython/rlib/rsre/rpy/_sre.py
rename from rpython/rlib/rsre/rpy.py
rename to rpython/rlib/rsre/rpy/_sre.py
--- a/rpython/rlib/rsre/rpy.py
+++ b/rpython/rlib/rsre/rpy/_sre.py
@@ -1,46 +1,24 @@
 
 from rpython.rlib.rsre import rsre_char
-from rpython.rlib.rsre.rsre_core import match
 from rpython.rlib.rarithmetic import intmask
 
-def get_hacked_sre_compile(my_compile):
-    """Return a copy of the sre_compile module for which the _sre
-    module is a custom module that has _sre.compile == my_compile
-    and CODESIZE == rsre_char.CODESIZE.
-    """
-    import sre_compile, sre_constants, __builtin__, new
-    sre_hacked = new.module("_sre_hacked")
-    sre_hacked.compile = my_compile
-    sre_hacked.MAGIC = sre_compile.MAGIC
-    sre_hacked.CODESIZE = rsre_char.CODESIZE
-    sre_hacked.MAXREPEAT = sre_constants.MAX_REPEAT
-    sre_hacked.getlower = rsre_char.getlower
-    def my_import(name, *args):
-        if name == '_sre':
-            return sre_hacked
-        else:
-            return default_import(name, *args)
-    src = sre_compile.__file__
-    if src.lower().endswith('.pyc') or src.lower().endswith('.pyo'):
-        src = src[:-1]
-    mod = new.module("sre_compile_hacked")
-    default_import = __import__
-    try:
-        __builtin__.__import__ = my_import
-        execfile(src, mod.__dict__)
-    finally:
-        __builtin__.__import__ = default_import
-    return mod
+
+MAGIC = 20031017
+CODESIZE = rsre_char.CODESIZE
+getlower = rsre_char.getlower
+
 
 class GotIt(Exception):
     pass
-def my_compile(pattern, flags, code, *args):
+
+def compile(pattern, flags, code, *args):
     raise GotIt([intmask(i) for i in code], flags, args)
-sre_compile_hacked = get_hacked_sre_compile(my_compile)
+
 
 def get_code(regexp, flags=0, allargs=False):
+    from . import sre_compile
     try:
-        sre_compile_hacked.compile(regexp, flags)
+        sre_compile.compile(regexp, flags)
     except GotIt, e:
         pass
     else:
diff --git a/lib-python/2.7/sre_compile.py b/rpython/rlib/rsre/rpy/sre_compile.py
copy from lib-python/2.7/sre_compile.py
copy to rpython/rlib/rsre/rpy/sre_compile.py
--- a/lib-python/2.7/sre_compile.py
+++ b/rpython/rlib/rsre/rpy/sre_compile.py
@@ -8,11 +8,11 @@
 # See the sre.py file for information on usage and redistribution.
 #
 
-"""Internal support module for sre"""
+"""Internal support module for sre (copied from CPython 2.7.3)"""
 
-import _sre, sys
-import sre_parse
-from sre_constants import *
+import sys
+from . import _sre, sre_parse
+from .sre_constants import *
 
 assert _sre.MAGIC == MAGIC, "SRE module mismatch"
 
diff --git a/lib-python/2.7/sre_constants.py b/rpython/rlib/rsre/rpy/sre_constants.py
copy from lib-python/2.7/sre_constants.py
copy to rpython/rlib/rsre/rpy/sre_constants.py
--- a/lib-python/2.7/sre_constants.py
+++ b/rpython/rlib/rsre/rpy/sre_constants.py
@@ -9,7 +9,7 @@
 # See the sre.py file for information on usage and redistribution.
 #
 
-"""Internal support module for sre"""
+"""Internal support module for sre (copied from CPython 2.7.3)"""
 
 # update when constants are added or removed
 
@@ -20,10 +20,8 @@
 MAXREPEAT = 65535
 
 # SRE standard exception (access as sre.error)
-# should this really be here?
-
-class error(Exception):
-    pass
+# (use the real re.error exception class)
+from re import error
 
 # operators
 
diff --git a/lib-python/2.7/sre_parse.py b/rpython/rlib/rsre/rpy/sre_parse.py
copy from lib-python/2.7/sre_parse.py
copy to rpython/rlib/rsre/rpy/sre_parse.py
--- a/lib-python/2.7/sre_parse.py
+++ b/rpython/rlib/rsre/rpy/sre_parse.py
@@ -8,19 +8,13 @@
 # See the sre.py file for information on usage and redistribution.
 #
 
-"""Internal support module for sre"""
+"""Internal support module for sre (copied from CPython 2.7.3)"""
 
 # XXX: show string offset and offending character for all errors
 
 import sys
 
-from sre_constants import *
-
-try:
-    from __pypy__ import newdict
-except ImportError:
-    assert '__pypy__' not in sys.builtin_module_names
-    newdict = lambda _ : {}
+from .sre_constants import *
 
 SPECIAL_CHARS = ".\\[{()*+?^$|"
 REPEAT_CHARS = "*+?{"
@@ -74,7 +68,7 @@
         self.flags = 0
         self.open = []
         self.groups = 1
-        self.groupdict = newdict("module")
+        self.groupdict = {}
     def opengroup(self, name=None):
         gid = self.groups
         self.groups = gid + 1
diff --git a/rpython/rlib/rsre/rsre_re.py b/rpython/rlib/rsre/rsre_re.py
--- a/rpython/rlib/rsre/rsre_re.py
+++ b/rpython/rlib/rsre/rsre_re.py
@@ -286,8 +286,8 @@
 class Scanner:
     # This class is copied directly from re.py.
     def __init__(self, lexicon, flags=0):
-        from sre_constants import BRANCH, SUBPATTERN
-        import sre_parse
+        from rpython.rlib.rsre.rpy.sre_constants import BRANCH, SUBPATTERN
+        from rpython.rlib.rsre.rpy import sre_parse
         self.lexicon = lexicon
         # combine phrases into a compound pattern
         p = []
diff --git a/rpython/rlib/rsre/test/test_char.py b/rpython/rlib/rsre/test/test_char.py
--- a/rpython/rlib/rsre/test/test_char.py
+++ b/rpython/rlib/rsre/test/test_char.py
@@ -48,7 +48,7 @@
     assert not rsre_char.is_uni_word(ord(','))
 
 def test_category():
-    from sre_constants import CHCODES
+    from rpython.rlib.rsre.rpy.sre_constants import CHCODES
     cat = rsre_char.category_dispatch
     #
     assert     cat(CHCODES["category_digit"], ord('1'))
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