GDScript gracefully handle debug functions from separate thread
This commit is contained in:
parent
0b667e6c27
commit
d3051b2637
|
@ -98,6 +98,7 @@
|
|||
[codeblock]
|
||||
[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]
|
||||
[/codeblock]
|
||||
[b]Note:[/b] Not supported for calling from threads. Instead, this will return an empty array.
|
||||
</description>
|
||||
</method>
|
||||
<method name="inst2dict">
|
||||
|
@ -160,17 +161,24 @@
|
|||
<method name="print_debug" qualifiers="vararg">
|
||||
<return type="void" />
|
||||
<description>
|
||||
Like [method @GlobalScope.print], but prints only when used in debug mode.
|
||||
Like [method @GlobalScope.print], but includes the current stack frame when running with the debugger turned on.
|
||||
Output in the console would look something like this:
|
||||
[codeblock]
|
||||
Test print
|
||||
At: res://test.gd:15:_process()
|
||||
[/codeblock]
|
||||
[b]Note:[/b] Not supported for calling from threads. Instead of the stack frame, this will print the thread ID.
|
||||
</description>
|
||||
</method>
|
||||
<method name="print_stack">
|
||||
<return type="void" />
|
||||
<description>
|
||||
Prints a stack track at code location, only works when running with debugger turned on.
|
||||
Prints a stack trace at the current code location. Only works when running with debugger turned on.
|
||||
Output in the console would look something like this:
|
||||
[codeblock]
|
||||
Frame 0 - res://test.gd:16 in function '_process'
|
||||
[/codeblock]
|
||||
[b]Note:[/b] Not supported for calling from threads. Instead of the stack trace, this will print the thread ID.
|
||||
</description>
|
||||
</method>
|
||||
<method name="range" qualifiers="vararg">
|
||||
|
|
|
@ -437,9 +437,13 @@ struct GDScriptUtilityFunctionsDefinitions {
|
|||
str += p_args[i]->operator String();
|
||||
}
|
||||
|
||||
ScriptLanguage *script = GDScriptLanguage::get_singleton();
|
||||
if (script->debug_get_stack_level_count() > 0) {
|
||||
str += "\n At: " + script->debug_get_stack_level_source(0) + ":" + itos(script->debug_get_stack_level_line(0)) + ":" + script->debug_get_stack_level_function(0) + "()";
|
||||
if (Thread::get_caller_id() == Thread::get_main_id()) {
|
||||
ScriptLanguage *script = GDScriptLanguage::get_singleton();
|
||||
if (script->debug_get_stack_level_count() > 0) {
|
||||
str += "\n At: " + script->debug_get_stack_level_source(0) + ":" + itos(script->debug_get_stack_level_line(0)) + ":" + script->debug_get_stack_level_function(0) + "()";
|
||||
}
|
||||
} else {
|
||||
str += "\n At: Cannot retrieve debug info outside the main thread. Thread ID: " + itos(Thread::get_caller_id());
|
||||
}
|
||||
|
||||
print_line(str);
|
||||
|
@ -448,15 +452,24 @@ struct GDScriptUtilityFunctionsDefinitions {
|
|||
|
||||
static inline void print_stack(Variant *r_ret, const Variant **p_args, int p_arg_count, Callable::CallError &r_error) {
|
||||
VALIDATE_ARG_COUNT(0);
|
||||
if (Thread::get_caller_id() != Thread::get_main_id()) {
|
||||
print_line("Cannot retrieve debug info outside the main thread. Thread ID: " + itos(Thread::get_caller_id()));
|
||||
return;
|
||||
}
|
||||
|
||||
ScriptLanguage *script = GDScriptLanguage::get_singleton();
|
||||
for (int i = 0; i < script->debug_get_stack_level_count(); i++) {
|
||||
print_line("Frame " + itos(i) + " - " + script->debug_get_stack_level_source(i) + ":" + itos(script->debug_get_stack_level_line(i)) + " in function '" + script->debug_get_stack_level_function(i) + "'");
|
||||
};
|
||||
*r_ret = Variant();
|
||||
}
|
||||
|
||||
static inline void get_stack(Variant *r_ret, const Variant **p_args, int p_arg_count, Callable::CallError &r_error) {
|
||||
VALIDATE_ARG_COUNT(0);
|
||||
if (Thread::get_caller_id() != Thread::get_main_id()) {
|
||||
*r_ret = Array();
|
||||
return;
|
||||
}
|
||||
|
||||
ScriptLanguage *script = GDScriptLanguage::get_singleton();
|
||||
Array ret;
|
||||
|
|
Loading…
Reference in New Issue