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.
This commit is contained in:
parent
bc5d67c613
commit
491594ef0f
|
@ -42,7 +42,7 @@ char32_t VariantParser::Stream::get_char() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// attempt to readahead
|
// 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) {
|
if (readahead_filled) {
|
||||||
readahead_pointer = 0;
|
readahead_pointer = 0;
|
||||||
} else {
|
} else {
|
||||||
|
@ -54,10 +54,21 @@ char32_t VariantParser::Stream::get_char() {
|
||||||
return get_char();
|
return get_char();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool VariantParser::Stream::is_eof() const {
|
||||||
|
if (readahead_enabled) {
|
||||||
|
return eof;
|
||||||
|
}
|
||||||
|
return _is_eof();
|
||||||
|
}
|
||||||
|
|
||||||
bool VariantParser::StreamFile::is_utf8() const {
|
bool VariantParser::StreamFile::is_utf8() const {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool VariantParser::StreamFile::_is_eof() const {
|
||||||
|
return f->eof_reached();
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t VariantParser::StreamFile::_read_buffer(char32_t *p_buffer, uint32_t p_num_chars) {
|
uint32_t VariantParser::StreamFile::_read_buffer(char32_t *p_buffer, uint32_t p_num_chars) {
|
||||||
// The buffer is assumed to include at least one character (for null terminator)
|
// The buffer is assumed to include at least one character (for null terminator)
|
||||||
ERR_FAIL_COND_V(!p_num_chars, 0);
|
ERR_FAIL_COND_V(!p_num_chars, 0);
|
||||||
|
@ -79,6 +90,10 @@ bool VariantParser::StreamString::is_utf8() const {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool VariantParser::StreamString::_is_eof() const {
|
||||||
|
return pos > s.length();
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t VariantParser::StreamString::_read_buffer(char32_t *p_buffer, uint32_t p_num_chars) {
|
uint32_t VariantParser::StreamString::_read_buffer(char32_t *p_buffer, uint32_t p_num_chars) {
|
||||||
// The buffer is assumed to include at least one character (for null terminator)
|
// The buffer is assumed to include at least one character (for null terminator)
|
||||||
ERR_FAIL_COND_V(!p_num_chars, 0);
|
ERR_FAIL_COND_V(!p_num_chars, 0);
|
||||||
|
|
|
@ -46,14 +46,16 @@ public:
|
||||||
bool eof = false;
|
bool eof = false;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
bool readahead_enabled = true;
|
||||||
virtual uint32_t _read_buffer(char32_t *p_buffer, uint32_t p_num_chars) = 0;
|
virtual uint32_t _read_buffer(char32_t *p_buffer, uint32_t p_num_chars) = 0;
|
||||||
|
virtual bool _is_eof() const = 0;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
char32_t saved = 0;
|
char32_t saved = 0;
|
||||||
|
|
||||||
char32_t get_char();
|
char32_t get_char();
|
||||||
virtual bool is_utf8() const = 0;
|
virtual bool is_utf8() const = 0;
|
||||||
bool is_eof() const { return eof; }
|
bool is_eof() const;
|
||||||
|
|
||||||
Stream() {}
|
Stream() {}
|
||||||
virtual ~Stream() {}
|
virtual ~Stream() {}
|
||||||
|
@ -62,13 +64,14 @@ public:
|
||||||
struct StreamFile : public Stream {
|
struct StreamFile : public Stream {
|
||||||
protected:
|
protected:
|
||||||
virtual uint32_t _read_buffer(char32_t *p_buffer, uint32_t p_num_chars) override;
|
virtual uint32_t _read_buffer(char32_t *p_buffer, uint32_t p_num_chars) override;
|
||||||
|
virtual bool _is_eof() const override;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Ref<FileAccess> f;
|
Ref<FileAccess> f;
|
||||||
|
|
||||||
virtual bool is_utf8() const override;
|
virtual bool is_utf8() const override;
|
||||||
|
|
||||||
StreamFile() {}
|
StreamFile(bool p_readahead_enabled = true) { readahead_enabled = p_readahead_enabled; }
|
||||||
};
|
};
|
||||||
|
|
||||||
struct StreamString : public Stream {
|
struct StreamString : public Stream {
|
||||||
|
@ -79,10 +82,11 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual uint32_t _read_buffer(char32_t *p_buffer, uint32_t p_num_chars) override;
|
virtual uint32_t _read_buffer(char32_t *p_buffer, uint32_t p_num_chars) override;
|
||||||
|
virtual bool _is_eof() const override;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual bool is_utf8() const override;
|
virtual bool is_utf8() const override;
|
||||||
StreamString() {}
|
StreamString(bool p_readahead_enabled = true) { readahead_enabled = p_readahead_enabled; }
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef Error (*ParseResourceFunc)(void *p_self, Stream *p_stream, Ref<Resource> &r_res, int &line, String &r_err_str);
|
typedef Error (*ParseResourceFunc)(void *p_self, Stream *p_stream, Ref<Resource> &r_res, int &line, String &r_err_str);
|
||||||
|
|
|
@ -836,7 +836,8 @@ void ResourceLoaderText::set_translation_remapped(bool p_remapped) {
|
||||||
translation_remapped = p_remapped;
|
translation_remapped = p_remapped;
|
||||||
}
|
}
|
||||||
|
|
||||||
ResourceLoaderText::ResourceLoaderText() {}
|
ResourceLoaderText::ResourceLoaderText() :
|
||||||
|
stream(false) {}
|
||||||
|
|
||||||
void ResourceLoaderText::get_dependencies(Ref<FileAccess> p_f, List<String> *p_dependencies, bool p_add_types) {
|
void ResourceLoaderText::get_dependencies(Ref<FileAccess> p_f, List<String> *p_dependencies, bool p_add_types) {
|
||||||
open(p_f);
|
open(p_f);
|
||||||
|
|
Loading…
Reference in New Issue