From eb37e02fd4c0f36a8d483d80f194454160f09d9b Mon Sep 17 00:00:00 2001 From: Dmitry Arkhipov Date: Fri, 5 Jul 2024 21:36:02 +0300 Subject: [PATCH 1/2] short circuit serializer::read on empty buffer --- include/boost/json/impl/serializer.ipp | 3 +++ test/serializer.cpp | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/include/boost/json/impl/serializer.ipp b/include/boost/json/impl/serializer.ipp index 5a0baea32..89c6b4ade 100644 --- a/include/boost/json/impl/serializer.ipp +++ b/include/boost/json/impl/serializer.ipp @@ -542,6 +542,9 @@ read(char* dest, std::size_t size) if( !fn0_ ) reset(nullptr); + if(BOOST_JSON_UNLIKELY(size == 0)) + return {dest, 0}; + detail::stream ss(dest, size); if(st_.empty()) fn0_(*this, ss); diff --git a/test/serializer.cpp b/test/serializer.cpp index 5cb257b6e..d2f82a9e1 100644 --- a/test/serializer.cpp +++ b/test/serializer.cpp @@ -896,6 +896,10 @@ class serializer_test void run() { + { + serializer sr; + BOOST_ASSERT( sr.read(nullptr, 0).empty() ); + } testNull(); testBoolean(); testString(); From a0471295a82c0ada9aedb6a6ecd17c073dacc0c8 Mon Sep 17 00:00:00 2001 From: Dmitry Arkhipov Date: Wed, 10 Jul 2024 11:56:14 +0300 Subject: [PATCH 2/2] remove unnecessary branch in string serialization --- include/boost/json/impl/serializer.ipp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/include/boost/json/impl/serializer.ipp b/include/boost/json/impl/serializer.ipp index 89c6b4ade..56f39ade4 100644 --- a/include/boost/json/impl/serializer.ipp +++ b/include/boost/json/impl/serializer.ipp @@ -310,10 +310,8 @@ do_str3: return w.suspend(writer::state::str3); do_esc1: - if(BOOST_JSON_LIKELY(ss)) - ss.append(w.buf_[0]); - else - return w.suspend(writer::state::esc1); + BOOST_ASSERT(ss); + ss.append(w.buf_[0]); goto do_str3; do_utf1: