mirror of https://github.com/golang/go.git
Currently it's possible for next and yield to be called out of sequence, which will result in surprising behavior due to the implementation. Because we blindly coroswitch between goroutines, calling next from the iterator, or yield from the calling goroutine, will actually switch back to the other goroutine. In the case of next, we'll switch back with a stale (or zero) value: the results are basically garbage. In the case of yield, we're switching back to the *same* goroutine, which will crash in the runtime. This change adds a single bool to ensure that next and yield are always called in sequence. That is, every next must always be paired with a yield before continuing. This restricts what can be done with Pull, but prevents observing some truly strange behaviors that the user of Pull likely did not intend, or can't easily predict. Change-Id: I6f72461f49c5635d6914bc5b968ad6970cd3c734 Reviewed-on: https://go-review.googlesource.com/c/go/+/583676 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: David Chase <drchase@google.com> Auto-Submit: Michael Knyszek <mknyszek@google.com> Reviewed-by: Russ Cox <rsc@golang.org> |
||
|---|---|---|
| .. | ||
| iter.go | ||
| pull_test.go | ||