[pypy-svn] r69906 - in pypy/trunk/pypy/jit/metainterp: . test

arigo at codespeak.net arigo at codespeak.net
Fri Dec 4 20:55:19 CET 2009


Author: arigo
Date: Fri Dec  4 20:55:18 2009
New Revision: 69906

Modified:
   pypy/trunk/pypy/jit/metainterp/compile.py
   pypy/trunk/pypy/jit/metainterp/pyjitpl.py
   pypy/trunk/pypy/jit/metainterp/test/test_virtualizable.py
Log:
Merge r69903 and r69904 from branch/virtual-forcing:
a test and fix for virtualizables.


Modified: pypy/trunk/pypy/jit/metainterp/compile.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/compile.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/compile.py	Fri Dec  4 20:55:18 2009
@@ -237,7 +237,10 @@
         from pypy.jit.metainterp.pyjitpl import MetaInterp
         metainterp = MetaInterp(metainterp_sd)
         token = metainterp_sd.cpu.get_latest_force_token()
-        metainterp._already_allocated_resume_virtuals = self.fetch_data(token)
+        data = self.fetch_data(token)
+        if data is None:
+            data = []
+        metainterp._already_allocated_resume_virtuals = data
         self.counter = -2     # never compile
         return metainterp.handle_guard_failure(self)
 

Modified: pypy/trunk/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/pyjitpl.py	Fri Dec  4 20:55:18 2009
@@ -1790,6 +1790,11 @@
         virtualizable_boxes = resume.rebuild_from_resumedata(self, newboxes, resumedescr, expect_virtualizable)
         if expect_virtualizable:
             self.virtualizable_boxes = virtualizable_boxes
+            if self._already_allocated_resume_virtuals is not None:
+                # resuming from a ResumeGuardForcedDescr: load the new values
+                # currently stored on the virtualizable fields
+                self.load_fields_from_virtualizable()
+                return
             # just jumped away from assembler (case 4 in the comment in
             # virtualizable.py) into tracing (case 2); check that vable_rti
             # is and stays NULL.

Modified: pypy/trunk/pypy/jit/metainterp/test/test_virtualizable.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/test/test_virtualizable.py	(original)
+++ pypy/trunk/pypy/jit/metainterp/test/test_virtualizable.py	Fri Dec  4 20:55:18 2009
@@ -871,6 +871,42 @@
         res = self.meta_interp(main, [123], policy=StopAtXPolicy(g))
         assert res == main(123)
 
+    def test_external_write_sometimes(self):
+        jitdriver = JitDriver(greens = [], reds = ['frame'],
+                              virtualizables = ['frame'])
+        
+        class Frame(object):
+            _virtualizable2_ = ['x', 'y']
+        class SomewhereElse:
+            pass
+        somewhere_else = SomewhereElse()
+
+        def g():
+            somewhere_else.counter += 1
+            if somewhere_else.counter == 70:
+                debug_print(lltype.Void, '-+-+-+-+- external write: 7000')
+                somewhere_else.top_frame.y = 7000
+                result = 2
+            else:
+                result = 1
+            return result
+
+        def f(n):
+            frame = Frame()
+            frame.x = n
+            frame.y = 10
+            somewhere_else.counter = 0
+            somewhere_else.top_frame = frame
+            while frame.x > 0:
+                jitdriver.can_enter_jit(frame=frame)
+                jitdriver.jit_merge_point(frame=frame)
+                frame.x -= g()
+                frame.y += 1
+            return frame.y
+
+        res = self.meta_interp(f, [123], policy=StopAtXPolicy(g))
+        assert res == f(123)
+
     def test_promote_index_in_virtualizable_list(self):
         jitdriver = JitDriver(greens = [], reds = ['frame', 'n'],
                               virtualizables = ['frame'])



More information about the Pypy-commit mailing list