[pypy-svn] r53239 - in pypy/branch/jit-hotpath/pypy/jit: codegen codegen/llgraph rainbow/test timeshifter
antocuni at codespeak.net
antocuni at codespeak.net
Tue Apr 1 23:51:56 CEST 2008
Author: antocuni
Date: Tue Apr 1 23:51:55 2008
New Revision: 53239
Modified:
pypy/branch/jit-hotpath/pypy/jit/codegen/llgraph/rgenop.py
pypy/branch/jit-hotpath/pypy/jit/codegen/model.py
pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_vlist.py
pypy/branch/jit-hotpath/pypy/jit/timeshifter/vlist.py
Log:
implement forcing for virtual lists on ootype.
test_force passes
Modified: pypy/branch/jit-hotpath/pypy/jit/codegen/llgraph/rgenop.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/codegen/llgraph/rgenop.py (original)
+++ pypy/branch/jit-hotpath/pypy/jit/codegen/llgraph/rgenop.py Tue Apr 1 23:51:55 2008
@@ -146,10 +146,8 @@
gv_Bool.v))
return gv_res, gv_exc
- def genop_call(self, (ARGS_gv, gv_RESULT, _), gv_callable, args_gv):
- ll_assert(self.rgenop.currently_writing is self,
- "genop_call: bad currently_writing")
- vars_gv = [gv_callable]
+ def _cast_args_gv(self, ARGS_gv, args_gv):
+ vars_gv = []
j = 0
for i in range(len(ARGS_gv)):
if ARGS_gv[i] is gv_Void:
@@ -158,6 +156,13 @@
gv_arg = LLVar(llimpl.cast(self.b, ARGS_gv[i].v, args_gv[j].v))
j += 1
vars_gv.append(gv_arg)
+ return vars_gv
+
+ def genop_call(self, (ARGS_gv, gv_RESULT, _), gv_callable, args_gv):
+ ll_assert(self.rgenop.currently_writing is self,
+ "genop_call: bad currently_writing")
+ vars_gv = [gv_callable]
+ vars_gv += self._cast_args_gv(ARGS_gv, args_gv)
if gv_callable.is_const:
v = llimpl.genop(self.b, 'direct_call', vars_gv, gv_RESULT.v)
else:
@@ -165,6 +170,14 @@
v = llimpl.genop(self.b, 'indirect_call', vars_gv, gv_RESULT.v)
return LLVar(v)
+ def genop_oosend(self, (gv_methname, (ARGS_gv, gv_RESULT, _)), gv_self, args_gv):
+ ll_assert(self.rgenop.currently_writing is self,
+ "genop_oosend: bad currently_writing")
+ vars_gv = [gv_methname, gv_self]
+ vars_gv += self._cast_args_gv(ARGS_gv, args_gv)
+ v = llimpl.genop(self.b, 'oosend', vars_gv, gv_RESULT.v)
+ return LLVar(v)
+
def genop_getfield(self, (gv_name, gv_PTRTYPE, gv_FIELDTYPE), gv_ptr):
ll_assert(self.rgenop.currently_writing is self,
"genop_getfield: bad currently_writing")
@@ -459,6 +472,14 @@
gv_TYPE(FUNCTYPE.RESULT),
gv_TYPE(FUNCTYPE))
+ @staticmethod
+ @specialize.memo()
+ def methToken(TYPE, methname):
+ _, meth = TYPE._lookup(methname)
+ METH = ootype.typeOf(meth)
+ gv_methname = LLConst(llimpl.constFieldName(methname))
+ return (gv_methname, RGenOp.sigToken(METH))
+
constPrebuiltGlobal = genconst
@staticmethod
Modified: pypy/branch/jit-hotpath/pypy/jit/codegen/model.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/codegen/model.py (original)
+++ pypy/branch/jit-hotpath/pypy/jit/codegen/model.py Tue Apr 1 23:51:55 2008
@@ -349,6 +349,12 @@
# raise NotImplementedError
#@staticmethod
+ #@specialize.memo()
+ #def methToken(TYPE, methname):
+ # """Return a token describing the method methname of type TYPE."""
+ # raise NotImplementedError
+
+ #@staticmethod
#@specialize.arg(0)
#def read_frame_var(T, base, info, index):
# """Read from the stack frame of a caller. The 'base' is the
Modified: pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_vlist.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_vlist.py (original)
+++ pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_vlist.py Tue Apr 1 23:51:55 2008
@@ -195,7 +195,6 @@
def _skip(self):
py.test.skip('in progress')
- test_force = _skip
test_oop_vlist = _skip
test_alloc_and_set = _skip
test_lists_deepfreeze = _skip
Modified: pypy/branch/jit-hotpath/pypy/jit/timeshifter/vlist.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/timeshifter/vlist.py (original)
+++ pypy/branch/jit-hotpath/pypy/jit/timeshifter/vlist.py Tue Apr 1 23:51:55 2008
@@ -115,6 +115,16 @@
self.devirtualize = make, fill_into
+ def gen_newlist(self, builder, args_gv):
+ return builder.genop_call(self.tok_ll_newlist,
+ self.gv_ll_newlist,
+ args_gv)
+
+ def gen_setitem_fast(self, builder, args_gv):
+ return builder.genop_call(self.tok_ll_setitem_fast,
+ self.gv_ll_setitem_fast,
+ args_gv)
+
class OOTypeListTypeDesc(AbstractListTypeDesc):
@@ -123,11 +133,24 @@
PtrRedBox = rvalue.InstanceRedBox
def _setup(self, RGenOp, rtyper, LIST):
- pass
+ self.alloctoken = RGenOp.allocToken(LIST)
+ self.tok_ll_resize = RGenOp.methToken(LIST, '_ll_resize')
+ self.tok_ll_setitem_fast = RGenOp.methToken(LIST,
+ 'll_setitem_fast')
def _define_devirtualize(self):
pass # XXX
+ def gen_newlist(self, builder, args_gv):
+ gv_lst = builder.genop_new(self.alloctoken)
+ builder.genop_oosend(self.tok_ll_resize, gv_lst, args_gv)
+ return gv_lst
+
+ def gen_setitem_fast(self, builder, args_gv):
+ gv_lst = args_gv.pop(0)
+ return builder.genop_oosend(self.tok_ll_setitem_fast,
+ gv_lst, args_gv)
+
class FrozenVirtualList(FrozenContainer):
def __init__(self, typedesc):
@@ -211,17 +234,13 @@
debug_print(lltype.Void, "FORCE LIST (%d items)" % (len(boxes),))
args_gv = [builder.rgenop.genconst(len(boxes))]
- gv_list = builder.genop_call(typedesc.tok_ll_newlist,
- typedesc.gv_ll_newlist,
- args_gv)
+ gv_list = typedesc.gen_newlist(builder, args_gv)
self.setforced(gv_list)
for i in range(len(boxes)):
gv_item = boxes[i].getgenvar(jitstate)
args_gv = [gv_list, builder.rgenop.genconst(i), gv_item]
- builder.genop_call(typedesc.tok_ll_setitem_fast,
- typedesc.gv_ll_setitem_fast,
- args_gv)
+ typedesc.gen_setitem_fast(builder, args_gv)
def freeze(self, memo):
contmemo = memo.containers
More information about the Pypy-commit
mailing list