Fix packer: store span_writer by reference, not copy
This commit is contained in:
@@ -164,7 +164,7 @@ inline result<body_info> get_body_info(const uint8_t *p, int size) {
|
|||||||
|
|
||||||
class packer {
|
class packer {
|
||||||
private:
|
private:
|
||||||
span_writer m_buf;
|
span_writer &m_buf;
|
||||||
|
|
||||||
template <typename T> void push_big_endian(T n) {
|
template <typename T> void push_big_endian(T n) {
|
||||||
auto p = reinterpret_cast<std::uint8_t *>(&n) + (sizeof(T) - 1);
|
auto p = reinterpret_cast<std::uint8_t *>(&n) + (sizeof(T) - 1);
|
||||||
@@ -178,8 +178,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
packer(uint8_t *data, size_t capacity) : m_buf(data, capacity) {}
|
packer(span_writer &buf) : m_buf(buf) {}
|
||||||
packer(span_writer buf) : m_buf(buf) {}
|
|
||||||
|
|
||||||
packer(const packer &) = delete;
|
packer(const packer &) = delete;
|
||||||
packer &operator=(const packer &) = delete;
|
packer &operator=(const packer &) = delete;
|
||||||
@@ -409,7 +408,8 @@ public:
|
|||||||
requires requires(const T &v) { { T::ext_id } -> std::convertible_to<int8_t>; v.as_tuple(); }
|
requires requires(const T &v) { { T::ext_id } -> std::convertible_to<int8_t>; v.as_tuple(); }
|
||||||
pack_result pack(const T &v) {
|
pack_result pack(const T &v) {
|
||||||
uint8_t ext_buf[256];
|
uint8_t ext_buf[256];
|
||||||
packer inner(ext_buf, sizeof(ext_buf));
|
span_writer ext_writer(ext_buf, sizeof(ext_buf));
|
||||||
|
packer inner(ext_writer);
|
||||||
auto r = inner.pack(v.as_tuple());
|
auto r = inner.pack(v.as_tuple());
|
||||||
if (!r) return r;
|
if (!r) return r;
|
||||||
return pack_ext(T::ext_id, inner.get_payload());
|
return pack_ext(T::ext_id, inner.get_payload());
|
||||||
|
|||||||
@@ -115,7 +115,8 @@ inline msgpack::result<size_t> encode_response_into(span_writer &out, uint32_t m
|
|||||||
body_p.pack(msg.as_tuple());
|
body_p.pack(msg.as_tuple());
|
||||||
|
|
||||||
auto inner_ext = out.subspan(envelope_hdr_len, ext16_header_len);
|
auto inner_ext = out.subspan(envelope_hdr_len, ext16_header_len);
|
||||||
msgpack::packer(inner_ext).pack_ext16_header(T::ext_id, static_cast<uint16_t>(body.size()));
|
msgpack::packer inner_ext_p(inner_ext);
|
||||||
|
inner_ext_p.pack_ext16_header(T::ext_id, static_cast<uint16_t>(body.size()));
|
||||||
|
|
||||||
size_t bin_len = inner_ext.size() + body.size();
|
size_t bin_len = inner_ext.size() + body.size();
|
||||||
uint32_t checksum = halfsiphash::hash32({inner_ext.data(), bin_len}, hash_key);
|
uint32_t checksum = halfsiphash::hash32({inner_ext.data(), bin_len}, hash_key);
|
||||||
|
|||||||
Reference in New Issue
Block a user