[pypy-svn] r76317 - pypy/branch/fast-ctypes/pypy/rlib
getxsick at codespeak.net
getxsick at codespeak.net
Thu Jul 22 21:30:09 CEST 2010
Author: getxsick
Date: Thu Jul 22 21:30:06 2010
New Revision: 76317
Modified:
pypy/branch/fast-ctypes/pypy/rlib/rjitffi.py
Log:
add cache for calldescr
Modified: pypy/branch/fast-ctypes/pypy/rlib/rjitffi.py
==============================================================================
--- pypy/branch/fast-ctypes/pypy/rlib/rjitffi.py (original)
+++ pypy/branch/fast-ctypes/pypy/rlib/rjitffi.py Thu Jul 22 21:30:06 2010
@@ -81,7 +81,7 @@
else:
raise ValueError(self.res_type)
- calldescr = self.gen_calldescr() # XXX add cache
+ calldescr = self.gen_calldescr()
self.looptoken = LoopToken()
oplist = [ResOperation(rop.CALL, bargs, bres, descr=calldescr),
ResOperation(rop.FINISH, [bres], None,
@@ -92,7 +92,7 @@
cache[self.res_type] = { tuple(self.args_type) : self.looptoken }
self.setup_stack()
- def gen_calldescr(self):
+ def gen_calldescr(self, extrainfo=None):
arg_classes = ''.join(self.args_type)
gccache = self.cpu.gc_ll_descr
@@ -108,9 +108,15 @@
raise NotImplementedError('Unknown type of descr: %s'
% self.res_type)
- calldescr = cls(arg_classes)
- calldescr.create_call_stub(gccache.rtyper, self.res)
- return calldescr
+ key = (cls, arg_classes, extrainfo)
+ cache = gccache._cache_call
+ try:
+ return cache[key]
+ except KeyError:
+ calldescr = cls(arg_classes, extrainfo)
+ calldescr.create_call_stub(gccache.rtyper, self.res)
+ cache[key] = calldescr
+ return calldescr
def call(self, push_result):
res = self.cpu.execute_token(self.looptoken)
@@ -153,4 +159,3 @@
_clsname = 'SignedCallDescr'
def get_result_size(self, translate_support_code):
return symbolic.get_size(lltype.Signed, translate_support_code)
-
More information about the Pypy-commit
mailing list