Author: Maciej Fijalkowski <[email protected]>
Branch: continulet-jit-3
Changeset: r58313:8157ebf4f6e7
Date: 2012-10-21 15:15 +0200
http://bitbucket.org/pypy/pypy/changeset/8157ebf4f6e7/

Log:    fixes for blackhole

diff --git a/pypy/jit/backend/llgraph/runner.py 
b/pypy/jit/backend/llgraph/runner.py
--- a/pypy/jit/backend/llgraph/runner.py
+++ b/pypy/jit/backend/llgraph/runner.py
@@ -295,6 +295,11 @@
         assert not frame._forced
         frame._forced = True
 
+    def force_vable_if_necessary(self, vable):
+        if vable.jitframe:
+            self.force(vable.jitframe)
+            vable.jitframe = lltype.nulltpr(llmemory.GCREF.TO)
+
     def set_savedata_ref(self, frame, data):
         frame.saved_data = data
 
diff --git a/pypy/jit/metainterp/blackhole.py b/pypy/jit/metainterp/blackhole.py
--- a/pypy/jit/metainterp/blackhole.py
+++ b/pypy/jit/metainterp/blackhole.py
@@ -39,6 +39,9 @@
 
 # ____________________________________________________________
 
+def bh_force_vable(vinfo, vable):
+    vable = lltype.cast_opaque_ptr(vinfo.VTYPEPTR, vable)
+    vinfo.force_virtualizable_if_necessary(vable)
 
 class BlackholeInterpBuilder(object):
     verbose = True
@@ -147,6 +150,8 @@
                     value = self
                 elif argtype == 'cpu':
                     value = self.cpu
+                elif argtype == 'vinfo':
+                    value = self.vinfo
                 elif argtype == 'pc':
                     value = position
                 elif argtype == 'd' or argtype == 'j':
@@ -1165,34 +1170,47 @@
     def bhimpl_arraylen_gc(cpu, array, arraydescr):
         return cpu.bh_arraylen_gc(array, arraydescr)
 
-    @arguments("cpu", "r", "d", "d", "i", returns="i")
-    def bhimpl_getarrayitem_vable_i(cpu, vable, fielddescr, arraydescr, index):
+    @arguments("cpu", "vinfo", "r", "d", "d", "i", returns="i")
+    def bhimpl_getarrayitem_vable_i(cpu, vinfo, vable, fielddescr, arraydescr,
+                                    index):
+        bh_force_vable(vinfo, vable)
         array = cpu.bh_getfield_gc_r(vable, fielddescr)
         return cpu.bh_getarrayitem_gc_i(array, index, arraydescr)
-    @arguments("cpu", "r", "d", "d", "i", returns="r")
-    def bhimpl_getarrayitem_vable_r(cpu, vable, fielddescr, arraydescr, index):
+    @arguments("cpu", "vinfo", "r", "d", "d", "i", returns="r")
+    def bhimpl_getarrayitem_vable_r(cpu, vinfo, vable, fielddescr, arraydescr,
+                                    index):
+        bh_force_vable(vinfo, vable)
         array = cpu.bh_getfield_gc_r(vable, fielddescr)
         return cpu.bh_getarrayitem_gc_r(array, index, arraydescr)
     @arguments("cpu", "r", "d", "d", "i", returns="f")
-    def bhimpl_getarrayitem_vable_f(cpu, vable, fielddescr, arraydescr, index):
+    def bhimpl_getarrayitem_vable_f(cpu, vinfo, vable, fielddescr, arraydescr,
+                                    index):
+        bh_force_vable(vinfo, vable)
         array = cpu.bh_getfield_gc_r(vable, fielddescr)
         return cpu.bh_getarrayitem_gc_f(array, index, arraydescr)
 
-    @arguments("cpu", "r", "d", "d", "i", "i")
-    def bhimpl_setarrayitem_vable_i(cpu, vable, fdescr, adescr, index, newval):
+    @arguments("cpu", "vinfo", "r", "d", "d", "i", "i")
+    def bhimpl_setarrayitem_vable_i(cpu, vinfo, vable, fdescr, adescr, index,
+                                    newval):
+        bh_force_vable(vinfo, vable)
         array = cpu.bh_getfield_gc_r(vable, fdescr)
         cpu.bh_setarrayitem_gc_i(array, index, newval, adescr)
-    @arguments("cpu", "r", "d", "d", "i", "r")
-    def bhimpl_setarrayitem_vable_r(cpu, vable, fdescr, adescr, index, newval):
+    @arguments("cpu", "vinfo", "r", "d", "d", "i", "r")
+    def bhimpl_setarrayitem_vable_r(cpu, vinfo, vable, fdescr, adescr, index,
+                                    newval):
+        bh_force_vable(vinfo, vable)
         array = cpu.bh_getfield_gc_r(vable, fdescr)
         cpu.bh_setarrayitem_gc_r(array, index, newval, adescr)
-    @arguments("cpu", "r", "d", "d", "i", "f")
-    def bhimpl_setarrayitem_vable_f(cpu, vable, fdescr, adescr, index, newval):
+    @arguments("cpu", "vinfo", "r", "d", "d", "i", "f")
+    def bhimpl_setarrayitem_vable_f(cpu, vinfo, vable, fdescr, adescr, index,
+                                    newval):
+        bh_force_vable(vinfo, vable)
         array = cpu.bh_getfield_gc_r(vable, fdescr)
         cpu.bh_setarrayitem_gc_f(array, index, newval, adescr)
 
-    @arguments("cpu", "r", "d", "d", returns="i")
-    def bhimpl_arraylen_vable(cpu, vable, fdescr, adescr):
+    @arguments("cpu", "vinfo", "r", "d", "d", returns="i")
+    def bhimpl_arraylen_vable(cpu, vinfo, vable, fdescr, adescr):
+        bh_force_vable(vinfo, vable)
         array = cpu.bh_getfield_gc_r(vable, fdescr)
         return cpu.bh_arraylen_gc(array, adescr)
 
@@ -1230,9 +1248,18 @@
     bhimpl_getfield_gc_r_pure = bhimpl_getfield_gc_r
     bhimpl_getfield_gc_f_pure = bhimpl_getfield_gc_f
 
-    bhimpl_getfield_vable_i = bhimpl_getfield_gc_i
-    bhimpl_getfield_vable_r = bhimpl_getfield_gc_r
-    bhimpl_getfield_vable_f = bhimpl_getfield_gc_f
+    @arguments("cpu", "vinfo", "r", "d", returns="i")
+    def bhimpl_getfield_vable_i(cpu, vinfo, vable, fielddescr):
+        bh_force_vable(vinfo, vable)
+        return cpu.bh_getfield_gc_i(vable, fielddescr)
+    @arguments("cpu", "vinfo", "r", "d", returns="r")
+    def bhimpl_getfield_vable_r(cpu, vinfo, vable, fielddescr):
+        bh_force_vable(vinfo, vable)
+        return cpu.bh_getfield_gc_r(vable, fielddescr)
+    @arguments("cpu", "vinfo", "r", "d", returns="f")
+    def bhimpl_getfield_vable_f(cpu, vinfo, vable, fielddescr):
+        bh_force_vable(vinfo, vable)
+        return cpu.bh_getfield_gc_f(vable, fielddescr)
 
     bhimpl_getfield_gc_i_greenfield = bhimpl_getfield_gc_i
     bhimpl_getfield_gc_r_greenfield = bhimpl_getfield_gc_r
@@ -1262,9 +1289,18 @@
     def bhimpl_setfield_gc_f(cpu, struct, fielddescr, newvalue):
         cpu.bh_setfield_gc_f(struct, newvalue, fielddescr)
 
-    bhimpl_setfield_vable_i = bhimpl_setfield_gc_i
-    bhimpl_setfield_vable_r = bhimpl_setfield_gc_r
-    bhimpl_setfield_vable_f = bhimpl_setfield_gc_f
+    @arguments("cpu", "vinfo", "r", "d", "i")
+    def bhimpl_setfield_vable_i(cpu, vinfo, struct, fielddescr, newvalue):
+        bh_force_vable(vinfo, struct)
+        cpu.bh_setfield_gc_i(struct, newvalue, fielddescr)
+    @arguments("cpu", "vinfo", "r", "d", "r")
+    def bhimpl_setfield_vable_r(cpu, vinfo, struct, fielddescr, newvalue):
+        bh_force_vable(vinfo, struct)
+        cpu.bh_setfield_gc_r(struct, newvalue, fielddescr)
+    @arguments("cpu", "vinfo", "r", "d", "f")
+    def bhimpl_setfield_vable_f(cpu, vinfo, struct, fielddescr, newvalue):
+        bh_force_vable(vinfo, struct)
+        cpu.bh_setfield_gc_f(struct, newvalue, fielddescr)
 
     @arguments("cpu", "i", "d", "i")
     def bhimpl_setfield_raw_i(cpu, struct, fielddescr, newvalue):
diff --git a/pypy/jit/metainterp/compile.py b/pypy/jit/metainterp/compile.py
--- a/pypy/jit/metainterp/compile.py
+++ b/pypy/jit/metainterp/compile.py
@@ -628,7 +628,8 @@
         # an inconsistent state
         rstack._stack_criticalcode_start()
         try:
-            faildescr = cpu.force(jitframetoken)
+            cpu.force(jitframetoken)
+            faildescr = cpu.get_latest_descr(jitframetoken)
             assert isinstance(faildescr, ResumeGuardForcedDescr)
             faildescr.handle_async_forcing(jitframetoken)
         finally:
diff --git a/pypy/jit/metainterp/resume.py b/pypy/jit/metainterp/resume.py
--- a/pypy/jit/metainterp/resume.py
+++ b/pypy/jit/metainterp/resume.py
@@ -1082,6 +1082,7 @@
     frameinfo = storage.rd_frame_info_list
     while True:
         curbh = blackholeinterpbuilder.acquire_interp()
+        curbh.vinfo = jitdriver_sd.virtualizable_info
         curbh.nextblackholeinterp = nextbh
         nextbh = curbh
         frameinfo = frameinfo.prev
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
@@ -280,6 +280,7 @@
         def force_virtualizable_if_necessary(virtualizable):
             if virtualizable.jit_frame != jitframe.TOKEN_NONE:
                 self.force_now(virtualizable)
+        self.force_virtualizable_if_necessary = 
force_virtualizable_if_necessary
         force_virtualizable_if_necessary._always_inline_ = True
         #
         all_graphs = self.warmrunnerdesc.translator.graphs
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to