[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