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