Author: Maciej Fijalkowski <[email protected]>
Branch: vref-copy
Changeset: r56813:6112dd6a9ff6
Date: 2012-08-22 22:36 +0200
http://bitbucket.org/pypy/pypy/changeset/6112dd6a9ff6/
Log: slow progress
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
@@ -2,7 +2,7 @@
from pypy.rpython.lltypesystem import lltype
from pypy.rpython.ootypesystem import ootype
from pypy.objspace.flow.model import Constant, Variable
-from pypy.rlib.objectmodel import we_are_translated
+from pypy.rlib.objectmodel import we_are_translated, specialize
from pypy.rlib.debug import debug_start, debug_stop, debug_print
from pypy.rlib import rstack
from pypy.rlib.jit import JitDebugInfo, Counters
@@ -638,6 +638,12 @@
self.copy_all_attributes_into(res)
return res
[email protected](2)
+def read_field_from_resume(cpu, token, fieldname):
+ faildescr = cpu.force(token)
+ assert isinstance(faildescr, ResumeGuardForcedDescr)
+ return faildescr.handle_async_field_read(token, fieldname)
+
class ResumeGuardForcedDescr(ResumeGuardDescr):
def __init__(self, metainterp_sd, jitdriver_sd):
@@ -686,6 +692,13 @@
# future failure of the GUARD_NOT_FORCED
self.save_data(force_token, all_virtuals)
+ @specialize.arg(2)
+ def handle_async_field_read(self, force_token, fieldname):
+ from pypy.jit.metainterp.resume import read_field_from_resumedata
+ metainterp_sd = self.metainterp_sd
+ ginfo = self.jitdriver_sd.greenfield_info
+ return read_field_from_resumedata(metainterp_sd, self, ginfo)
+
def save_data(self, key, value):
globaldata = self.metainterp_sd.globaldata
if we_are_translated():
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
@@ -793,6 +793,9 @@
resumereader.done()
return resumereader.liveboxes, virtualizable_boxes, virtualref_boxes
+def read_field_from_resumedata(metainterp, storage, greenfield_info):
+ xxx
+
class ResumeDataBoxReader(AbstractResumeDataReader):
unique_id = lambda: None
diff --git a/pypy/jit/metainterp/virtualref.py
b/pypy/jit/metainterp/virtualref.py
--- a/pypy/jit/metainterp/virtualref.py
+++ b/pypy/jit/metainterp/virtualref.py
@@ -36,11 +36,19 @@
def _freeze_(self):
return True
- def _find_type_of_virtualref(self):
+ def _find_type_of_virtualref(self, graphs):
# XXX limitation is that we can only have one type
+ T = None
for graph in graphs:
for block in graph.iterblocks():
for op in block.operations:
+ if op.opname == 'jit_record_vref':
+ new_T = op.args[0].concretetype
+ if T is None:
+ T = new_T
+ else:
+ assert T == new_T, "Different vref types %s and
%s" % (T, new_T)
+ self._vref_T = T
def replace_force_virtual_with_call(self, graphs):
# similar to rvirtualizable2.replace_force_virtualizable_with_call().
@@ -48,7 +56,7 @@
c_is_virtual_ptr = None
c_getfield_ptrs = {} # fieldname -> function
force_virtual_count = 0
- self._find_type_of_virtualref()
+ self._find_type_of_virtualref(graphs)
for graph in graphs:
for block in graph.iterblocks():
for op in block.operations:
@@ -158,9 +166,19 @@
def get_vref_getfield_fnptr(self, name, RES_TP):
def read_virtual_field(inst):
if inst.typeptr != self.jit_virtual_ref_vtable:
- lltype.cast_ptr(
- xxx
- xxx
+ inst = lltype.cast_pointer(self._vref_T, inst)
+ return getattr(inst, 'inst_' + name)
+ vref = lltype.cast_pointer(lltype.Ptr(self.JIT_VIRTUAL_REF), inst)
+ token = vref.virtual_token
+ if token == self.TOKEN_TRACING_RESCALL or token == self.TOKEN_NONE:
+ # not a virtual at all, just pretending to be one
+ forced = lltype.cast_pointer(self._vref_T, vref.forced)
+ return getattr(forced, 'inst_' + name)
+ else:
+ assert not vref.forced
+ from pypy.jit.metainterp.compile import read_field_from_resume
+ return read_field_from_resume(self.cpu, token, name)
+
FUNC = lltype.FuncType([rclass.OBJECTPTR], RES_TP)
funcptr = self.warmrunnerdesc.helper_func(
lltype.Ptr(FUNC),
diff --git a/pypy/rpython/lltypesystem/opimpl.py
b/pypy/rpython/lltypesystem/opimpl.py
--- a/pypy/rpython/lltypesystem/opimpl.py
+++ b/pypy/rpython/lltypesystem/opimpl.py
@@ -570,6 +570,9 @@
def op_jit_record_known_class(x, y):
pass
+def op_jit_record_vref(x):
+ pass
+
def op_get_group_member(TYPE, grpptr, memberoffset):
from pypy.rpython.lltypesystem import llgroup
assert isinstance(memberoffset, llgroup.GroupMemberOffset)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit