From 0547059344fe04b015873913c212ac72191b67ec Mon Sep 17 00:00:00 2001 From: Denis Zubarev Date: Fri, 28 Nov 2025 14:56:10 +0300 Subject: [PATCH 1/4] add msgpack serialize and msgpack deserialize --- .../kphp-light/stdlib/serialize-functions.txt | 7 +++--- .../stdlib/serialization/msgpack-functions.h | 24 +++++++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/builtin-functions/kphp-light/stdlib/serialize-functions.txt b/builtin-functions/kphp-light/stdlib/serialize-functions.txt index 8e429a964a..f190b4ce93 100644 --- a/builtin-functions/kphp-light/stdlib/serialize-functions.txt +++ b/builtin-functions/kphp-light/stdlib/serialize-functions.txt @@ -54,9 +54,8 @@ function instance_serialize_safe(object $instance) ::: string; /** @kphp-extern-func-info cpp_template_call can_throw */ function instance_deserialize_safe($serialized ::: string, $to_type ::: string) ::: instance<^2>; -// ===== UNSUPPORTED ===== - -/** @kphp-extern-func-info can_throw stub generation-required */ +/** @kphp-extern-func-info can_throw */ function msgpack_serialize_safe($v ::: mixed) ::: string; -/** @kphp-extern-func-info can_throw stub generation-required */ + +/** @kphp-extern-func-info can_throw */ function msgpack_deserialize_safe($v ::: string) ::: mixed; diff --git a/runtime-light/stdlib/serialization/msgpack-functions.h b/runtime-light/stdlib/serialization/msgpack-functions.h index 472d57d90e..a98789c3a6 100644 --- a/runtime-light/stdlib/serialization/msgpack-functions.h +++ b/runtime-light/stdlib/serialization/msgpack-functions.h @@ -77,3 +77,27 @@ ResultClass f$instance_deserialize_safe(const string& buffer, const string& /*un } return res; } + +template +string f$msgpack_serialize_safe(const T& value) noexcept { + string err_msg; + auto res = f$msgpack_serialize(value, &err_msg); + if (!err_msg.empty()) { + THROW_EXCEPTION(kphp::exception::make_throwable(std::move(err_msg))); + return {}; + } + kphp::log::assertion(res.has_value()); + return res.val(); +} + +template +ResultType f$msgpack_deserialize_safe(const string& buffer) noexcept { + string err_msg; + auto res = f$msgpack_deserialize(buffer, &err_msg); + if (!err_msg.empty()) { + THROW_EXCEPTION(kphp::exception::make_throwable(std::move(err_msg))); + return {}; + } + return res; +} + From a266b44eb43139a00c7b8889175902c27df4ce77 Mon Sep 17 00:00:00 2001 From: Vadim Sadokhov Date: Fri, 28 Nov 2025 15:22:48 +0300 Subject: [PATCH 2/4] add minor fix --- runtime-light/stdlib/serialization/msgpack-functions.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/runtime-light/stdlib/serialization/msgpack-functions.h b/runtime-light/stdlib/serialization/msgpack-functions.h index a98789c3a6..c379c2a0cc 100644 --- a/runtime-light/stdlib/serialization/msgpack-functions.h +++ b/runtime-light/stdlib/serialization/msgpack-functions.h @@ -81,7 +81,7 @@ ResultClass f$instance_deserialize_safe(const string& buffer, const string& /*un template string f$msgpack_serialize_safe(const T& value) noexcept { string err_msg; - auto res = f$msgpack_serialize(value, &err_msg); + auto res{f$msgpack_serialize(value, std::addressof(err_msg))}; if (!err_msg.empty()) { THROW_EXCEPTION(kphp::exception::make_throwable(std::move(err_msg))); return {}; @@ -93,11 +93,10 @@ string f$msgpack_serialize_safe(const T& value) noexcept { template ResultType f$msgpack_deserialize_safe(const string& buffer) noexcept { string err_msg; - auto res = f$msgpack_deserialize(buffer, &err_msg); + const auto res{f$msgpack_deserialize(buffer, std::addressof(err_msg))}; if (!err_msg.empty()) { THROW_EXCEPTION(kphp::exception::make_throwable(std::move(err_msg))); return {}; } return res; } - From 17379dc14755b5db2d8a391e5dba4c2bfa4cf81a Mon Sep 17 00:00:00 2001 From: Vadim Sadokhov Date: Fri, 28 Nov 2025 15:32:29 +0300 Subject: [PATCH 3/4] remove extra const qualifier --- runtime-light/stdlib/serialization/msgpack-functions.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime-light/stdlib/serialization/msgpack-functions.h b/runtime-light/stdlib/serialization/msgpack-functions.h index c379c2a0cc..b24ae7290b 100644 --- a/runtime-light/stdlib/serialization/msgpack-functions.h +++ b/runtime-light/stdlib/serialization/msgpack-functions.h @@ -93,7 +93,7 @@ string f$msgpack_serialize_safe(const T& value) noexcept { template ResultType f$msgpack_deserialize_safe(const string& buffer) noexcept { string err_msg; - const auto res{f$msgpack_deserialize(buffer, std::addressof(err_msg))}; + auto res{f$msgpack_deserialize(buffer, std::addressof(err_msg))}; if (!err_msg.empty()) { THROW_EXCEPTION(kphp::exception::make_throwable(std::move(err_msg))); return {}; From 4627846a19d1b01aba6ac2c2c016baac4b135638 Mon Sep 17 00:00:00 2001 From: Vadim Sadokhov Date: Fri, 28 Nov 2025 15:39:53 +0300 Subject: [PATCH 4/4] enable tests --- tests/phpt/msgpack_serialize/014_deserialize_safe.php | 2 +- tests/phpt/msgpack_serialize/024_serialize_vector.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/phpt/msgpack_serialize/014_deserialize_safe.php b/tests/phpt/msgpack_serialize/014_deserialize_safe.php index 6c5046a587..384527236d 100644 --- a/tests/phpt/msgpack_serialize/014_deserialize_safe.php +++ b/tests/phpt/msgpack_serialize/014_deserialize_safe.php @@ -1,4 +1,4 @@ -@ok k2_skip +@ok