[pypy-commit] pypy default: Give an _attrs_ in the Resume class, so that if the corresponding
arigo
pypy.commits at gmail.com
Wed Jun 8 10:16:39 EDT 2016
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r85028:57689fe200ad
Date: 2016-06-08 16:17 +0200
http://bitbucket.org/pypy/pypy/changeset/57689fe200ad/
Log: Give an _attrs_ in the Resume class, so that if the corresponding
"yield" point is actually never reached, the Resume instance is
never created, but the "getattr" operations don't make blocked
blocks
diff --git a/rpython/annotator/test/test_annrpython.py b/rpython/annotator/test/test_annrpython.py
--- a/rpython/annotator/test/test_annrpython.py
+++ b/rpython/annotator/test/test_annrpython.py
@@ -4610,6 +4610,19 @@
a.build_types(fd, [])
py.test.raises(AnnotatorError, a.build_types, fb, [])
+ def test_annotate_generator_with_unreachable_yields(self):
+ def f(n):
+ if n < 0:
+ yield 42
+ yield n
+ yield n
+ def main(n):
+ for x in f(abs(n)):
+ pass
+ #
+ a = self.RPythonAnnotator()
+ a.build_types(main, [int])
+
def g(n):
return [0, 1, 2, n]
diff --git a/rpython/flowspace/generator.py b/rpython/flowspace/generator.py
--- a/rpython/flowspace/generator.py
+++ b/rpython/flowspace/generator.py
@@ -132,13 +132,14 @@
del block.operations[index]
newlink = split_block(block, index)
newblock = newlink.target
+ varnames = get_variable_names(newlink.args)
#
class Resume(AbstractPosition):
_immutable_ = True
+ _attrs_ = varnames
block = newblock
Resume.__name__ = 'Resume%d' % len(mappings)
mappings.append(Resume)
- varnames = get_variable_names(newlink.args)
#
_insert_reads(newblock, varnames)
#
More information about the pypy-commit
mailing list