[pypy-svn] r69768 - pypy/branch/virtual-forcing/pypy/jit/backend/llgraph
arigo at codespeak.net
arigo at codespeak.net
Mon Nov 30 15:10:46 CET 2009
Author: arigo
Date: Mon Nov 30 15:10:46 2009
New Revision: 69768
Modified:
pypy/branch/virtual-forcing/pypy/jit/backend/llgraph/runner.py
Log:
Modernize the descr construction and caching.
Modified: pypy/branch/virtual-forcing/pypy/jit/backend/llgraph/runner.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/backend/llgraph/runner.py (original)
+++ pypy/branch/virtual-forcing/pypy/jit/backend/llgraph/runner.py Mon Nov 30 15:10:46 2009
@@ -21,35 +21,16 @@
class Descr(history.AbstractDescr):
- name = None
- ofs = -1
- typeinfo = '?'
-
- def __init__(self, ofs, typeinfo='?', extrainfo=None):
+
+ def __init__(self, ofs, typeinfo, extrainfo=None, name=None):
self.ofs = ofs
self.typeinfo = typeinfo
self.extrainfo = extrainfo
- # Note: this class has a custom __eq__, so don't forget
- # to fix it if you add more fields.
+ self.name = name
def get_extra_info(self):
return self.extrainfo
- def __hash__(self):
- return hash((self.ofs, self.typeinfo, self.extrainfo))
-
- def __eq__(self, other):
- if not isinstance(other, Descr):
- return NotImplemented
- return (self.ofs == other.ofs and self.typeinfo == other.typeinfo
- and self.extrainfo == other.extrainfo)
-
- def __ne__(self, other):
- if not isinstance(other, Descr):
- return NotImplemented
- return (self.ofs != other.ofs or self.typeinfo != other.typeinfo
- or self.extrainfo != other.extrainfo)
-
def sort_key(self):
return self.ofs
@@ -80,9 +61,12 @@
raise TypeError("cannot use comparison on Descrs")
def __repr__(self):
+ args = [repr(self.ofs), repr(self.typeinfo)]
if self.name is not None:
- return '<Descr %r, %r, %r>' % (self.ofs, self.typeinfo, self.name)
- return '<Descr %r, %r>' % (self.ofs, self.typeinfo)
+ args.append(repr(self.name))
+ if self.extrainfo is not None:
+ args.append('E')
+ return '<Descr %r>' % (', '.join(args),)
history.TreeLoop._compiled_version = lltype.nullptr(llimpl.COMPILEDLOOP.TO)
@@ -104,11 +88,21 @@
llimpl._stats = self.stats
llimpl._llinterp = LLInterpreter(self.rtyper)
self._future_values = []
+ self._descrs = {}
def _freeze_(self):
assert self.translate_support_code
return False
+ def getdescr(self, ofs, typeinfo='?', extrainfo=None, name=None):
+ key = (ofs, typeinfo, extrainfo, name)
+ try:
+ return self._descrs[key]
+ except KeyError:
+ descr = Descr(ofs, typeinfo, extrainfo, name)
+ self._descrs[key] = descr
+ return descr
+
def set_class_sizes(self, class_sizes):
self.class_sizes = class_sizes
for vtable, size in class_sizes.items():
@@ -261,16 +255,9 @@
return (self.cast_adr_to_int(llimpl.get_zero_division_error()),
llimpl.get_zero_division_error_value())
- @staticmethod
- def sizeof(S):
+ def sizeof(self, S):
assert not isinstance(S, lltype.Ptr)
- return Descr(symbolic.get_size(S))
-
- @staticmethod
- def numof(S):
- return 4
-
- ##addresssuffix = '4'
+ return self.getdescr(symbolic.get_size(S))
def cast_adr_to_int(self, adr):
return llimpl.cast_adr_to_int(self.memo_cast, adr)
@@ -291,18 +278,14 @@
BaseCPU.__init__(self, *args, **kwds)
self.fielddescrof_vtable = self.fielddescrof(rclass.OBJECT, 'typeptr')
- @staticmethod
- def fielddescrof(S, fieldname):
+ def fielddescrof(self, S, fieldname):
ofs, size = symbolic.get_field_token(S, fieldname)
token = history.getkind(getattr(S, fieldname))
- res = Descr(ofs, token[0])
- res.name = fieldname
- return res
+ return self.getdescr(ofs, token[0], name=fieldname)
- @staticmethod
- def calldescrof(FUNC, ARGS, RESULT, extrainfo=None):
+ def calldescrof(self, FUNC, ARGS, RESULT, extrainfo=None):
token = history.getkind(RESULT)
- return Descr(0, token[0], extrainfo=extrainfo)
+ return self.getdescr(0, token[0], extrainfo=extrainfo)
def get_exception(self):
return self.cast_adr_to_int(llimpl.get_exception())
@@ -310,13 +293,12 @@
def get_exc_value(self):
return llimpl.get_exc_value()
- @staticmethod
- def arraydescrof(A):
+ def arraydescrof(self, A):
assert isinstance(A, lltype.GcArray)
assert A.OF != lltype.Void
size = symbolic.get_size(A)
token = history.getkind(A.OF)
- return Descr(size, token[0])
+ return self.getdescr(size, token[0])
# ---------- the backend-dependent operations ----------
More information about the Pypy-commit
mailing list