Author: Ronan Lamy <ronan.l...@gmail.com>
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
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to