Author: Philip Jenvey <pjen...@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-@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: _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit