From 25c3232a778e186dc8da57d4751f9cae7e15a812 Mon Sep 17 00:00:00 2001 From: lawnjelly Date: Mon, 12 Dec 2022 15:44:39 +0000 Subject: [PATCH] VariantParser make readahead optional It turns out some areas are independently moving / reading filepointers outside of the VariantParser, which can cause the readahead caching to get out of sync. This PR makes the VariantParser readahead to be optional to allow for these use cases. --- core/variant/variant_parser.cpp | 17 ++++++++++++++++- core/variant/variant_parser.h | 16 +++++++++++++--- scene/resources/resource_format_text.cpp | 3 ++- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/core/variant/variant_parser.cpp b/core/variant/variant_parser.cpp index 96cc6dd73..df990f2f1 100644 --- a/core/variant/variant_parser.cpp +++ b/core/variant/variant_parser.cpp @@ -42,7 +42,7 @@ CharType VariantParser::Stream::get_char() { } // attempt to readahead - readahead_filled = _read_buffer(readahead_buffer, READAHEAD_SIZE); + readahead_filled = _read_buffer(readahead_buffer, readahead_enabled ? READAHEAD_SIZE : 1); if (readahead_filled) { readahead_pointer = 0; } else { @@ -54,6 +54,13 @@ CharType VariantParser::Stream::get_char() { return get_char(); } +bool VariantParser::Stream::is_eof() const { + if (readahead_enabled) { + return eof; + } + return _is_eof(); +} + uint32_t VariantParser::StreamFile::_read_buffer(CharType *p_buffer, uint32_t p_num_chars) { // The buffer is assumed to include at least one character (for null terminator) ERR_FAIL_COND_V(!p_num_chars, 0); @@ -75,6 +82,10 @@ bool VariantParser::StreamFile::is_utf8() const { return true; } +bool VariantParser::StreamFile::_is_eof() const { + return f->eof_reached(); +} + uint32_t VariantParser::StreamString::_read_buffer(CharType *p_buffer, uint32_t p_num_chars) { // The buffer is assumed to include at least one character (for null terminator) ERR_FAIL_COND_V(!p_num_chars, 0); @@ -107,6 +118,10 @@ bool VariantParser::StreamString::is_utf8() const { return false; } +bool VariantParser::StreamString::_is_eof() const { + return pos > s.length(); +} + ///////////////////////////////////////////////////////////////////////////////////////////////// const char *VariantParser::tk_name[TK_MAX] = { diff --git a/core/variant/variant_parser.h b/core/variant/variant_parser.h index c23280e78..a02ef5199 100644 --- a/core/variant/variant_parser.h +++ b/core/variant/variant_parser.h @@ -45,14 +45,16 @@ public: bool eof = false; protected: + bool readahead_enabled = true; virtual uint32_t _read_buffer(CharType *p_buffer, uint32_t p_num_chars) = 0; + virtual bool _is_eof() const = 0; public: CharType saved; CharType get_char(); virtual bool is_utf8() const = 0; - bool is_eof() const { return eof; } + bool is_eof() const; Stream() : saved(0) {} @@ -62,12 +64,16 @@ public: struct StreamFile : public Stream { protected: virtual uint32_t _read_buffer(CharType *p_buffer, uint32_t p_num_chars); + virtual bool _is_eof() const; public: FileAccess *f; virtual bool is_utf8() const; - StreamFile() { f = nullptr; } + StreamFile(bool p_readahead_enabled = true) { + f = nullptr; + readahead_enabled = p_readahead_enabled; + } }; struct StreamString : public Stream { @@ -76,12 +82,16 @@ public: protected: virtual uint32_t _read_buffer(CharType *p_buffer, uint32_t p_num_chars); + virtual bool _is_eof() const; public: String s; virtual bool is_utf8() const; - StreamString() { pos = 0; } + StreamString(bool p_readahead_enabled = true) { + pos = 0; + readahead_enabled = p_readahead_enabled; + } }; typedef Error (*ParseResourceFunc)(void *p_self, Stream *p_stream, Ref &r_res, int &line, String &r_err_str); diff --git a/scene/resources/resource_format_text.cpp b/scene/resources/resource_format_text.cpp index e32074139..f12c12782 100644 --- a/scene/resources/resource_format_text.cpp +++ b/scene/resources/resource_format_text.cpp @@ -629,7 +629,8 @@ void ResourceInteractiveLoaderText::set_translation_remapped(bool p_remapped) { translation_remapped = p_remapped; } -ResourceInteractiveLoaderText::ResourceInteractiveLoaderText() { +ResourceInteractiveLoaderText::ResourceInteractiveLoaderText() : + stream(false) { translation_remapped = false; }