[pypy-svn] pypy out-of-line-guards-2: a missing merge?
fijal
commits-noreply at bitbucket.org
Mon Apr 18 16:32:04 CEST 2011
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: out-of-line-guards-2
Changeset: r43453:65472e284ecc
Date: 2011-04-18 16:32 +0200
http://bitbucket.org/pypy/pypy/changeset/65472e284ecc/
Log: a missing merge?
diff --git a/pypy/jit/backend/x86/assembler.py b/pypy/jit/backend/x86/assembler.py
--- a/pypy/jit/backend/x86/assembler.py
+++ b/pypy/jit/backend/x86/assembler.py
@@ -134,6 +134,7 @@
def setup(self, looptoken):
assert self.memcpy_addr != 0, "setup_once() not called?"
self.current_clt = looptoken.compiled_loop_token
+ self.invalidate_positions = []
self.pending_guard_tokens = []
self.mc = codebuf.MachineCodeBlockWrapper()
if self.datablockwrapper is None:
@@ -142,6 +143,7 @@
allblocks)
def teardown(self):
+ self.invalidate_positions = None
self.pending_guard_tokens = None
self.mc = None
self.looppos = -1
@@ -450,9 +452,10 @@
mc.copy_to_raw_memory(addr)
else:
# guard not invalidate, patch where it jumps
- pos, _ = clt.invalidate_positions[inv_counter]
- clt.invalidate_positions[inv_counter] = (pos + rawstart,
- relative_target)
+ pos, _ = self.invalidate_positions[inv_counter]
+ clt.invalidate_positions.append((pos + rawstart,
+ relative_target))
+ inv_counter += 1
def get_asmmemmgr_blocks(self, looptoken):
clt = looptoken.compiled_loop_token
@@ -1458,9 +1461,9 @@
def genop_guard_guard_not_invalidated(self, ign_1, guard_op, guard_token,
locs, ign_2):
- pos = self.mc.get_relative_pos() + 1 # after jmp
+ pos = self.mc.get_relative_pos() + 1 # after potential jmp
guard_token.pos_jump_offset = pos
- self.current_clt.invalidate_positions.append((pos, 0))
+ self.invalidate_positions.append((pos, 0))
self.pending_guard_tokens.append(guard_token)
def genop_guard_guard_exception(self, ign_1, guard_op, guard_token,
diff --git a/pypy/jit/metainterp/test/test_quasiimmut.py b/pypy/jit/metainterp/test/test_quasiimmut.py
--- a/pypy/jit/metainterp/test/test_quasiimmut.py
+++ b/pypy/jit/metainterp/test/test_quasiimmut.py
@@ -233,5 +233,34 @@
assert self.meta_interp(g, []) == g()
+ def test_invalidate_bridge(self):
+ jitdriver = JitDriver(greens=['foo'], reds=['i', 'total'])
+
+ class Foo(object):
+ _immutable_fields_ = ['a?']
+
+ def f(foo):
+ i = 0
+ total = 0
+ while i < 10:
+ jitdriver.jit_merge_point(i=i, total=total, foo=foo)
+ if i > 5:
+ total += foo.a
+ else:
+ total += 2*foo.a
+ i += 1
+ return total
+
+ def main():
+ foo = Foo()
+ foo.a = 1
+ total = f(foo)
+ foo.a = 2
+ total += f(foo)
+ return total
+
+ res = self.meta_interp(main, [])
+ assert res == main()
+
class TestLLtypeGreenFieldsTests(QuasiImmutTests, LLJitMixin):
pass
diff --git a/pypy/jit/metainterp/test/test_virtualizable.py b/pypy/jit/metainterp/test/test_virtualizable.py
--- a/pypy/jit/metainterp/test/test_virtualizable.py
+++ b/pypy/jit/metainterp/test/test_virtualizable.py
@@ -2,6 +2,7 @@
from pypy.rpython.extregistry import ExtRegistryEntry
from pypy.rpython.lltypesystem import lltype, lloperation, rclass, llmemory
from pypy.rpython.annlowlevel import llhelper
+from pypy.rpython.rclass import IR_IMMUTABLE, IR_ARRAY_IMMUTABLE
from pypy.jit.codewriter.policy import StopAtXPolicy
from pypy.jit.codewriter import heaptracker
from pypy.rlib.jit import JitDriver, hint, dont_look_inside
@@ -45,7 +46,7 @@
('inst_node', lltype.Ptr(LLtypeMixin.NODE)),
hints = {'virtualizable2_accessor': FieldListAccessor()})
XY._hints['virtualizable2_accessor'].initialize(
- XY, {'inst_x' : "", 'inst_node' : ""})
+ XY, {'inst_x' : IR_IMMUTABLE, 'inst_node' : IR_IMMUTABLE})
xy_vtable = lltype.malloc(rclass.OBJECT_VTABLE, immortal=True)
heaptracker.set_testing_vtable_for_gcstruct(XY, xy_vtable, 'XY')
@@ -210,7 +211,8 @@
('inst_l2', lltype.Ptr(lltype.GcArray(lltype.Signed))),
hints = {'virtualizable2_accessor': FieldListAccessor()})
XY2._hints['virtualizable2_accessor'].initialize(
- XY2, {'inst_x' : "", 'inst_l1' : "[*]", 'inst_l2' : "[*]"})
+ XY2, {'inst_x' : IR_IMMUTABLE,
+ 'inst_l1' : IR_ARRAY_IMMUTABLE, 'inst_l2' : IR_ARRAY_IMMUTABLE})
xy2_vtable = lltype.malloc(rclass.OBJECT_VTABLE, immortal=True)
heaptracker.set_testing_vtable_for_gcstruct(XY2, xy2_vtable, 'XY2')
diff --git a/pypy/jit/metainterp/virtualizable.py b/pypy/jit/metainterp/virtualizable.py
--- a/pypy/jit/metainterp/virtualizable.py
+++ b/pypy/jit/metainterp/virtualizable.py
@@ -1,6 +1,7 @@
from pypy.rpython.lltypesystem import lltype, llmemory
from pypy.rpython.ootypesystem import ootype
from pypy.rpython.annlowlevel import cast_base_ptr_to_instance
+from pypy.rpython.rclass import IR_ARRAY_IMMUTABLE, IR_IMMUTABLE
from pypy.rpython import rvirtualizable2
from pypy.rlib.objectmodel import we_are_translated
from pypy.rlib.unroll import unrolling_iterable
@@ -10,7 +11,7 @@
from pypy.jit.metainterp.warmstate import wrap, unwrap
from pypy.rlib.objectmodel import specialize
-class VirtualizableInfo:
+class VirtualizableInfo(object):
TOKEN_NONE = 0 # must be 0 -- see also x86.call_assembler
TOKEN_TRACING_RESCALL = -1
@@ -33,11 +34,13 @@
all_fields = accessor.fields
static_fields = []
array_fields = []
- for name, suffix in all_fields.iteritems():
- if suffix == '[*]':
+ for name, tp in all_fields.iteritems():
+ if tp == IR_ARRAY_IMMUTABLE:
array_fields.append(name)
+ elif tp == IR_IMMUTABLE:
+ static_fields.append(name)
else:
- static_fields.append(name)
+ raise Exception("unknown type: %s" % tp)
self.static_fields = static_fields
self.array_fields = array_fields
#
More information about the Pypy-commit
mailing list