diff options
author | RĂ©mi Verschelde <remi@verschelde.fr> | 2022-06-30 23:04:08 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-30 23:04:08 +0200 |
commit | 0800d475a41afc9716e115c1b44ba38b7ec46268 (patch) | |
tree | 974d29fe48b0d627955698754e8c1a7aebab69c6 /core | |
parent | 0bc500eee986cf4fbee371642bd50dfe13f96bb1 (diff) | |
parent | d56185146d4ebc97dcdb8111db61a373533aa0a0 (diff) |
Merge pull request #62540 from MinusKube/debugger-array-crash
Add/fix support for RID, Callable and Signal in editor properties
Diffstat (limited to 'core')
-rw-r--r-- | core/io/marshalls.cpp | 45 |
1 files changed, 38 insertions, 7 deletions
diff --git a/core/io/marshalls.cpp b/core/io/marshalls.cpp index bb9606c94b..f71ea5c39e 100644 --- a/core/io/marshalls.cpp +++ b/core/io/marshalls.cpp @@ -532,7 +532,13 @@ Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int } break; case Variant::RID: { - r_variant = RID(); + ERR_FAIL_COND_V(len < 8, ERR_INVALID_DATA); + uint64_t id = decode_uint64(buf); + if (r_len) { + (*r_len) += 8; + } + + r_variant = RID::from_uint64(id); } break; case Variant::OBJECT: { if (type & ENCODE_FLAG_OBJECT_AS_ID) { @@ -614,9 +620,20 @@ Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int r_variant = Callable(); } break; case Variant::SIGNAL: { - r_variant = Signal(); - } break; + String name; + Error err = _decode_string(buf, len, r_len, name); + if (err) { + return err; + } + ERR_FAIL_COND_V(len < 8, ERR_INVALID_DATA); + ObjectID id = ObjectID(decode_uint64(buf)); + if (r_len) { + (*r_len) += 8; + } + + r_variant = Signal(id, StringName(name)); + } break; case Variant::DICTIONARY: { ERR_FAIL_COND_V(len < 4, ERR_INVALID_DATA); int32_t count = decode_uint32(buf); @@ -1352,10 +1369,12 @@ Error encode_variant(const Variant &p_variant, uint8_t *r_buffer, int &r_len, bo } break; case Variant::RID: { - } break; - case Variant::CALLABLE: { - } break; - case Variant::SIGNAL: { + RID rid = p_variant; + + if (buf) { + encode_uint64(rid.get_id(), buf); + } + r_len += 8; } break; case Variant::OBJECT: { if (p_full_objects) { @@ -1419,6 +1438,18 @@ Error encode_variant(const Variant &p_variant, uint8_t *r_buffer, int &r_len, bo } } break; + case Variant::CALLABLE: { + } break; + case Variant::SIGNAL: { + Signal signal = p_variant; + + _encode_string(signal.get_name(), buf, r_len); + + if (buf) { + encode_uint64(signal.get_object_id(), buf); + } + r_len += 8; + } break; case Variant::DICTIONARY: { Dictionary d = p_variant; |