[pypy-commit] pypy reflowing: Reimplement enforcing of signature return values using add_notification()

rlamy pypy.commits at gmail.com
Fri Nov 25 08:31:09 EST 2016


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: reflowing
Changeset: r88667:0d45833ec144
Date: 2016-11-25 13:29 +0000
http://bitbucket.org/pypy/pypy/changeset/0d45833ec144/

Log:	Reimplement enforcing of signature return values using
	add_notification()

diff --git a/rpython/annotator/description.py b/rpython/annotator/description.py
--- a/rpython/annotator/description.py
+++ b/rpython/annotator/description.py
@@ -1,7 +1,8 @@
 from __future__ import absolute_import
 import types
 from rpython.annotator.signature import (
-    enforce_signature_args, enforce_signature_return, finish_type)
+    enforce_signature_args, enforce_signature_return, finish_type,
+    SignatureReturn)
 from rpython.flowspace.model import FunctionGraph
 from rpython.annotator.argument import rawshape, ArgErr, simple_args
 from rpython.tool.sourcetools import valid_identifier
@@ -245,6 +246,14 @@
                 postfix = valid_identifier(nameof(key))
                 alt_name = "%s__%s" % (self.name, postfix)
             graph = self.buildgraph(alt_name, builder)
+            signature = getattr(self.pyobj, '_signature_', None)
+            if signature:
+                s_sig = finish_type(signature[1], self.bookkeeper, self.pyobj)
+                if s_sig:
+                    self.bookkeeper.annotator.add_notification(
+                        graph.getreturnvar(), SignatureReturn(self, s_sig))
+                    self.bookkeeper.annotator.addpendingblock(
+                        graph, graph.returnblock, [s_sig])
             self._cache[key] = graph
             return graph
 
@@ -301,13 +310,6 @@
         result = graph.getreturnvar().annotation
         if result is None:
             result = s_ImpossibleValue
-        signature = getattr(self.pyobj, '_signature_', None)
-        if signature:
-            sigresult = enforce_signature_return(self, signature[1], result)
-            if sigresult is not None:
-                annotator.addpendingblock(
-                    graph, graph.returnblock, [sigresult])
-                result = sigresult
         return result
 
     def normalize_args(self, inputs_s):
@@ -345,12 +347,6 @@
         # recreate the args object because inputcells may have been changed
         new_args = args.unmatch_signature(self.signature, inputcells)
         inputcells = self.parse_arguments(new_args, graph)
-        signature = getattr(self.pyobj, '_signature_', None)
-        if signature:
-            s_result = finish_type(signature[1], self.bookkeeper, self.pyobj)
-            if s_result is not None:
-                self.bookkeeper.annotator.addpendingblock(
-                    graph, graph.returnblock, [s_result])
         return graph, inputcells
 
     def bind_under(self, classdef, name):
diff --git a/rpython/rlib/test/test_signature.py b/rpython/rlib/test/test_signature.py
--- a/rpython/rlib/test/test_signature.py
+++ b/rpython/rlib/test/test_signature.py
@@ -83,15 +83,6 @@
     def str_to_int(s):
         return s
 
-    @signature(returns=types.str())
-    def str_not_None():
-        return None
-    @check_annotator_fails
-    def caller_of_str_not_None():
-        return str_not_None()
-
- at py.test.mark.xfail
-def test_return_errors_xfail():
     @check_annotator_fails
     @signature(returns=types.str())
     def str_not_None():
@@ -268,11 +259,10 @@
     sig = getsig(g)
     assert sig == [model.SomeFloat(), model.SomeFloat()]
 
+    @check_annotator_fails
     @signature(types.str(), returns=types.int())
     def cannot_add_string(x):
         return f(x, 2)
-    exc = py.test.raises(model.AnnotatorError, annotate_at, cannot_add_string).value
-    assert 'Blocked block' in str(exc)
 
 def test_return_any():
     @signature(types.int(), returns=types.any())


More information about the pypy-commit mailing list