feat: updated engine
This commit is contained in:
parent
cbe99774ff
commit
f4cf6b3999
6607 changed files with 910135 additions and 430025 deletions
|
|
@ -81,16 +81,20 @@ Array DebuggerMarshalls::ScriptStackVariable::serialize(int max_size) {
|
|||
} else {
|
||||
arr.push_back(var);
|
||||
}
|
||||
|
||||
arr.push_back(type_hint);
|
||||
|
||||
return arr;
|
||||
}
|
||||
|
||||
bool DebuggerMarshalls::ScriptStackVariable::deserialize(const Array &p_arr) {
|
||||
CHECK_SIZE(p_arr, 4, "ScriptStackVariable");
|
||||
CHECK_SIZE(p_arr, 5, "ScriptStackVariable");
|
||||
name = p_arr[0];
|
||||
type = p_arr[1];
|
||||
var_type = p_arr[2];
|
||||
value = p_arr[3];
|
||||
CHECK_END(p_arr, 4, "ScriptStackVariable");
|
||||
type_hint = p_arr[4];
|
||||
CHECK_END(p_arr, 5, "ScriptStackVariable");
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -177,3 +181,27 @@ Ref<Shortcut> DebuggerMarshalls::deserialize_key_shortcut(const Array &p_keys) {
|
|||
shortcut->set_events(key_events);
|
||||
return shortcut;
|
||||
}
|
||||
|
||||
String DebuggerMarshalls::parse_type_from_variant(const Variant &p_variant) {
|
||||
String name;
|
||||
|
||||
if (p_variant.get_type() == Variant::OBJECT) {
|
||||
const Object *obj = p_variant.get_validated_object();
|
||||
if (obj) {
|
||||
const ScriptInstance *script_instance = obj->get_script_instance();
|
||||
|
||||
if (script_instance) {
|
||||
Ref<Script> script = script_instance->get_script();
|
||||
if (script.is_valid()) {
|
||||
name = script->get_global_name();
|
||||
}
|
||||
}
|
||||
|
||||
if (name.is_empty()) {
|
||||
return obj->get_class();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ struct DebuggerMarshalls {
|
|||
Variant value;
|
||||
int type = -1;
|
||||
int var_type = -1;
|
||||
String type_hint;
|
||||
|
||||
Array serialize(int max_size = 1 << 20); // 1 MiB default.
|
||||
bool deserialize(const Array &p_arr);
|
||||
|
|
@ -70,4 +71,6 @@ struct DebuggerMarshalls {
|
|||
|
||||
static Array serialize_key_shortcut(const Ref<Shortcut> &p_shortcut);
|
||||
static Ref<Shortcut> deserialize_key_shortcut(const Array &p_keys);
|
||||
|
||||
static String parse_type_from_variant(const Variant &p_variant);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -138,8 +138,8 @@ void EngineDebugger::initialize(const String &p_uri, bool p_skip_breakpoints, bo
|
|||
CreatePeerFunc *create_fn = protocols.getptr(proto);
|
||||
ERR_FAIL_NULL_MSG(create_fn, vformat("Invalid protocol: %s.", proto));
|
||||
|
||||
RemoteDebuggerPeer *peer = (*create_fn)(p_uri);
|
||||
if (!peer) {
|
||||
Ref<RemoteDebuggerPeer> peer = (*create_fn)(p_uri);
|
||||
if (peer.is_null()) {
|
||||
return;
|
||||
}
|
||||
singleton = memnew(RemoteDebugger(Ref<RemoteDebuggerPeer>(peer)));
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include "core/object/ref_counted.h"
|
||||
#include "core/string/string_name.h"
|
||||
#include "core/string/ustring.h"
|
||||
#include "core/templates/hash_map.h"
|
||||
|
|
@ -47,7 +48,7 @@ public:
|
|||
|
||||
typedef Error (*CaptureFunc)(void *p_user, const String &p_msg, const Array &p_args, bool &r_captured);
|
||||
|
||||
typedef RemoteDebuggerPeer *(*CreatePeerFunc)(const String &p_uri);
|
||||
typedef Ref<RemoteDebuggerPeer> (*CreatePeerFunc)(const String &p_uri);
|
||||
|
||||
class Profiler {
|
||||
friend class EngineDebugger;
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
#include "engine_profiler.h"
|
||||
|
||||
#include "core/debugger/engine_debugger.h"
|
||||
#include "core/object/class_db.h" // IWYU pragma: keep. `GDVIRTUAL_BIND` macro.
|
||||
|
||||
void EngineProfiler::_bind_methods() {
|
||||
GDVIRTUAL_BIND(_toggle, "enable", "options");
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include "core/object/gdvirtual.gen.inc"
|
||||
#include "core/object/gdvirtual.gen.h"
|
||||
#include "core/object/ref_counted.h"
|
||||
|
||||
class EngineProfiler : public RefCounted {
|
||||
|
|
|
|||
|
|
@ -34,6 +34,8 @@
|
|||
#include "core/os/main_loop.h"
|
||||
#include "core/os/os.h"
|
||||
|
||||
#include <cstdio>
|
||||
|
||||
struct LocalDebugger::ScriptsProfiler {
|
||||
struct ProfileInfoSort {
|
||||
bool operator()(const ScriptLanguage::ProfilingInfo &A, const ScriptLanguage::ProfilingInfo &B) const {
|
||||
|
|
|
|||
|
|
@ -31,7 +31,6 @@
|
|||
#pragma once
|
||||
|
||||
#include "core/debugger/engine_debugger.h"
|
||||
#include "core/object/script_language.h"
|
||||
#include "core/templates/list.h"
|
||||
|
||||
class LocalDebugger : public EngineDebugger {
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
|
||||
#include "remote_debugger.h"
|
||||
|
||||
#include "core/config/engine.h"
|
||||
#include "core/config/project_settings.h"
|
||||
#include "core/debugger/debugger_marshalls.h"
|
||||
#include "core/debugger/engine_debugger.h"
|
||||
|
|
@ -38,6 +39,7 @@
|
|||
#include "core/input/input.h"
|
||||
#include "core/io/resource_loader.h"
|
||||
#include "core/math/expression.h"
|
||||
#include "core/object/class_db.h"
|
||||
#include "core/object/script_language.h"
|
||||
#include "core/os/os.h"
|
||||
#include "servers/display/display_server.h"
|
||||
|
|
@ -327,6 +329,7 @@ void RemoteDebugger::_send_stack_vars(List<String> &p_names, List<Variant> &p_va
|
|||
stvar.name = E->get();
|
||||
stvar.value = F->get();
|
||||
stvar.type = p_type;
|
||||
stvar.type_hint = DebuggerMarshalls::parse_type_from_variant(F->get());
|
||||
send_message("stack_frame_var", stvar.serialize());
|
||||
E = E->next();
|
||||
F = F->next();
|
||||
|
|
@ -426,12 +429,12 @@ void RemoteDebugger::debug(bool p_can_continue, bool p_is_error_breakpoint) {
|
|||
}
|
||||
send_message("debug_enter", msg);
|
||||
|
||||
Input::MouseMode mouse_mode = Input::MOUSE_MODE_VISIBLE;
|
||||
Input::MouseMode mouse_mode = Input::MouseMode::MOUSE_MODE_VISIBLE;
|
||||
|
||||
if (Thread::is_main_thread()) {
|
||||
mouse_mode = Input::get_singleton()->get_mouse_mode();
|
||||
if (mouse_mode != Input::MOUSE_MODE_VISIBLE) {
|
||||
Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE);
|
||||
if (mouse_mode != Input::MouseMode::MOUSE_MODE_VISIBLE) {
|
||||
Input::get_singleton()->set_mouse_mode(Input::MouseMode::MOUSE_MODE_VISIBLE);
|
||||
}
|
||||
} else {
|
||||
MutexLock mutex_lock(mutex);
|
||||
|
|
|
|||
|
|
@ -33,8 +33,6 @@
|
|||
#include "core/debugger/debugger_marshalls.h"
|
||||
#include "core/debugger/engine_debugger.h"
|
||||
#include "core/debugger/remote_debugger_peer.h"
|
||||
#include "core/object/class_db.h"
|
||||
#include "core/string/string_name.h"
|
||||
#include "core/string/ustring.h"
|
||||
#include "core/variant/array.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -32,6 +32,9 @@
|
|||
|
||||
#include "core/config/project_settings.h"
|
||||
#include "core/io/marshalls.h"
|
||||
#include "core/io/stream_peer_socket.h"
|
||||
#include "core/io/stream_peer_tcp.h"
|
||||
#include "core/io/stream_peer_uds.h"
|
||||
#include "core/os/os.h"
|
||||
|
||||
bool RemoteDebuggerPeerTCP::is_peer_connected() {
|
||||
|
|
@ -126,6 +129,7 @@ void RemoteDebuggerPeerTCP::_write_out() {
|
|||
void RemoteDebuggerPeerTCP::_read_in() {
|
||||
while (tcp_client->get_status() == StreamPeerTCP::STATUS_CONNECTED && tcp_client->wait(NetSocket::POLL_TYPE_IN) == OK) {
|
||||
uint8_t *buf = in_buf.ptrw();
|
||||
Error err = OK;
|
||||
if (in_left <= 0) {
|
||||
if (in_queue.size() > max_queued_messages) {
|
||||
break; // Too many messages already in queue.
|
||||
|
|
@ -135,18 +139,29 @@ void RemoteDebuggerPeerTCP::_read_in() {
|
|||
}
|
||||
uint32_t size = 0;
|
||||
int read = 0;
|
||||
Error err = tcp_client->get_partial_data((uint8_t *)&size, 4, read);
|
||||
ERR_CONTINUE(read != 4 || err != OK || size > (uint32_t)in_buf.size());
|
||||
err = tcp_client->get_partial_data((uint8_t *)&size, 4, read);
|
||||
if (err != OK || read != 4) {
|
||||
_disconnect_with_error("Remote debugger: Connection lost while reading packet size.");
|
||||
return;
|
||||
}
|
||||
if (size > (uint32_t)in_buf.size()) {
|
||||
_disconnect_with_error(vformat("Remote debugger: Packet too large (%s > %s bytes). Disconnecting.", String::num_uint64(size), String::num_int64(in_buf.size())));
|
||||
return;
|
||||
}
|
||||
in_left = size;
|
||||
in_pos = 0;
|
||||
}
|
||||
int read = 0;
|
||||
tcp_client->get_partial_data(buf + in_pos, in_left, read);
|
||||
err = tcp_client->get_partial_data(buf + in_pos, in_left, read);
|
||||
if (err != OK || read == 0) {
|
||||
_disconnect_with_error("Remote debugger: Connection lost while reading packet payload.");
|
||||
return;
|
||||
}
|
||||
in_left -= read;
|
||||
in_pos += read;
|
||||
if (in_left == 0) {
|
||||
Variant var;
|
||||
Error err = decode_variant(var, buf, in_pos, &read);
|
||||
err = decode_variant(var, buf, in_pos, &read);
|
||||
ERR_CONTINUE(read != in_pos || err != OK);
|
||||
ERR_CONTINUE_MSG(var.get_type() != Variant::ARRAY, "Malformed packet received, not an Array.");
|
||||
MutexLock lock(mutex);
|
||||
|
|
@ -208,7 +223,7 @@ void RemoteDebuggerPeerTCP::_poll() {
|
|||
}
|
||||
}
|
||||
|
||||
RemoteDebuggerPeer *RemoteDebuggerPeerTCP::create_tcp(const String &p_uri) {
|
||||
Ref<RemoteDebuggerPeer> RemoteDebuggerPeerTCP::create_tcp(const String &p_uri) {
|
||||
ERR_FAIL_COND_V(!p_uri.begins_with("tcp://"), nullptr);
|
||||
|
||||
String debug_host = p_uri.replace("tcp://", "");
|
||||
|
|
@ -234,7 +249,7 @@ RemoteDebuggerPeer *RemoteDebuggerPeerTCP::create_tcp(const String &p_uri) {
|
|||
return memnew(RemoteDebuggerPeerTCP(stream));
|
||||
}
|
||||
|
||||
RemoteDebuggerPeer *RemoteDebuggerPeerTCP::create_unix(const String &p_uri) {
|
||||
Ref<RemoteDebuggerPeer> RemoteDebuggerPeerTCP::create_unix(const String &p_uri) {
|
||||
ERR_FAIL_COND_V(!p_uri.begins_with("unix://"), nullptr);
|
||||
|
||||
String debug_path = p_uri.replace("unix://", "");
|
||||
|
|
@ -249,3 +264,8 @@ RemoteDebuggerPeer *RemoteDebuggerPeerTCP::create_unix(const String &p_uri) {
|
|||
RemoteDebuggerPeer::RemoteDebuggerPeer() {
|
||||
max_queued_messages = (int)GLOBAL_GET("network/limits/debugger/max_queued_messages");
|
||||
}
|
||||
|
||||
void RemoteDebuggerPeerTCP::_disconnect_with_error(const String &p_reason) {
|
||||
ERR_PRINT(p_reason);
|
||||
tcp_client->disconnect_from_host();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,13 +30,13 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include "core/io/stream_peer_tcp.h"
|
||||
#include "core/io/stream_peer_uds.h"
|
||||
#include "core/object/ref_counted.h"
|
||||
#include "core/os/mutex.h"
|
||||
#include "core/os/thread.h"
|
||||
#include "core/string/ustring.h"
|
||||
|
||||
class StreamPeerSocket;
|
||||
|
||||
class RemoteDebuggerPeer : public RefCounted {
|
||||
GDSOFTCLASS(RemoteDebuggerPeer, RefCounted);
|
||||
|
||||
|
|
@ -79,11 +79,12 @@ private:
|
|||
void _poll();
|
||||
void _write_out();
|
||||
void _read_in();
|
||||
void _disconnect_with_error(const String &p_reason);
|
||||
static Error _try_connect(Ref<StreamPeerSocket> p_stream);
|
||||
|
||||
public:
|
||||
static RemoteDebuggerPeer *create_tcp(const String &p_uri);
|
||||
static RemoteDebuggerPeer *create_unix(const String &p_uri);
|
||||
static Ref<RemoteDebuggerPeer> create_tcp(const String &p_uri);
|
||||
static Ref<RemoteDebuggerPeer> create_unix(const String &p_uri);
|
||||
|
||||
bool is_peer_connected() override;
|
||||
int get_max_message_size() const override;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue