瀏覽代碼

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.

Lars Kokemohr 7 年之前
父節點
當前提交
3dfef37628
共有 2 個文件被更改,包括 17 次插入4 次删除
  1. 16 4
      modules/gdscript/gdscript_function.cpp
  2. 1 0
      modules/gdscript/gdscript_function.h

+ 16 - 4
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;

+ 1 - 0
modules/gdscript/gdscript_function.h

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