[pypy-svn] r78024 - in pypy/branch/rsre-jit/pypy/rlib: . test
arigo at codespeak.net
arigo at codespeak.net
Sat Oct 16 18:17:01 CEST 2010
Author: arigo
Date: Sat Oct 16 18:16:59 2010
New Revision: 78024
Modified:
pypy/branch/rsre-jit/pypy/rlib/jit.py
pypy/branch/rsre-jit/pypy/rlib/test/test_jit.py
Log:
Test showing the final goal: letting 'x.foo' be written
in the JitDriver, in the 'greens' list. Currently expands
as a extra argument in the jit_marker operation.
Modified: pypy/branch/rsre-jit/pypy/rlib/jit.py
==============================================================================
--- pypy/branch/rsre-jit/pypy/rlib/jit.py (original)
+++ pypy/branch/rsre-jit/pypy/rlib/jit.py Sat Oct 16 18:16:59 2010
@@ -358,7 +358,8 @@
driver = self.instance.im_self
keys = kwds_s.keys()
keys.sort()
- expected = ['s_' + name for name in driver.greens + driver.reds]
+ expected = ['s_' + name for name in driver.greens + driver.reds
+ if '.' not in name]
expected.sort()
if keys != expected:
raise JitHintError("%s expects the following keyword "
@@ -403,7 +404,13 @@
uniquekey = 'jitdriver.%s' % func.func_name
args_s = args_s[:]
for name in variables:
- s_arg = kwds_s['s_' + name]
+ if '.' not in name:
+ s_arg = kwds_s['s_' + name]
+ else:
+ objname, fieldname = name.split('.')
+ s_instance = kwds_s['s_' + objname]
+ s_arg = s_instance.classdef.about_attribute(fieldname)
+ assert s_arg is not None
args_s.append(s_arg)
bk.emulate_pbc_call(uniquekey, s_func, args_s)
@@ -416,9 +423,33 @@
greens_v = []
reds_v = []
for name in driver.greens:
- i = kwds_i['i_' + name]
- r_green = hop.args_r[i]
- v_green = hop.inputarg(r_green, arg=i)
+ if '.' not in name:
+ i = kwds_i['i_' + name]
+ r_green = hop.args_r[i]
+ v_green = hop.inputarg(r_green, arg=i)
+ else:
+ if hop.rtyper.type_system.name == 'ootypesystem':
+ py.test.skip("lltype only")
+ objname, fieldname = name.split('.') # see test_green_field
+ assert objname in driver.reds
+ i = kwds_i['i_' + objname]
+ r_red = hop.args_r[i]
+ while True:
+ try:
+ mangled_name, r_field = r_red._get_field(fieldname)
+ break
+ except KeyError:
+ pass
+ assert r_red.rbase is not None, (
+ "field %r not found in %r" % (name,
+ r_red.lowleveltype.TO))
+ r_red = r_red.rbase
+ assert r_red.lowleveltype.TO._immutable_field(mangled_name), (
+ "field %r must be declared as immutable" % name)
+ v_red = hop.inputarg(r_red, arg=i)
+ c_llname = hop.inputconst(lltype.Void, mangled_name)
+ v_green = hop.genop('getfield', [v_red, c_llname],
+ resulttype = r_field)
greens_v.append(v_green)
for name in driver.reds:
i = kwds_i['i_' + name]
Modified: pypy/branch/rsre-jit/pypy/rlib/test/test_jit.py
==============================================================================
--- pypy/branch/rsre-jit/pypy/rlib/test/test_jit.py (original)
+++ pypy/branch/rsre-jit/pypy/rlib/test/test_jit.py Sat Oct 16 18:16:59 2010
@@ -1,4 +1,5 @@
import py
+from pypy.conftest import option
from pypy.rlib.jit import hint, we_are_jitted, JitDriver, purefunction_promote
from pypy.rlib.jit import JitHintError
from pypy.translator.translator import TranslationContext, graphof
@@ -104,6 +105,26 @@
return n
py.test.raises(JitHintError, self.gengraph, fn, [int])
+ def test_green_field(self):
+ def get_printable_location(xfoo):
+ return str(ord(xfoo)) # xfoo must be annotated as a character
+ myjitdriver = JitDriver(greens=['x.foo'], reds=['n', 'x'],
+ get_printable_location=get_printable_location)
+ class A(object):
+ _immutable_fields_ = ['foo']
+ def fn(n):
+ x = A()
+ x.foo = chr(n)
+ while n > 0:
+ myjitdriver.can_enter_jit(x=x, n=n)
+ myjitdriver.jit_merge_point(x=x, n=n)
+ n -= 1
+ return n
+ t = self.gengraph(fn, [int])[0]
+ if option.view:
+ t.view()
+ # assert did not raise
+
class TestJITLLtype(BaseTestJIT, LLRtypeMixin):
pass
More information about the Pypy-commit
mailing list