Fix memory leak in GDScript during infinnity loops with yields

This commit is contained in:
Yasha Borevich 2018-06-28 18:40:11 +03:00
parent 54988df9ce
commit 30317296af
2 changed files with 11 additions and 11 deletions

View file

@ -1552,7 +1552,7 @@ Variant GDScriptFunctionState::_signal_callback(const Variant **p_args, int p_ar
GDScriptFunctionState *gdfs = Object::cast_to<GDScriptFunctionState>(ret); GDScriptFunctionState *gdfs = Object::cast_to<GDScriptFunctionState>(ret);
if (gdfs && gdfs->function == function) { if (gdfs && gdfs->function == function) {
completed = false; completed = false;
gdfs->previous_state = Ref<GDScriptFunctionState>(this); gdfs->first_state = first_state.is_valid() ? first_state : Ref<GDScriptFunctionState>(this);
} }
} }
@ -1560,10 +1560,10 @@ Variant GDScriptFunctionState::_signal_callback(const Variant **p_args, int p_ar
state.result = Variant(); state.result = Variant();
if (completed) { if (completed) {
GDScriptFunctionState *state = this; if (first_state.is_valid()) {
while (state != NULL) { first_state->emit_signal("completed", ret);
state->emit_signal("completed", ret); } else {
state = *(state->previous_state); emit_signal("completed", ret);
} }
} }
@ -1614,7 +1614,7 @@ Variant GDScriptFunctionState::resume(const Variant &p_arg) {
GDScriptFunctionState *gdfs = Object::cast_to<GDScriptFunctionState>(ret); GDScriptFunctionState *gdfs = Object::cast_to<GDScriptFunctionState>(ret);
if (gdfs && gdfs->function == function) { if (gdfs && gdfs->function == function) {
completed = false; completed = false;
gdfs->previous_state = Ref<GDScriptFunctionState>(this); gdfs->first_state = first_state.is_valid() ? first_state : Ref<GDScriptFunctionState>(this);
} }
} }
@ -1622,10 +1622,10 @@ Variant GDScriptFunctionState::resume(const Variant &p_arg) {
state.result = Variant(); state.result = Variant();
if (completed) { if (completed) {
GDScriptFunctionState *state = this; if (first_state.is_valid()) {
while (state != NULL) { first_state->emit_signal("completed", ret);
state->emit_signal("completed", ret); } else {
state = *(state->previous_state); emit_signal("completed", ret);
} }
} }

View file

@ -234,7 +234,7 @@ class GDScriptFunctionState : public Reference {
GDScriptFunction *function; GDScriptFunction *function;
GDScriptFunction::CallState state; GDScriptFunction::CallState state;
Variant _signal_callback(const Variant **p_args, int p_argcount, Variant::CallError &r_error); Variant _signal_callback(const Variant **p_args, int p_argcount, Variant::CallError &r_error);
Ref<GDScriptFunctionState> previous_state; Ref<GDScriptFunctionState> first_state;
protected: protected:
static void _bind_methods(); static void _bind_methods();