Merge branch 'ygj6-cpp_master' into cpp_master

This commit is contained in:
Takatoshi Kondo 2020-07-02 13:58:30 +09:00
commit 0e22de17b1
2 changed files with 42 additions and 14 deletions

View File

@ -14,6 +14,7 @@
#include <stdexcept> #include <stdexcept>
#include <cstring> #include <cstring>
#include <cassert>
namespace msgpack { namespace msgpack {
@ -68,11 +69,14 @@ public:
void write(const char* buf, size_t len) void write(const char* buf, size_t len)
{ {
assert(buf || len == 0);
if(m_alloc - m_size < len) { if(m_alloc - m_size < len) {
expand_buffer(len); expand_buffer(len);
} }
std::memcpy(m_data + m_size, buf, len); if(buf) {
m_size += len; std::memcpy(m_data + m_size, buf, len);
m_size += len;
}
} }
char* data() char* data()

View File

@ -10,6 +10,8 @@
#ifndef MSGPACK_V2_CREATE_OBJECT_VISITOR_HPP #ifndef MSGPACK_V2_CREATE_OBJECT_VISITOR_HPP
#define MSGPACK_V2_CREATE_OBJECT_VISITOR_HPP #define MSGPACK_V2_CREATE_OBJECT_VISITOR_HPP
#include <cassert>
#include "msgpack/unpack_decl.hpp" #include "msgpack/unpack_decl.hpp"
#include "msgpack/unpack_exception.hpp" #include "msgpack/unpack_exception.hpp"
#include "msgpack/v2/create_object_visitor_decl.hpp" #include "msgpack/v2/create_object_visitor_decl.hpp"
@ -106,19 +108,27 @@ public:
return true; return true;
} }
bool visit_str(const char* v, uint32_t size) { bool visit_str(const char* v, uint32_t size) {
assert(v || size == 0);
if (size > m_limit.str()) throw msgpack::str_size_overflow("str size overflow"); if (size > m_limit.str()) throw msgpack::str_size_overflow("str size overflow");
msgpack::object* obj = m_stack.back(); msgpack::object* obj = m_stack.back();
obj->type = msgpack::type::STR; obj->type = msgpack::type::STR;
if (m_func && m_func(obj->type, size, m_user_data)) { if (m_func && m_func(obj->type, size, m_user_data)) {
obj->via.str.ptr = v; obj->via.str.ptr = v;
obj->via.str.size = size;
set_referenced(true); set_referenced(true);
} }
else { else {
char* tmp = static_cast<char*>(zone().allocate_align(size, MSGPACK_ZONE_ALIGNOF(char))); if (v) {
std::memcpy(tmp, v, size); char* tmp = static_cast<char*>(zone().allocate_align(size, MSGPACK_ZONE_ALIGNOF(char)));
obj->via.str.ptr = tmp; std::memcpy(tmp, v, size);
obj->via.str.ptr = tmp;
obj->via.str.size = size;
}
else {
obj->via.str.ptr = MSGPACK_NULLPTR;
obj->via.str.size = 0;
}
} }
obj->via.str.size = size;
return true; return true;
} }
bool visit_bin(const char* v, uint32_t size) { bool visit_bin(const char* v, uint32_t size) {
@ -127,14 +137,21 @@ public:
obj->type = msgpack::type::BIN; obj->type = msgpack::type::BIN;
if (m_func && m_func(obj->type, size, m_user_data)) { if (m_func && m_func(obj->type, size, m_user_data)) {
obj->via.bin.ptr = v; obj->via.bin.ptr = v;
obj->via.bin.size = size;
set_referenced(true); set_referenced(true);
} }
else { else {
char* tmp = static_cast<char*>(zone().allocate_align(size, MSGPACK_ZONE_ALIGNOF(char))); if (v) {
std::memcpy(tmp, v, size); char* tmp = static_cast<char*>(zone().allocate_align(size, MSGPACK_ZONE_ALIGNOF(char)));
obj->via.bin.ptr = tmp; std::memcpy(tmp, v, size);
obj->via.bin.ptr = tmp;
obj->via.bin.size = size;
}
else {
obj->via.bin.ptr = MSGPACK_NULLPTR;
obj->via.bin.size = 0;
}
} }
obj->via.bin.size = size;
return true; return true;
} }
bool visit_ext(const char* v, uint32_t size) { bool visit_ext(const char* v, uint32_t size) {
@ -143,14 +160,21 @@ public:
obj->type = msgpack::type::EXT; obj->type = msgpack::type::EXT;
if (m_func && m_func(obj->type, size, m_user_data)) { if (m_func && m_func(obj->type, size, m_user_data)) {
obj->via.ext.ptr = v; obj->via.ext.ptr = v;
obj->via.ext.size = static_cast<uint32_t>(size - 1);
set_referenced(true); set_referenced(true);
} }
else { else {
char* tmp = static_cast<char*>(zone().allocate_align(size, MSGPACK_ZONE_ALIGNOF(char))); if (v) {
std::memcpy(tmp, v, size); char* tmp = static_cast<char*>(zone().allocate_align(size, MSGPACK_ZONE_ALIGNOF(char)));
obj->via.ext.ptr = tmp; std::memcpy(tmp, v, size);
obj->via.ext.ptr = tmp;
obj->via.ext.size = static_cast<uint32_t>(size - 1);
}
else {
obj->via.ext.ptr = MSGPACK_NULLPTR;
obj->via.ext.size = 0;
}
} }
obj->via.ext.size = static_cast<uint32_t>(size - 1);
return true; return true;
} }
bool start_array(uint32_t num_elements) { bool start_array(uint32_t num_elements) {