From bddb908118b57a154a404363cfa490efe6c4dee5 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Wed, 28 Nov 2018 20:38:01 +0900 Subject: [PATCH] py: Fix errors are suppressed in generator comprehensions Sequence.Iterate does not handle exceptions. Iterate() should return error except StopIteration. --- py/sequence.go | 7 +++++-- vm/tests/generators.py | 8 ++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/py/sequence.go b/py/sequence.go index f78932ba..53e78295 100644 --- a/py/sequence.go +++ b/py/sequence.go @@ -93,10 +93,13 @@ func Iterate(obj Object, fn func(Object) bool) error { return err } for { - item, finished := Next(iterator) - if finished != nil { + item, err := Next(iterator) + if err == StopIteration { break } + if err != nil { + return err + } if fn(item) { break } diff --git a/vm/tests/generators.py b/vm/tests/generators.py index 6fd4210d..44837bee 100644 --- a/vm/tests/generators.py +++ b/vm/tests/generators.py @@ -25,6 +25,14 @@ def g2(): yield i assert tuple(g2()) == (0,1,2,3,4) +doc="generator 3" +ok = False +try: + list(ax for x in range(10)) +except NameError: + ok = True +assert ok, "NameError not raised" + doc="yield from" def g3(): yield "potato"