|
@@ -1583,15 +1583,26 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
|
|
|
GDScriptLanguage::get_singleton()->script_frame_time += time_taken - function_call_time;
|
|
|
}
|
|
|
|
|
|
- if (ScriptDebugger::get_singleton())
|
|
|
- GDScriptLanguage::get_singleton()->exit_function();
|
|
|
+ bool yielded = retvalue.is_ref() && Object::cast_to<GDScriptFunctionState>(retvalue);
|
|
|
+
|
|
|
+ // Check if this is the last time the function is resuming from yield
|
|
|
+ // Will be true if never yielded as well
|
|
|
+ // When it's the last resume it will postpone the exit from stack,
|
|
|
+ // so the debugger knows which function triggered the resume of the next function (if any)
|
|
|
+ if (!p_state || yielded) {
|
|
|
+ if (ScriptDebugger::get_singleton())
|
|
|
+ GDScriptLanguage::get_singleton()->exit_function();
|
|
|
#endif
|
|
|
|
|
|
- if (_stack_size) {
|
|
|
- //free stack
|
|
|
- for (int i = 0; i < _stack_size; i++)
|
|
|
- stack[i].~Variant();
|
|
|
+ if (_stack_size) {
|
|
|
+ //free stack
|
|
|
+ for (int i = 0; i < _stack_size; i++)
|
|
|
+ stack[i].~Variant();
|
|
|
+ }
|
|
|
+
|
|
|
+#ifdef DEBUG_ENABLED
|
|
|
}
|
|
|
+#endif
|
|
|
|
|
|
return retvalue;
|
|
|
}
|
|
@@ -1830,6 +1841,17 @@ Variant GDScriptFunctionState::_signal_callback(const Variant **p_args, int p_ar
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#ifdef DEBUG_ENABLED
|
|
|
+ if (ScriptDebugger::get_singleton())
|
|
|
+ GDScriptLanguage::get_singleton()->exit_function();
|
|
|
+ if (state.stack_size) {
|
|
|
+ //free stack
|
|
|
+ Variant *stack = (Variant *)state.stack.ptr();
|
|
|
+ for (int i = 0; i < state.stack_size; i++)
|
|
|
+ stack[i].~Variant();
|
|
|
+ }
|
|
|
+#endif
|
|
|
+
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -1884,6 +1906,17 @@ Variant GDScriptFunctionState::resume(const Variant &p_arg) {
|
|
|
} else {
|
|
|
emit_signal("completed", ret);
|
|
|
}
|
|
|
+
|
|
|
+#ifdef DEBUG_ENABLED
|
|
|
+ if (ScriptDebugger::get_singleton())
|
|
|
+ GDScriptLanguage::get_singleton()->exit_function();
|
|
|
+ if (state.stack_size) {
|
|
|
+ //free stack
|
|
|
+ Variant *stack = (Variant *)state.stack.ptr();
|
|
|
+ for (int i = 0; i < state.stack_size; i++)
|
|
|
+ stack[i].~Variant();
|
|
|
+ }
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
return ret;
|