Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
lib/write: more regular usage protocol for ?buf parameters
The handling of `?buf` parameters today makes little sense: - `to_string` and all `stream_*` functions clear the buffer before using it (so: they guarantee that they work in the same way no matter what the input state of the buffer is, and they make no guarantees on its output state) - but `to_channel` and `to_output` make weird claims about it in the documentation, that don't make sense to me, and appear to *not* clear the buffer and in fact include, in their output, the content of the buffer as it is passed. I believe that the reason for this difference comes from the previous codebase using Biniou, that was replaced by Buffer in 9310500 The change left the usage of ?buf in `to_channel` and `to_output` rather incoherent (and I think broke the documentation somewhat), due to different usage properties of Biniou_outbuf, who "owns" the underlying output channel and implements its own buffering, and Buffer, which is not related to an output channel: the previous API may have made sense for Binio, but it does not anymore. What's not completely clear to me is whether some code in the wild could rely on the previous, nonsensical behaviour. This may happen if the code was written with Biniou in the past, and converted to use Buffer in the same systematic (and slightly wrong) way as Yojson itself. (Note: there are two independent questions: (1) whether the buffer is cleared on entry, and (2) whether the buffer is cleared on exit. Currently for `to_channel` and `to_output` neither is done, and at least for (2) this seems in direct contradiction with what the documentation says -- at least with the natural interpretation of "buf is flushed" as "the content is send to the output channel, and the buffer is cleared". So the lack of (2) is clearly a bug, and the lack of (1) might not be.)
- Loading branch information