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 3dfef37628)
This commit is contained in:
Lars Kokemohr 2018-03-14 16:42:13 +01:00 committed by Hein-Pieter van Braam
parent 2f53325bed
commit 30b5265417
2 changed files with 17 additions and 4 deletions

View File

@ -1535,15 +1535,21 @@ Variant GDScriptFunctionState::_signal_callback(const Variant **p_args, int p_ar
// then the function did yield again after resuming. // then the function did yield again after resuming.
if (ret.is_ref()) { if (ret.is_ref()) {
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);
}
} }
function = NULL; //cleaned up; function = NULL; //cleaned up;
state.result = Variant(); state.result = Variant();
if (completed) { if (completed) {
emit_signal("completed", ret); GDScriptFunctionState *state = this;
while (state != NULL) {
state->emit_signal("completed", ret);
state = *(state->previous_state);
}
} }
return ret; return ret;
@ -1591,15 +1597,21 @@ Variant GDScriptFunctionState::resume(const Variant &p_arg) {
// then the function did yield again after resuming. // then the function did yield again after resuming.
if (ret.is_ref()) { if (ret.is_ref()) {
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);
}
} }
function = NULL; //cleaned up; function = NULL; //cleaned up;
state.result = Variant(); state.result = Variant();
if (completed) { if (completed) {
emit_signal("completed", ret); GDScriptFunctionState *state = this;
while (state != NULL) {
state->emit_signal("completed", ret);
state = *(state->previous_state);
}
} }
return ret; return ret;

View File

@ -234,6 +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;
protected: protected:
static void _bind_methods(); static void _bind_methods();