Browse Source

Merge pull request #71698 from bitsawer/fix_preprocessor_leak

Yuri Rubinsky 2 years ago
parent
commit
2f2bf84890

+ 6 - 8
servers/rendering/shader_preprocessor.cpp

@@ -1081,21 +1081,17 @@ ShaderPreprocessor::Define *ShaderPreprocessor::create_define(const String &p_bo
 	return define;
 	return define;
 }
 }
 
 
-void ShaderPreprocessor::clear() {
-	if (state_owner && state != nullptr) {
+void ShaderPreprocessor::clear_state() {
+	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());
 		}
 		}
-
-		memdelete(state);
+		state->defines.clear();
 	}
 	}
-	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();
 }
 }

+ 1 - 2
servers/rendering/shader_preprocessor.h

@@ -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);