Merge pull request #71698 from bitsawer/fix_preprocessor_leak

This commit is contained in:
Yuri Rubinsky 2023-01-20 09:48:43 +03:00 committed by GitHub
commit 2f2bf84890
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 7 additions and 10 deletions

View File

@ -1081,21 +1081,17 @@ ShaderPreprocessor::Define *ShaderPreprocessor::create_define(const String &p_bo
return define; return define;
} }
void ShaderPreprocessor::clear() { void ShaderPreprocessor::clear_state() {
if (state_owner && state != nullptr) { if (state != nullptr) {
for (const RBMap<String, Define *>::Element *E = state->defines.front(); E; E = E->next()) { for (const RBMap<String, Define *>::Element *E = state->defines.front(); E; E = E->next()) {
memdelete(E->get()); memdelete(E->get());
} }
state->defines.clear();
memdelete(state);
} }
state_owner = false;
state = nullptr; state = nullptr;
} }
Error ShaderPreprocessor::preprocess(State *p_state, const String &p_code, String &r_result) { Error ShaderPreprocessor::preprocess(State *p_state, const String &p_code, String &r_result) {
clear();
output.clear(); output.clear();
state = p_state; state = p_state;
@ -1242,6 +1238,9 @@ Error ShaderPreprocessor::preprocess(const String &p_code, const String &p_filen
} }
} }
} }
clear_state();
return err; return err;
} }
@ -1273,5 +1272,4 @@ ShaderPreprocessor::ShaderPreprocessor() {
} }
ShaderPreprocessor::~ShaderPreprocessor() { ShaderPreprocessor::~ShaderPreprocessor() {
clear();
} }

View File

@ -167,7 +167,6 @@ private:
private: private:
LocalVector<char32_t> output; LocalVector<char32_t> output;
State *state = nullptr; State *state = nullptr;
bool state_owner = false;
private: private:
static bool is_char_word(char32_t p_char); static bool is_char_word(char32_t p_char);
@ -211,7 +210,7 @@ private:
static Define *create_define(const String &p_body); static Define *create_define(const String &p_body);
void clear(); void clear_state();
Error preprocess(State *p_state, const String &p_code, String &r_result); Error preprocess(State *p_state, const String &p_code, String &r_result);