diff options
| author | Lars Kokemohr | 2018-03-14 16:42:13 +0100 |
|---|---|---|
| committer | Hein-Pieter van Braam | 2018-04-14 20:42:44 +0200 |
| commit | 30b5265417f1e1be29652f056a848d9083ebec25 (patch) | |
| tree | 42c28850ca15fb7fe1118fd6b89f44803afe9a4e /modules/gdscript/gdscript_function.cpp | |
| parent | 2f53325beda6531eff42460bd95881bd6f8e392b (diff) | |
| download | godot-30b5265417f1e1be29652f056a848d9083ebec25.tar.gz godot-30b5265417f1e1be29652f056a848d9083ebec25.tar.zst godot-30b5265417f1e1be29652f056a848d9083ebec25.zip | |
completed-signal is emitted by all GDScriptFunctionStates of a coroutine now, allowing to yield for completion of a function with more than one yield inside.
(cherry picked from commit 3dfef37628a3b17cca4ce5370631fb572376ed98)
Diffstat (limited to 'modules/gdscript/gdscript_function.cpp')
| -rw-r--r-- | modules/gdscript/gdscript_function.cpp | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/modules/gdscript/gdscript_function.cpp b/modules/gdscript/gdscript_function.cpp index a2f449909..f83bec0c7 100644 --- a/modules/gdscript/gdscript_function.cpp +++ b/modules/gdscript/gdscript_function.cpp @@ -1535,15 +1535,21 @@ Variant GDScriptFunctionState::_signal_callback(const Variant **p_args, int p_ar // then the function did yield again after resuming. if (ret.is_ref()) { GDScriptFunctionState *gdfs = Object::cast_to<GDScriptFunctionState>(ret); - if (gdfs && gdfs->function == function) + if (gdfs && gdfs->function == function) { completed = false; + gdfs->previous_state = Ref<GDScriptFunctionState>(this); + } } function = NULL; //cleaned up; state.result = Variant(); if (completed) { - emit_signal("completed", ret); + GDScriptFunctionState *state = this; + while (state != NULL) { + state->emit_signal("completed", ret); + state = *(state->previous_state); + } } return ret; @@ -1591,15 +1597,21 @@ Variant GDScriptFunctionState::resume(const Variant &p_arg) { // then the function did yield again after resuming. if (ret.is_ref()) { GDScriptFunctionState *gdfs = Object::cast_to<GDScriptFunctionState>(ret); - if (gdfs && gdfs->function == function) + if (gdfs && gdfs->function == function) { completed = false; + gdfs->previous_state = Ref<GDScriptFunctionState>(this); + } } function = NULL; //cleaned up; state.result = Variant(); if (completed) { - emit_signal("completed", ret); + GDScriptFunctionState *state = this; + while (state != NULL) { + state->emit_signal("completed", ret); + state = *(state->previous_state); + } } return ret; |
