[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