@@ -22842,7 +22842,7 @@ pm_parse(pm_parser_t *parser) {
2284222842 * otherwise return true.
2284322843 */
2284422844static bool
22845- pm_parse_stream_read(pm_buffer_t *buffer, void *stream, pm_parse_stream_fgets_t *stream_fgets) {
22845+ pm_parse_stream_read(pm_buffer_t *buffer, void *stream, pm_parse_stream_fgets_t *stream_fgets, pm_parse_stream_feof_t *stream_feof ) {
2284622846#define LINE_SIZE 4096
2284722847 char line[LINE_SIZE];
2284822848
@@ -22878,6 +22878,12 @@ pm_parse_stream_read(pm_buffer_t *buffer, void *stream, pm_parse_stream_fgets_t
2287822878 if (strncmp(line, "__END__\r\n", 9) == 0) return false;
2287922879 break;
2288022880 }
22881+
22882+ // All data should be read via gets. If the string returned by gets
22883+ // _doesn't_ end with a newline, then we assume we hit EOF condition.
22884+ if (stream_feof(stream)) {
22885+ break;
22886+ }
2288122887 }
2288222888
2288322889 return true;
@@ -22913,16 +22919,17 @@ pm_parse_stream_unterminated_heredoc_p(pm_parser_t *parser) {
2291322919 * can stream stdin in to Ruby so we need to support a streaming API.
2291422920 */
2291522921PRISM_EXPORTED_FUNCTION pm_node_t *
22916- pm_parse_stream(pm_parser_t *parser, pm_buffer_t *buffer, void *stream, pm_parse_stream_fgets_t *stream_fgets, const pm_options_t *options) {
22922+ pm_parse_stream(pm_parser_t *parser, pm_buffer_t *buffer, void *stream, pm_parse_stream_fgets_t *stream_fgets, pm_parse_stream_feof_t *stream_feof, const pm_options_t *options) {
2291722923 pm_buffer_init(buffer);
2291822924
22919- bool eof = pm_parse_stream_read(buffer, stream, stream_fgets);
22925+ bool eof = pm_parse_stream_read(buffer, stream, stream_fgets, stream_feof);
22926+
2292022927 pm_parser_init(parser, (const uint8_t *) pm_buffer_value(buffer), pm_buffer_length(buffer), options);
2292122928 pm_node_t *node = pm_parse(parser);
2292222929
2292322930 while (!eof && parser->error_list.size > 0 && (parser->lex_modes.index > 0 || pm_parse_stream_unterminated_heredoc_p(parser))) {
2292422931 pm_node_destroy(parser, node);
22925- eof = pm_parse_stream_read(buffer, stream, stream_fgets);
22932+ eof = pm_parse_stream_read(buffer, stream, stream_fgets, stream_feof );
2292622933
2292722934 pm_parser_free(parser);
2292822935 pm_parser_init(parser, (const uint8_t *) pm_buffer_value(buffer), pm_buffer_length(buffer), options);
@@ -23014,13 +23021,13 @@ pm_serialize_parse(pm_buffer_t *buffer, const uint8_t *source, size_t size, cons
2301423021 * given stream into to the given buffer.
2301523022 */
2301623023PRISM_EXPORTED_FUNCTION void
23017- pm_serialize_parse_stream(pm_buffer_t *buffer, void *stream, pm_parse_stream_fgets_t *stream_fgets, const char *data) {
23024+ pm_serialize_parse_stream(pm_buffer_t *buffer, void *stream, pm_parse_stream_fgets_t *stream_fgets, pm_parse_stream_feof_t *stream_feof, const char *data) {
2301823025 pm_parser_t parser;
2301923026 pm_options_t options = { 0 };
2302023027 pm_options_read(&options, data);
2302123028
2302223029 pm_buffer_t parser_buffer;
23023- pm_node_t *node = pm_parse_stream(&parser, &parser_buffer, stream, stream_fgets, &options);
23030+ pm_node_t *node = pm_parse_stream(&parser, &parser_buffer, stream, stream_fgets, stream_feof, &options);
2302423031 pm_serialize_header(buffer);
2302523032 pm_serialize_content(&parser, node, buffer);
2302623033 pm_buffer_append_byte(buffer, '\0');
0 commit comments