[pypy-svn] r68666 - in pypy/branch/warmspot-jitinfo/pypy/jit/metainterp: . test
arigo at codespeak.net
arigo at codespeak.net
Tue Oct 20 18:44:10 CEST 2009
Author: arigo
Date: Tue Oct 20 18:44:09 2009
New Revision: 68666
Modified:
pypy/branch/warmspot-jitinfo/pypy/jit/metainterp/test/test_warmstate.py
pypy/branch/warmspot-jitinfo/pypy/jit/metainterp/warmstate.py
Log:
Port the rest of the code in WarmEnterState and write tests.
Modified: pypy/branch/warmspot-jitinfo/pypy/jit/metainterp/test/test_warmstate.py
==============================================================================
--- pypy/branch/warmspot-jitinfo/pypy/jit/metainterp/test/test_warmstate.py (original)
+++ pypy/branch/warmspot-jitinfo/pypy/jit/metainterp/test/test_warmstate.py Tue Oct 20 18:44:09 2009
@@ -62,13 +62,13 @@
class FakeJitCell:
pass
state = WarmEnterState(FakeWarmRunnerDesc())
- get_jitcell = state.make_jitcell_getter_default(FakeJitCell)
- cell1 = get_jitcell((42, 42.5))
+ get_jitcell = state._make_jitcell_getter_default(FakeJitCell)
+ cell1 = get_jitcell(42, 42.5)
assert isinstance(cell1, FakeJitCell)
- cell2 = get_jitcell((42, 42.5))
+ cell2 = get_jitcell(42, 42.5)
assert cell1 is cell2
- cell3 = get_jitcell((41, 42.5))
- cell4 = get_jitcell((42, 0.25))
+ cell3 = get_jitcell(41, 42.5)
+ cell4 = get_jitcell(42, 0.25)
assert cell1 is not cell3 is not cell4 is not cell1
def test_make_jitcell_getter():
@@ -77,9 +77,10 @@
get_jitcell_at_ptr = None
state = WarmEnterState(FakeWarmRunnerDesc())
get_jitcell = state.make_jitcell_getter()
- cell1 = get_jitcell((1.75,))
- cell2 = get_jitcell((1.75,))
+ cell1 = get_jitcell(1.75)
+ cell2 = get_jitcell(1.75)
assert cell1 is cell2
+ assert get_jitcell is state.make_jitcell_getter()
def test_make_jitcell_getter_custom():
class FakeJitCell:
@@ -102,15 +103,15 @@
set_jitcell_at_ptr = llhelper(SETTER, setter)
#
state = WarmEnterState(FakeWarmRunnerDesc())
- get_jitcell = state.make_jitcell_getter_custom(FakeJitCell)
- cell1 = get_jitcell((5, 42.5))
+ get_jitcell = state._make_jitcell_getter_custom(FakeJitCell)
+ cell1 = get_jitcell(5, 42.5)
assert isinstance(cell1, FakeJitCell)
assert cell1.x == 5
assert cell1.y == 42.5
- cell2 = get_jitcell((5, 42.5))
+ cell2 = get_jitcell(5, 42.5)
assert cell2 is cell1
- cell3 = get_jitcell((41, 42.5))
- cell4 = get_jitcell((42, 0.25))
+ cell3 = get_jitcell(41, 42.5)
+ cell4 = get_jitcell(42, 0.25)
assert cell1 is not cell3 is not cell4 is not cell1
def test_make_set_future_values():
@@ -133,3 +134,70 @@
0: ("int", 5),
1: ("float", 42.5),
}
+ assert set_future_values is state.make_set_future_values()
+
+def test_make_unwrap_greenkey():
+ class FakeWarmRunnerDesc:
+ green_args_spec = [lltype.Signed, lltype.Float]
+ state = WarmEnterState(FakeWarmRunnerDesc())
+ unwrap_greenkey = state.make_unwrap_greenkey()
+ greenargs = unwrap_greenkey([BoxInt(42), BoxFloat(42.5)])
+ assert greenargs == (42, 42.5)
+ assert type(greenargs[0]) is int
+
+def test_attach_unoptimized_bridge_from_interp():
+ class FakeWarmRunnerDesc:
+ green_args_spec = [lltype.Signed, lltype.Float]
+ get_jitcell_at_ptr = None
+ state = WarmEnterState(FakeWarmRunnerDesc())
+ get_jitcell = state.make_jitcell_getter()
+ state.attach_unoptimized_bridge_from_interp([BoxInt(5), BoxFloat(2.25)],
+ "entry loop token")
+ cell1 = get_jitcell(5, 2.25)
+ assert cell1.counter < 0
+ assert cell1.entry_loop_token == "entry loop token"
+
+def test_make_jitdriver_callbacks_1():
+ class FakeWarmRunnerDesc:
+ can_inline_ptr = None
+ get_printable_location_ptr = None
+ state = WarmEnterState(FakeWarmRunnerDesc())
+ state.make_jitdriver_callbacks()
+ res = state.can_inline_callable([BoxInt(5), BoxFloat(42.5)])
+ assert res is True
+ res = state.get_location_str([BoxInt(5), BoxFloat(42.5)])
+ assert res == '(no jitdriver.get_printable_location!)'
+
+def test_make_jitdriver_callbacks_2():
+ def can_inline(x, y):
+ assert x == 5
+ assert y == 42.5
+ return False
+ CAN_INLINE = lltype.Ptr(lltype.FuncType([lltype.Signed, lltype.Float],
+ lltype.Bool))
+ class FakeWarmRunnerDesc:
+ rtyper = None
+ green_args_spec = [lltype.Signed, lltype.Float]
+ can_inline_ptr = llhelper(CAN_INLINE, can_inline)
+ get_printable_location_ptr = None
+ state = WarmEnterState(FakeWarmRunnerDesc())
+ state.make_jitdriver_callbacks()
+ res = state.can_inline_callable([BoxInt(5), BoxFloat(42.5)])
+ assert res is False
+
+def test_make_jitdriver_callbacks_3():
+ def get_location(x, y):
+ assert x == 5
+ assert y == 42.5
+ return "hi there" # abuse the return type, but nobody checks it
+ GET_LOCATION = lltype.Ptr(lltype.FuncType([lltype.Signed, lltype.Float],
+ lltype.Ptr(rstr.STR)))
+ class FakeWarmRunnerDesc:
+ rtyper = None
+ green_args_spec = [lltype.Signed, lltype.Float]
+ can_inline_ptr = None
+ get_printable_location_ptr = llhelper(GET_LOCATION, get_location)
+ state = WarmEnterState(FakeWarmRunnerDesc())
+ state.make_jitdriver_callbacks()
+ res = state.get_location_str([BoxInt(5), BoxFloat(42.5)])
+ assert res == "hi there"
Modified: pypy/branch/warmspot-jitinfo/pypy/jit/metainterp/warmstate.py
==============================================================================
--- pypy/branch/warmspot-jitinfo/pypy/jit/metainterp/warmstate.py (original)
+++ pypy/branch/warmspot-jitinfo/pypy/jit/metainterp/warmstate.py Tue Oct 20 18:44:09 2009
@@ -1,6 +1,7 @@
import sys
from pypy.rpython.lltypesystem import lltype, llmemory, rstr
from pypy.rpython.ootypesystem import ootype
+from pypy.rpython.annlowlevel import hlstr
from pypy.rlib.objectmodel import specialize, we_are_translated, r_dict
from pypy.rlib.rarithmetic import intmask
from pypy.rlib.nonconst import NonConstant
@@ -152,16 +153,33 @@
if self.profiler is not None:
self.profiler.set_printing(value >= DEBUG_PROFILE)
+ def must_compile_from_failure(self, key):
+ key.counter += 1
+ return key.counter >= self.trace_eagerness
+
+ def reset_counter_from_failure(self, key):
+ key.counter = 0
+
+ def attach_unoptimized_bridge_from_interp(self, greenkey,
+ entry_loop_token):
+ cell = self.jit_cell_at_key(greenkey)
+ cell.counter = -1
+ cell.entry_loop_token = entry_loop_token
+
# ----------
def make_entry_point(self):
"NOT_RPYTHON"
- metainterp_sd = warmrunnerdesc.metainterp_sd
+ if hasattr(self, 'maybe_compile_and_run'):
+ return self.maybe_compile_and_run
+
+ metainterp_sd = self.warmrunnerdesc.metainterp_sd
globaldata = metainterp_sd.globaldata
vinfo = metainterp_sd.virtualizable_info
ContinueRunningNormally = self.warmrunnerdesc.ContinueRunningNormally
get_jitcell = self.make_jitcell_getter()
set_future_values = self.make_set_future_values()
+ self.make_jitdriver_callbacks()
def maybe_compile_and_run(*args):
"""Entry point to the JIT. Called at the point with the
@@ -181,7 +199,7 @@
# look for the cell corresponding to the current greenargs
greenargs = args[:self.num_green_args]
- cell = get_jitcell(greenargs)
+ cell = get_jitcell(*greenargs)
if cell.counter >= 0:
# update the profiling counter
@@ -213,22 +231,58 @@
loop_token = fail_descr.handle_fail(metainterp_sd)
maybe_compile_and_run._dont_inline_ = True
+ self.maybe_compile_and_run = maybe_compile_and_run
return maybe_compile_and_run
# ----------
+ def make_unwrap_greenkey(self):
+ "NOT_RPYTHON"
+ if hasattr(self, 'unwrap_greenkey'):
+ return self.unwrap_greenkey
+ #
+ warmrunnerdesc = self.warmrunnerdesc
+ green_args_spec = unrolling_iterable(warmrunnerdesc.green_args_spec)
+ #
+ def unwrap_greenkey(greenkey):
+ greenargs = ()
+ i = 0
+ for TYPE in green_args_spec:
+ value = unwrap(TYPE, greenkey[i])
+ greenargs += (value,)
+ i = i + 1
+ return greenargs
+ #
+ unwrap_greenkey._always_inline_ = True
+ self.unwrap_greenkey = unwrap_greenkey
+ return unwrap_greenkey
+
+ # ----------
+
def make_jitcell_getter(self):
"NOT_RPYTHON"
+ if hasattr(self, 'jit_getter'):
+ return self.jit_getter
#
class JitCell(object):
counter = 0
#
if self.warmrunnerdesc.get_jitcell_at_ptr is None:
- return self.make_jitcell_getter_default(JitCell)
+ jit_getter = self._make_jitcell_getter_default(JitCell)
else:
- return self.make_jitcell_getter_custom(JitCell)
+ jit_getter = self._make_jitcell_getter_custom(JitCell)
+ #
+ unwrap_greenkey = self.make_unwrap_greenkey()
+ #
+ def jit_cell_at_key(greenkey):
+ greenargs = unwrap_greenkey(greenkey)
+ return jit_getter(*greenargs)
+ self.jit_cell_at_key = jit_cell_at_key
+ self.jit_getter = jit_getter
+ #
+ return jit_getter
- def make_jitcell_getter_default(self, JitCell):
+ def _make_jitcell_getter_default(self, JitCell):
"NOT_RPYTHON"
warmrunnerdesc = self.warmrunnerdesc
green_args_spec = unrolling_iterable(warmrunnerdesc.green_args_spec)
@@ -253,7 +307,7 @@
#
jitcell_dict = r_dict(comparekey, hashkey)
#
- def get_jitcell(greenargs):
+ def get_jitcell(*greenargs):
try:
cell = jitcell_dict[greenargs]
except KeyError:
@@ -262,14 +316,14 @@
return cell
return get_jitcell
- def make_jitcell_getter_custom(self, JitCell):
+ def _make_jitcell_getter_custom(self, JitCell):
"NOT_RPYTHON"
rtyper = self.warmrunnerdesc.rtyper
get_jitcell_at_ptr = self.warmrunnerdesc.get_jitcell_at_ptr
set_jitcell_at_ptr = self.warmrunnerdesc.set_jitcell_at_ptr
cpu = self.warmrunnerdesc.cpu
#
- def get_jitcell(greenargs):
+ def get_jitcell(*greenargs):
fn = support.maybe_on_top_of_llinterp(rtyper, get_jitcell_at_ptr)
try:
cellref = fn(*greenargs)
@@ -293,6 +347,9 @@
def make_set_future_values(self):
"NOT_RPYTHON"
+ if hasattr(self, 'set_future_values'):
+ return self.set_future_values
+
warmrunnerdesc = self.warmrunnerdesc
cpu = warmrunnerdesc.cpu
vinfo = warmrunnerdesc.metainterp_sd.virtualizable_info
@@ -331,4 +388,42 @@
else:
set_future_values_from_vinfo = None
#
+ self.set_future_values = set_future_values
return set_future_values
+
+ # ----------
+
+ def make_jitdriver_callbacks(self):
+ if hasattr(self, 'get_location_str'):
+ return
+ #
+ can_inline_ptr = self.warmrunnerdesc.can_inline_ptr
+ if can_inline_ptr is None:
+ def can_inline_callable(greenkey):
+ return True
+ else:
+ rtyper = self.warmrunnerdesc.rtyper
+ unwrap_greenkey = self.make_unwrap_greenkey()
+ #
+ def can_inline_callable(greenkey):
+ greenargs = unwrap_greenkey(greenkey)
+ fn = support.maybe_on_top_of_llinterp(rtyper, can_inline_ptr)
+ return fn(*greenargs)
+ self.can_inline_callable = can_inline_callable
+ #
+ get_location_ptr = self.warmrunnerdesc.get_printable_location_ptr
+ if get_location_ptr is None:
+ def get_location_str(greenkey):
+ return '(no jitdriver.get_printable_location!)'
+ else:
+ rtyper = self.warmrunnerdesc.rtyper
+ unwrap_greenkey = self.make_unwrap_greenkey()
+ #
+ def get_location_str(greenkey):
+ greenargs = unwrap_greenkey(greenkey)
+ fn = support.maybe_on_top_of_llinterp(rtyper, get_location_ptr)
+ res = fn(*greenargs)
+ if not we_are_translated() and not isinstance(res, str):
+ res = hlstr(res)
+ return res
+ self.get_location_str = get_location_str
More information about the Pypy-commit
mailing list