]> Cypherpunks repositories - gostls13.git/commit
iter: don't iterate if stop is called before next on Pull
authorMichael Anthony Knyszek <mknyszek@google.com>
Mon, 3 Jun 2024 21:00:51 +0000 (21:00 +0000)
committerMichael Knyszek <mknyszek@google.com>
Fri, 7 Jun 2024 19:09:28 +0000 (19:09 +0000)
commit1634fde4f918223614fd8893db8dd7ca4ebcda01
tree75eb187216f3b5f8f93ca20e5e24d3b1624ce394
parent9d2aeae72d34880510c7221f35ab61171cec1ffd
iter: don't iterate if stop is called before next on Pull

Consider the following code snippet:

    next, stop := iter.Pull(seq)
    stop()

Today, seq will iterate exactly once before it notices that its
iteration is invalid to begin with. This effect is observable in a
variety of ways. For example, if the iterator panics, since that panic
must propagate to the caller of stop. But if the iterator is stateful in
anyway, then it may update some state.

This is somewhat unexpected and because it's observable, can be depended
upon. This behavior does not align well with other possible
implementations of Pull, like CPS performed by the compiler. It's also
just odd to let even one iteration happen, precisely because of
unexpected state modification.

Fix this by not iterating at all of the done flag is set before entering
the iterator.

For #67712.

Change-Id: I18162e29df45a2e8968f68379450d92e1de47c4d
Reviewed-on: https://go-review.googlesource.com/c/go/+/590075
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Austin Clements <austin@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
src/iter/iter.go
src/iter/pull_test.go