|
@@ -544,25 +544,60 @@ void RemoteDebugger::debug(bool p_can_continue, bool p_is_error_breakpoint) {
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ PackedStringArray input_names;
|
|
|
|
+ Array input_vals;
|
|
|
|
+
|
|
List<String> locals;
|
|
List<String> locals;
|
|
List<Variant> local_vals;
|
|
List<Variant> local_vals;
|
|
-
|
|
|
|
script_debugger->get_break_language()->debug_get_stack_level_locals(frame, &locals, &local_vals);
|
|
script_debugger->get_break_language()->debug_get_stack_level_locals(frame, &locals, &local_vals);
|
|
ERR_FAIL_COND(locals.size() != local_vals.size());
|
|
ERR_FAIL_COND(locals.size() != local_vals.size());
|
|
|
|
|
|
- PackedStringArray locals_vector;
|
|
|
|
for (const String &S : locals) {
|
|
for (const String &S : locals) {
|
|
- locals_vector.append(S);
|
|
|
|
|
|
+ input_names.append(S);
|
|
}
|
|
}
|
|
|
|
|
|
- Array local_vals_array;
|
|
|
|
for (const Variant &V : local_vals) {
|
|
for (const Variant &V : local_vals) {
|
|
- local_vals_array.append(V);
|
|
|
|
|
|
+ input_vals.append(V);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ List<String> globals;
|
|
|
|
+ List<Variant> globals_vals;
|
|
|
|
+ script_debugger->get_break_language()->debug_get_globals(&globals, &globals_vals);
|
|
|
|
+ ERR_FAIL_COND(globals.size() != globals_vals.size());
|
|
|
|
+
|
|
|
|
+ for (const String &S : globals) {
|
|
|
|
+ input_names.append(S);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (const Variant &V : globals_vals) {
|
|
|
|
+ input_vals.append(V);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ List<StringName> native_types;
|
|
|
|
+ ClassDB::get_class_list(&native_types);
|
|
|
|
+ for (const StringName &E : native_types) {
|
|
|
|
+ if (!ClassDB::is_class_exposed(E) || !Engine::get_singleton()->has_singleton(E) || Engine::get_singleton()->is_singleton_editor_only(E)) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ input_names.append(E);
|
|
|
|
+ input_vals.append(Engine::get_singleton()->get_singleton_object(E));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ List<StringName> user_types;
|
|
|
|
+ ScriptServer::get_global_class_list(&user_types);
|
|
|
|
+ for (const StringName &S : user_types) {
|
|
|
|
+ String scr_path = ScriptServer::get_global_class_path(S);
|
|
|
|
+ Ref<Script> scr = ResourceLoader::load(scr_path, "Script");
|
|
|
|
+ ERR_CONTINUE_MSG(scr.is_null(), vformat(R"(Could not load the global class %s from resource path: "%s".)", S, scr_path));
|
|
|
|
+
|
|
|
|
+ input_names.append(S);
|
|
|
|
+ input_vals.append(scr);
|
|
}
|
|
}
|
|
|
|
|
|
Expression expression;
|
|
Expression expression;
|
|
- expression.parse(expression_str, locals_vector);
|
|
|
|
- const Variant return_val = expression.execute(local_vals_array, breaked_instance->get_owner());
|
|
|
|
|
|
+ expression.parse(expression_str, input_names);
|
|
|
|
+ const Variant return_val = expression.execute(input_vals, breaked_instance->get_owner());
|
|
|
|
|
|
DebuggerMarshalls::ScriptStackVariable stvar;
|
|
DebuggerMarshalls::ScriptStackVariable stvar;
|
|
stvar.name = expression_str;
|
|
stvar.name = expression_str;
|