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..b24ae7290b 100644 --- a/runtime-light/stdlib/serialization/msgpack-functions.h +++ b/runtime-light/stdlib/serialization/msgpack-functions.h @@ -77,3 +77,26 @@ 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, std::addressof(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, std::addressof(err_msg))}; + if (!err_msg.empty()) { + THROW_EXCEPTION(kphp::exception::make_throwable(std::move(err_msg))); + return {}; + } + return res; +} 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