[pypy-commit] pypy default: signatures: better check on return types (but still incomplete)

Greg Price noreply at buildbot.pypy.org
Wed Dec 19 08:36:30 CET 2012


Author: Greg Price <price at mit.edu>
Branch: 
Changeset: r59503:8b134bcb2276
Date: 2012-12-18 23:36 -0800
http://bitbucket.org/pypy/pypy/changeset/8b134bcb2276/

Log:	signatures: better check on return types (but still incomplete)

	The xfail test demonstrates a known limitation of this error check.

diff --git a/pypy/annotation/signature.py b/pypy/annotation/signature.py
--- a/pypy/annotation/signature.py
+++ b/pypy/annotation/signature.py
@@ -151,4 +151,9 @@
     actualtypes[:] = params_s
 
 def enforce_signature_return(funcdesc, sigtype, inferredtype):
-    return finish_type(sigtype, funcdesc.bookkeeper, funcdesc.pyobj)
+    s_sigret = finish_type(sigtype, funcdesc.bookkeeper, funcdesc.pyobj)
+    if not s_sigret.contains(inferredtype):
+        raise Exception("%r return value:\n"
+                        "expected %s,\n"
+                        "     got %s" % (funcdesc, s_sigret, inferredtype))
+    return s_sigret
diff --git a/pypy/rlib/test/test_signature.py b/pypy/rlib/test/test_signature.py
--- a/pypy/rlib/test/test_signature.py
+++ b/pypy/rlib/test/test_signature.py
@@ -73,11 +73,26 @@
     @signature(returns=types.int())
     def int_not_char():
         return 'a'
+
     @check_annotator_fails
     @signature(types.str(), returns=types.int())
     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():
+        return None
+
 
 def test_none():
     @signature(returns=types.none())


More information about the pypy-commit mailing list