Author: Ronan Lamy <[email protected]>
Branch: desc-specialize
Changeset: r82490:67633b1da4fa
Date: 2016-02-24 19:00 +0100
http://bitbucket.org/pypy/pypy/changeset/67633b1da4fa/
Log: Create special FunctionDesc subclass for @specialize.memo()
functions
diff --git a/rpython/annotator/bookkeeper.py b/rpython/annotator/bookkeeper.py
--- a/rpython/annotator/bookkeeper.py
+++ b/rpython/annotator/bookkeeper.py
@@ -22,6 +22,7 @@
from rpython.annotator import description
from rpython.annotator.signature import annotationoftype
from rpython.annotator.argument import simple_args
+from rpython.annotator.specialize import memo
from rpython.rlib.objectmodel import r_dict, r_ordereddict, Symbolic
from rpython.tool.algo.unionfind import UnionFind
from rpython.rtyper import extregistry
@@ -417,6 +418,8 @@
# (if any), according to the current policy
tag = getattr(pyfunc, '_annspecialcase_', None)
specializer = self.annotator.policy.get_specializer(tag)
+ if specializer is memo:
+ return description.MemoDesc(self, pyfunc, name, signature,
defaults, specializer)
return description.FunctionDesc(self, pyfunc, name, signature,
defaults, specializer)
def getfrozen(self, pyobj):
diff --git a/rpython/annotator/description.py b/rpython/annotator/description.py
--- a/rpython/annotator/description.py
+++ b/rpython/annotator/description.py
@@ -395,6 +395,15 @@
return s_sigs
+class MemoDesc(FunctionDesc):
+ def pycall(self, whence, args, s_previous_result, op=None):
+ inputcells = self.parse_arguments(args)
+ s_result = self.specialize(inputcells, op)
+ assert not isinstance(s_result, FunctionGraph)
+ assert s_result.contains(s_previous_result)
+ return s_result
+
+
class MethodDesc(Desc):
knowntype = types.MethodType
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit