/src/msgpack-c/include/msgpack/v2/parse.hpp
Line | Count | Source (jump to first uncovered line) |
1 | | // |
2 | | // MessagePack for C++ deserializing routine |
3 | | // |
4 | | // Copyright (C) 2016-2017 KONDO Takatoshi |
5 | | // |
6 | | // Distributed under the Boost Software License, Version 1.0. |
7 | | // (See accompanying file LICENSE_1_0.txt or copy at |
8 | | // http://www.boost.org/LICENSE_1_0.txt) |
9 | | // |
10 | | #ifndef MSGPACK_V2_PARSE_HPP |
11 | | #define MSGPACK_V2_PARSE_HPP |
12 | | |
13 | | #if MSGPACK_DEFAULT_API_VERSION >= 2 |
14 | | |
15 | | #include <cstddef> |
16 | | |
17 | | #include "msgpack/unpack_define.hpp" |
18 | | #include "msgpack/parse_return.hpp" |
19 | | #include "msgpack/unpack_exception.hpp" |
20 | | #include "msgpack/unpack_decl.hpp" |
21 | | #include "msgpack/assert.hpp" |
22 | | |
23 | | namespace msgpack { |
24 | | |
25 | | /// @cond |
26 | | MSGPACK_API_VERSION_NAMESPACE(v2) { |
27 | | /// @endcond |
28 | | |
29 | | namespace detail { |
30 | | |
31 | | using v1::detail::fix_tag; |
32 | | using v1::detail::value; |
33 | | using v1::detail::load; |
34 | | |
35 | | template <typename VisitorHolder> |
36 | | class context { |
37 | | public: |
38 | | context() |
39 | | :m_trail(0), m_cs(MSGPACK_CS_HEADER) |
40 | 2.25k | { |
41 | 2.25k | } |
42 | | |
43 | | void init() |
44 | 0 | { |
45 | 0 | m_cs = MSGPACK_CS_HEADER; |
46 | 0 | m_trail = 0; |
47 | 0 | m_stack.clear(); |
48 | 0 | holder().visitor().init(); |
49 | 0 | } |
50 | | |
51 | | parse_return execute(const char* data, std::size_t len, std::size_t& off); |
52 | | |
53 | | private: |
54 | | template <typename T> |
55 | | static uint32_t next_cs(T p) |
56 | 623k | { |
57 | 623k | return static_cast<uint32_t>(*p) & 0x1f; |
58 | 623k | } unsigned int msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::next_cs<char const*>(char const*) Line | Count | Source | 56 | 623k | { | 57 | 623k | return static_cast<uint32_t>(*p) & 0x1f; | 58 | 623k | } |
Unexecuted instantiation: unsigned int msgpack::v2::detail::context<msgpack::v2::unpacker>::next_cs<char const*>(char const*) |
59 | | |
60 | 4.51M | VisitorHolder& holder() { |
61 | 4.51M | return static_cast<VisitorHolder&>(*this); |
62 | 4.51M | } msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::holder() Line | Count | Source | 60 | 4.51M | VisitorHolder& holder() { | 61 | 4.51M | return static_cast<VisitorHolder&>(*this); | 62 | 4.51M | } |
Unexecuted instantiation: msgpack::v2::detail::context<msgpack::v2::unpacker>::holder() |
63 | | |
64 | | template <typename T, typename StartVisitor, typename EndVisitor> |
65 | | parse_return start_aggregate( |
66 | | StartVisitor const& sv, |
67 | | EndVisitor const& ev, |
68 | | const char* load_pos, |
69 | 424k | std::size_t& off) { |
70 | 424k | typename value<T>::type size; |
71 | 424k | load<T>(size, load_pos); |
72 | 424k | ++m_current; |
73 | 424k | if (size == 0) { |
74 | 64.1k | if (!sv(size)) { |
75 | 0 | off = static_cast<std::size_t>(m_current - m_start); |
76 | 0 | return PARSE_STOP_VISITOR; |
77 | 0 | } |
78 | 64.1k | if (!ev()) { |
79 | 0 | off = static_cast<std::size_t>(m_current - m_start); |
80 | 0 | return PARSE_STOP_VISITOR; |
81 | 0 | } |
82 | 64.1k | parse_return ret = m_stack.consume(holder()); |
83 | 64.1k | if (ret != PARSE_CONTINUE) { |
84 | 71 | off = static_cast<std::size_t>(m_current - m_start); |
85 | 71 | return ret; |
86 | 71 | } |
87 | 64.1k | } |
88 | 360k | else { |
89 | 360k | if (!sv(size)) { |
90 | 0 | off = static_cast<std::size_t>(m_current - m_start); |
91 | 0 | return PARSE_STOP_VISITOR; |
92 | 0 | } |
93 | 360k | parse_return ret = m_stack.push(holder(), sv.type(), static_cast<uint32_t>(size)); |
94 | 360k | if (ret != PARSE_CONTINUE) { |
95 | 0 | off = static_cast<std::size_t>(m_current - m_start); |
96 | 0 | return ret; |
97 | 0 | } |
98 | 360k | } |
99 | 424k | m_cs = MSGPACK_CS_HEADER; |
100 | 424k | return PARSE_CONTINUE; |
101 | 424k | } msgpack::v2::parse_return msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::start_aggregate<msgpack::v1::detail::fix_tag, msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::array_sv, msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::array_ev>(msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::array_sv const&, msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::array_ev const&, char const*, unsigned long&) Line | Count | Source | 69 | 165k | std::size_t& off) { | 70 | 165k | typename value<T>::type size; | 71 | 165k | load<T>(size, load_pos); | 72 | 165k | ++m_current; | 73 | 165k | if (size == 0) { | 74 | 23.3k | if (!sv(size)) { | 75 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 76 | 0 | return PARSE_STOP_VISITOR; | 77 | 0 | } | 78 | 23.3k | if (!ev()) { | 79 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 80 | 0 | return PARSE_STOP_VISITOR; | 81 | 0 | } | 82 | 23.3k | parse_return ret = m_stack.consume(holder()); | 83 | 23.3k | if (ret != PARSE_CONTINUE) { | 84 | 28 | off = static_cast<std::size_t>(m_current - m_start); | 85 | 28 | return ret; | 86 | 28 | } | 87 | 23.3k | } | 88 | 141k | else { | 89 | 141k | if (!sv(size)) { | 90 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 91 | 0 | return PARSE_STOP_VISITOR; | 92 | 0 | } | 93 | 141k | parse_return ret = m_stack.push(holder(), sv.type(), static_cast<uint32_t>(size)); | 94 | 141k | if (ret != PARSE_CONTINUE) { | 95 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 96 | 0 | return ret; | 97 | 0 | } | 98 | 141k | } | 99 | 165k | m_cs = MSGPACK_CS_HEADER; | 100 | 165k | return PARSE_CONTINUE; | 101 | 165k | } |
msgpack::v2::parse_return msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::start_aggregate<msgpack::v1::detail::fix_tag, msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::map_sv, msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::map_ev>(msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::map_sv const&, msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::map_ev const&, char const*, unsigned long&) Line | Count | Source | 69 | 240k | std::size_t& off) { | 70 | 240k | typename value<T>::type size; | 71 | 240k | load<T>(size, load_pos); | 72 | 240k | ++m_current; | 73 | 240k | if (size == 0) { | 74 | 28.5k | if (!sv(size)) { | 75 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 76 | 0 | return PARSE_STOP_VISITOR; | 77 | 0 | } | 78 | 28.5k | if (!ev()) { | 79 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 80 | 0 | return PARSE_STOP_VISITOR; | 81 | 0 | } | 82 | 28.5k | parse_return ret = m_stack.consume(holder()); | 83 | 28.5k | if (ret != PARSE_CONTINUE) { | 84 | 37 | off = static_cast<std::size_t>(m_current - m_start); | 85 | 37 | return ret; | 86 | 37 | } | 87 | 28.5k | } | 88 | 211k | else { | 89 | 211k | if (!sv(size)) { | 90 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 91 | 0 | return PARSE_STOP_VISITOR; | 92 | 0 | } | 93 | 211k | parse_return ret = m_stack.push(holder(), sv.type(), static_cast<uint32_t>(size)); | 94 | 211k | if (ret != PARSE_CONTINUE) { | 95 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 96 | 0 | return ret; | 97 | 0 | } | 98 | 211k | } | 99 | 240k | m_cs = MSGPACK_CS_HEADER; | 100 | 240k | return PARSE_CONTINUE; | 101 | 240k | } |
msgpack::v2::parse_return msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::start_aggregate<unsigned short, msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::array_sv, msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::array_ev>(msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::array_sv const&, msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::array_ev const&, char const*, unsigned long&) Line | Count | Source | 69 | 10.6k | std::size_t& off) { | 70 | 10.6k | typename value<T>::type size; | 71 | 10.6k | load<T>(size, load_pos); | 72 | 10.6k | ++m_current; | 73 | 10.6k | if (size == 0) { | 74 | 7.15k | if (!sv(size)) { | 75 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 76 | 0 | return PARSE_STOP_VISITOR; | 77 | 0 | } | 78 | 7.15k | if (!ev()) { | 79 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 80 | 0 | return PARSE_STOP_VISITOR; | 81 | 0 | } | 82 | 7.15k | parse_return ret = m_stack.consume(holder()); | 83 | 7.15k | if (ret != PARSE_CONTINUE) { | 84 | 2 | off = static_cast<std::size_t>(m_current - m_start); | 85 | 2 | return ret; | 86 | 2 | } | 87 | 7.15k | } | 88 | 3.45k | else { | 89 | 3.45k | if (!sv(size)) { | 90 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 91 | 0 | return PARSE_STOP_VISITOR; | 92 | 0 | } | 93 | 3.45k | parse_return ret = m_stack.push(holder(), sv.type(), static_cast<uint32_t>(size)); | 94 | 3.45k | if (ret != PARSE_CONTINUE) { | 95 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 96 | 0 | return ret; | 97 | 0 | } | 98 | 3.45k | } | 99 | 10.6k | m_cs = MSGPACK_CS_HEADER; | 100 | 10.6k | return PARSE_CONTINUE; | 101 | 10.6k | } |
msgpack::v2::parse_return msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::start_aggregate<unsigned int, msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::array_sv, msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::array_ev>(msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::array_sv const&, msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::array_ev const&, char const*, unsigned long&) Line | Count | Source | 69 | 1.78k | std::size_t& off) { | 70 | 1.78k | typename value<T>::type size; | 71 | 1.78k | load<T>(size, load_pos); | 72 | 1.78k | ++m_current; | 73 | 1.78k | if (size == 0) { | 74 | 1.39k | if (!sv(size)) { | 75 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 76 | 0 | return PARSE_STOP_VISITOR; | 77 | 0 | } | 78 | 1.39k | if (!ev()) { | 79 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 80 | 0 | return PARSE_STOP_VISITOR; | 81 | 0 | } | 82 | 1.39k | parse_return ret = m_stack.consume(holder()); | 83 | 1.39k | if (ret != PARSE_CONTINUE) { | 84 | 1 | off = static_cast<std::size_t>(m_current - m_start); | 85 | 1 | return ret; | 86 | 1 | } | 87 | 1.39k | } | 88 | 387 | else { | 89 | 387 | if (!sv(size)) { | 90 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 91 | 0 | return PARSE_STOP_VISITOR; | 92 | 0 | } | 93 | 387 | parse_return ret = m_stack.push(holder(), sv.type(), static_cast<uint32_t>(size)); | 94 | 387 | if (ret != PARSE_CONTINUE) { | 95 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 96 | 0 | return ret; | 97 | 0 | } | 98 | 387 | } | 99 | 1.78k | m_cs = MSGPACK_CS_HEADER; | 100 | 1.78k | return PARSE_CONTINUE; | 101 | 1.78k | } |
msgpack::v2::parse_return msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::start_aggregate<unsigned short, msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::map_sv, msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::map_ev>(msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::map_sv const&, msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::map_ev const&, char const*, unsigned long&) Line | Count | Source | 69 | 3.16k | std::size_t& off) { | 70 | 3.16k | typename value<T>::type size; | 71 | 3.16k | load<T>(size, load_pos); | 72 | 3.16k | ++m_current; | 73 | 3.16k | if (size == 0) { | 74 | 1.04k | if (!sv(size)) { | 75 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 76 | 0 | return PARSE_STOP_VISITOR; | 77 | 0 | } | 78 | 1.04k | if (!ev()) { | 79 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 80 | 0 | return PARSE_STOP_VISITOR; | 81 | 0 | } | 82 | 1.04k | parse_return ret = m_stack.consume(holder()); | 83 | 1.04k | if (ret != PARSE_CONTINUE) { | 84 | 1 | off = static_cast<std::size_t>(m_current - m_start); | 85 | 1 | return ret; | 86 | 1 | } | 87 | 1.04k | } | 88 | 2.12k | else { | 89 | 2.12k | if (!sv(size)) { | 90 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 91 | 0 | return PARSE_STOP_VISITOR; | 92 | 0 | } | 93 | 2.12k | parse_return ret = m_stack.push(holder(), sv.type(), static_cast<uint32_t>(size)); | 94 | 2.12k | if (ret != PARSE_CONTINUE) { | 95 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 96 | 0 | return ret; | 97 | 0 | } | 98 | 2.12k | } | 99 | 3.16k | m_cs = MSGPACK_CS_HEADER; | 100 | 3.16k | return PARSE_CONTINUE; | 101 | 3.16k | } |
msgpack::v2::parse_return msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::start_aggregate<unsigned int, msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::map_sv, msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::map_ev>(msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::map_sv const&, msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::map_ev const&, char const*, unsigned long&) Line | Count | Source | 69 | 3.17k | std::size_t& off) { | 70 | 3.17k | typename value<T>::type size; | 71 | 3.17k | load<T>(size, load_pos); | 72 | 3.17k | ++m_current; | 73 | 3.17k | if (size == 0) { | 74 | 2.71k | if (!sv(size)) { | 75 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 76 | 0 | return PARSE_STOP_VISITOR; | 77 | 0 | } | 78 | 2.71k | if (!ev()) { | 79 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 80 | 0 | return PARSE_STOP_VISITOR; | 81 | 0 | } | 82 | 2.71k | parse_return ret = m_stack.consume(holder()); | 83 | 2.71k | if (ret != PARSE_CONTINUE) { | 84 | 2 | off = static_cast<std::size_t>(m_current - m_start); | 85 | 2 | return ret; | 86 | 2 | } | 87 | 2.71k | } | 88 | 463 | else { | 89 | 463 | if (!sv(size)) { | 90 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 91 | 0 | return PARSE_STOP_VISITOR; | 92 | 0 | } | 93 | 463 | parse_return ret = m_stack.push(holder(), sv.type(), static_cast<uint32_t>(size)); | 94 | 463 | if (ret != PARSE_CONTINUE) { | 95 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 96 | 0 | return ret; | 97 | 0 | } | 98 | 463 | } | 99 | 3.17k | m_cs = MSGPACK_CS_HEADER; | 100 | 3.17k | return PARSE_CONTINUE; | 101 | 3.17k | } |
Unexecuted instantiation: msgpack::v2::parse_return msgpack::v2::detail::context<msgpack::v2::unpacker>::start_aggregate<msgpack::v1::detail::fix_tag, msgpack::v2::detail::context<msgpack::v2::unpacker>::array_sv, msgpack::v2::detail::context<msgpack::v2::unpacker>::array_ev>(msgpack::v2::detail::context<msgpack::v2::unpacker>::array_sv const&, msgpack::v2::detail::context<msgpack::v2::unpacker>::array_ev const&, char const*, unsigned long&) Unexecuted instantiation: msgpack::v2::parse_return msgpack::v2::detail::context<msgpack::v2::unpacker>::start_aggregate<msgpack::v1::detail::fix_tag, msgpack::v2::detail::context<msgpack::v2::unpacker>::map_sv, msgpack::v2::detail::context<msgpack::v2::unpacker>::map_ev>(msgpack::v2::detail::context<msgpack::v2::unpacker>::map_sv const&, msgpack::v2::detail::context<msgpack::v2::unpacker>::map_ev const&, char const*, unsigned long&) Unexecuted instantiation: msgpack::v2::parse_return msgpack::v2::detail::context<msgpack::v2::unpacker>::start_aggregate<unsigned short, msgpack::v2::detail::context<msgpack::v2::unpacker>::array_sv, msgpack::v2::detail::context<msgpack::v2::unpacker>::array_ev>(msgpack::v2::detail::context<msgpack::v2::unpacker>::array_sv const&, msgpack::v2::detail::context<msgpack::v2::unpacker>::array_ev const&, char const*, unsigned long&) Unexecuted instantiation: msgpack::v2::parse_return msgpack::v2::detail::context<msgpack::v2::unpacker>::start_aggregate<unsigned int, msgpack::v2::detail::context<msgpack::v2::unpacker>::array_sv, msgpack::v2::detail::context<msgpack::v2::unpacker>::array_ev>(msgpack::v2::detail::context<msgpack::v2::unpacker>::array_sv const&, msgpack::v2::detail::context<msgpack::v2::unpacker>::array_ev const&, char const*, unsigned long&) Unexecuted instantiation: msgpack::v2::parse_return msgpack::v2::detail::context<msgpack::v2::unpacker>::start_aggregate<unsigned short, msgpack::v2::detail::context<msgpack::v2::unpacker>::map_sv, msgpack::v2::detail::context<msgpack::v2::unpacker>::map_ev>(msgpack::v2::detail::context<msgpack::v2::unpacker>::map_sv const&, msgpack::v2::detail::context<msgpack::v2::unpacker>::map_ev const&, char const*, unsigned long&) Unexecuted instantiation: msgpack::v2::parse_return msgpack::v2::detail::context<msgpack::v2::unpacker>::start_aggregate<unsigned int, msgpack::v2::detail::context<msgpack::v2::unpacker>::map_sv, msgpack::v2::detail::context<msgpack::v2::unpacker>::map_ev>(msgpack::v2::detail::context<msgpack::v2::unpacker>::map_sv const&, msgpack::v2::detail::context<msgpack::v2::unpacker>::map_ev const&, char const*, unsigned long&) |
102 | | |
103 | 1.62M | parse_return after_visit_proc(bool visit_result, std::size_t& off) { |
104 | 1.62M | ++m_current; |
105 | 1.62M | if (!visit_result) { |
106 | 0 | off = static_cast<std::size_t>(m_current - m_start); |
107 | 0 | return PARSE_STOP_VISITOR; |
108 | 0 | } |
109 | 1.62M | parse_return ret = m_stack.consume(holder()); |
110 | 1.62M | if (ret != PARSE_CONTINUE) { |
111 | 1.12k | off = static_cast<std::size_t>(m_current - m_start); |
112 | 1.12k | } |
113 | 1.62M | m_cs = MSGPACK_CS_HEADER; |
114 | 1.62M | return ret; |
115 | 1.62M | } msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::after_visit_proc(bool, unsigned long&) Line | Count | Source | 103 | 1.62M | parse_return after_visit_proc(bool visit_result, std::size_t& off) { | 104 | 1.62M | ++m_current; | 105 | 1.62M | if (!visit_result) { | 106 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 107 | 0 | return PARSE_STOP_VISITOR; | 108 | 0 | } | 109 | 1.62M | parse_return ret = m_stack.consume(holder()); | 110 | 1.62M | if (ret != PARSE_CONTINUE) { | 111 | 1.12k | off = static_cast<std::size_t>(m_current - m_start); | 112 | 1.12k | } | 113 | 1.62M | m_cs = MSGPACK_CS_HEADER; | 114 | 1.62M | return ret; | 115 | 1.62M | } |
Unexecuted instantiation: msgpack::v2::detail::context<msgpack::v2::unpacker>::after_visit_proc(bool, unsigned long&) |
116 | | |
117 | | struct array_sv { |
118 | 177k | array_sv(VisitorHolder& visitor_holder):m_visitor_holder(visitor_holder) {} |
119 | 177k | bool operator()(uint32_t size) const { |
120 | 177k | return m_visitor_holder.visitor().start_array(size); |
121 | 177k | } msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::array_sv::operator()(unsigned int) const Line | Count | Source | 119 | 177k | bool operator()(uint32_t size) const { | 120 | 177k | return m_visitor_holder.visitor().start_array(size); | 121 | 177k | } |
Unexecuted instantiation: msgpack::v2::detail::context<msgpack::v2::unpacker>::array_sv::operator()(unsigned int) const |
122 | 145k | msgpack_container_type type() const { return MSGPACK_CT_ARRAY_ITEM; } msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::array_sv::type() const Line | Count | Source | 122 | 145k | msgpack_container_type type() const { return MSGPACK_CT_ARRAY_ITEM; } |
Unexecuted instantiation: msgpack::v2::detail::context<msgpack::v2::unpacker>::array_sv::type() const |
123 | | private: |
124 | | VisitorHolder& m_visitor_holder; |
125 | | }; |
126 | | struct array_ev { |
127 | 177k | array_ev(VisitorHolder& visitor_holder):m_visitor_holder(visitor_holder) {} |
128 | 31.8k | bool operator()() const { |
129 | 31.8k | return m_visitor_holder.visitor().end_array(); |
130 | 31.8k | } msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::array_ev::operator()() const Line | Count | Source | 128 | 31.8k | bool operator()() const { | 129 | 31.8k | return m_visitor_holder.visitor().end_array(); | 130 | 31.8k | } |
Unexecuted instantiation: msgpack::v2::detail::context<msgpack::v2::unpacker>::array_ev::operator()() const |
131 | | private: |
132 | | VisitorHolder& m_visitor_holder; |
133 | | }; |
134 | | struct map_sv { |
135 | 246k | map_sv(VisitorHolder& visitor_holder):m_visitor_holder(visitor_holder) {} |
136 | 246k | bool operator()(uint32_t size) const { |
137 | 246k | return m_visitor_holder.visitor().start_map(size); |
138 | 246k | } msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::map_sv::operator()(unsigned int) const Line | Count | Source | 136 | 246k | bool operator()(uint32_t size) const { | 137 | 246k | return m_visitor_holder.visitor().start_map(size); | 138 | 246k | } |
Unexecuted instantiation: msgpack::v2::detail::context<msgpack::v2::unpacker>::map_sv::operator()(unsigned int) const |
139 | 214k | msgpack_container_type type() const { return MSGPACK_CT_MAP_KEY; } msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::map_sv::type() const Line | Count | Source | 139 | 214k | msgpack_container_type type() const { return MSGPACK_CT_MAP_KEY; } |
Unexecuted instantiation: msgpack::v2::detail::context<msgpack::v2::unpacker>::map_sv::type() const |
140 | | private: |
141 | | VisitorHolder& m_visitor_holder; |
142 | | }; |
143 | | struct map_ev { |
144 | 246k | map_ev(VisitorHolder& visitor_holder):m_visitor_holder(visitor_holder) {} |
145 | 32.2k | bool operator()() const { |
146 | 32.2k | return m_visitor_holder.visitor().end_map(); |
147 | 32.2k | } msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::map_ev::operator()() const Line | Count | Source | 145 | 32.2k | bool operator()() const { | 146 | 32.2k | return m_visitor_holder.visitor().end_map(); | 147 | 32.2k | } |
Unexecuted instantiation: msgpack::v2::detail::context<msgpack::v2::unpacker>::map_ev::operator()() const |
148 | | private: |
149 | | VisitorHolder& m_visitor_holder; |
150 | | }; |
151 | | |
152 | | struct unpack_stack { |
153 | | struct stack_elem { |
154 | 360k | stack_elem(msgpack_container_type type, uint32_t rest):m_type(type), m_rest(rest) {} |
155 | | msgpack_container_type m_type; |
156 | | uint32_t m_rest; |
157 | | }; |
158 | 2.25k | unpack_stack() { |
159 | 2.25k | m_stack.reserve(MSGPACK_EMBED_STACK_SIZE); |
160 | 2.25k | } |
161 | 360k | parse_return push(VisitorHolder& visitor_holder, msgpack_container_type type, uint32_t rest) { |
162 | 360k | m_stack.push_back(stack_elem(type, rest)); |
163 | 360k | switch (type) { |
164 | 145k | case MSGPACK_CT_ARRAY_ITEM: |
165 | 145k | return visitor_holder.visitor().start_array_item() ? PARSE_CONTINUE : PARSE_STOP_VISITOR; |
166 | 214k | case MSGPACK_CT_MAP_KEY: |
167 | 214k | return visitor_holder.visitor().start_map_key() ? PARSE_CONTINUE : PARSE_STOP_VISITOR; |
168 | 0 | case MSGPACK_CT_MAP_VALUE: |
169 | 0 | MSGPACK_ASSERT(0); |
170 | 0 | return PARSE_STOP_VISITOR; |
171 | 360k | } |
172 | 0 | MSGPACK_ASSERT(0); |
173 | 0 | return PARSE_STOP_VISITOR; |
174 | 360k | } msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::unpack_stack::push(msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor>&, msgpack_container_type, unsigned int) Line | Count | Source | 161 | 360k | parse_return push(VisitorHolder& visitor_holder, msgpack_container_type type, uint32_t rest) { | 162 | 360k | m_stack.push_back(stack_elem(type, rest)); | 163 | 360k | switch (type) { | 164 | 145k | case MSGPACK_CT_ARRAY_ITEM: | 165 | 145k | return visitor_holder.visitor().start_array_item() ? PARSE_CONTINUE : PARSE_STOP_VISITOR; | 166 | 214k | case MSGPACK_CT_MAP_KEY: | 167 | 214k | return visitor_holder.visitor().start_map_key() ? PARSE_CONTINUE : PARSE_STOP_VISITOR; | 168 | 0 | case MSGPACK_CT_MAP_VALUE: | 169 | 0 | MSGPACK_ASSERT(0); | 170 | 0 | return PARSE_STOP_VISITOR; | 171 | 360k | } | 172 | 0 | MSGPACK_ASSERT(0); | 173 | 0 | return PARSE_STOP_VISITOR; | 174 | 360k | } |
Unexecuted instantiation: msgpack::v2::detail::context<msgpack::v2::unpacker>::unpack_stack::push(msgpack::v2::unpacker&, msgpack_container_type, unsigned int) |
175 | 1.68M | parse_return consume(VisitorHolder& visitor_holder) { |
176 | 2.02M | while (!m_stack.empty()) { |
177 | 2.02M | stack_elem& e = m_stack.back(); |
178 | 2.02M | switch (e.m_type) { |
179 | 743k | case MSGPACK_CT_ARRAY_ITEM: |
180 | 743k | if (!visitor_holder.visitor().end_array_item()) return PARSE_STOP_VISITOR; |
181 | 743k | if (--e.m_rest == 0) { |
182 | 136k | m_stack.pop_back(); |
183 | 136k | if (!visitor_holder.visitor().end_array()) return PARSE_STOP_VISITOR; |
184 | 136k | } |
185 | 606k | else { |
186 | 606k | if (!visitor_holder.visitor().start_array_item()) return PARSE_STOP_VISITOR; |
187 | 606k | return PARSE_CONTINUE; |
188 | 606k | } |
189 | 136k | break; |
190 | 643k | case MSGPACK_CT_MAP_KEY: |
191 | 643k | if (!visitor_holder.visitor().end_map_key()) return PARSE_STOP_VISITOR; |
192 | 643k | if (!visitor_holder.visitor().start_map_value()) return PARSE_STOP_VISITOR; |
193 | 643k | e.m_type = MSGPACK_CT_MAP_VALUE; |
194 | 643k | return PARSE_CONTINUE; |
195 | 642k | case MSGPACK_CT_MAP_VALUE: |
196 | 642k | if (!visitor_holder.visitor().end_map_value()) return PARSE_STOP_VISITOR; |
197 | 642k | if (--e.m_rest == 0) { |
198 | 207k | m_stack.pop_back(); |
199 | 207k | if (!visitor_holder.visitor().end_map()) return PARSE_STOP_VISITOR; |
200 | 207k | } |
201 | 435k | else { |
202 | 435k | e.m_type = MSGPACK_CT_MAP_KEY; |
203 | 435k | if (!visitor_holder.visitor().start_map_key()) return PARSE_STOP_VISITOR; |
204 | 435k | return PARSE_CONTINUE; |
205 | 435k | } |
206 | 207k | break; |
207 | 2.02M | } |
208 | 2.02M | } |
209 | 1.19k | return PARSE_SUCCESS; |
210 | 1.68M | } msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::unpack_stack::consume(msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor>&) Line | Count | Source | 175 | 1.68M | parse_return consume(VisitorHolder& visitor_holder) { | 176 | 2.02M | while (!m_stack.empty()) { | 177 | 2.02M | stack_elem& e = m_stack.back(); | 178 | 2.02M | switch (e.m_type) { | 179 | 743k | case MSGPACK_CT_ARRAY_ITEM: | 180 | 743k | if (!visitor_holder.visitor().end_array_item()) return PARSE_STOP_VISITOR; | 181 | 743k | if (--e.m_rest == 0) { | 182 | 136k | m_stack.pop_back(); | 183 | 136k | if (!visitor_holder.visitor().end_array()) return PARSE_STOP_VISITOR; | 184 | 136k | } | 185 | 606k | else { | 186 | 606k | if (!visitor_holder.visitor().start_array_item()) return PARSE_STOP_VISITOR; | 187 | 606k | return PARSE_CONTINUE; | 188 | 606k | } | 189 | 136k | break; | 190 | 643k | case MSGPACK_CT_MAP_KEY: | 191 | 643k | if (!visitor_holder.visitor().end_map_key()) return PARSE_STOP_VISITOR; | 192 | 643k | if (!visitor_holder.visitor().start_map_value()) return PARSE_STOP_VISITOR; | 193 | 643k | e.m_type = MSGPACK_CT_MAP_VALUE; | 194 | 643k | return PARSE_CONTINUE; | 195 | 642k | case MSGPACK_CT_MAP_VALUE: | 196 | 642k | if (!visitor_holder.visitor().end_map_value()) return PARSE_STOP_VISITOR; | 197 | 642k | if (--e.m_rest == 0) { | 198 | 207k | m_stack.pop_back(); | 199 | 207k | if (!visitor_holder.visitor().end_map()) return PARSE_STOP_VISITOR; | 200 | 207k | } | 201 | 435k | else { | 202 | 435k | e.m_type = MSGPACK_CT_MAP_KEY; | 203 | 435k | if (!visitor_holder.visitor().start_map_key()) return PARSE_STOP_VISITOR; | 204 | 435k | return PARSE_CONTINUE; | 205 | 435k | } | 206 | 207k | break; | 207 | 2.02M | } | 208 | 2.02M | } | 209 | 1.19k | return PARSE_SUCCESS; | 210 | 1.68M | } |
Unexecuted instantiation: msgpack::v2::detail::context<msgpack::v2::unpacker>::unpack_stack::consume(msgpack::v2::unpacker&) |
211 | | bool empty() const { return m_stack.empty(); } |
212 | 0 | void clear() { m_stack.clear(); } |
213 | | private: |
214 | | std::vector<stack_elem> m_stack; |
215 | | }; |
216 | | |
217 | | char const* m_start; |
218 | | char const* m_current; |
219 | | |
220 | | std::size_t m_trail; |
221 | | uint32_t m_cs; |
222 | | uint32_t m_num_elements; |
223 | | unpack_stack m_stack; |
224 | | }; |
225 | | |
226 | | template <std::size_t N> |
227 | 194 | inline void check_ext_size(std::size_t /*size*/) { |
228 | 194 | } |
229 | | |
230 | | template <> |
231 | 0 | inline void check_ext_size<4>(std::size_t size) { |
232 | 0 | if (size == 0xffffffff) throw msgpack::ext_size_overflow("ext size overflow"); |
233 | 0 | } |
234 | | |
235 | | template <typename VisitorHolder> |
236 | | inline parse_return context<VisitorHolder>::execute(const char* data, std::size_t len, std::size_t& off) |
237 | 2.25k | { |
238 | 2.25k | MSGPACK_ASSERT(len >= off); |
239 | | |
240 | 0 | m_start = data; |
241 | 2.25k | m_current = data + off; |
242 | 2.25k | const char* const pe = data + len; |
243 | 2.25k | const char* n = MSGPACK_NULLPTR; |
244 | | |
245 | 2.25k | if(m_current == pe) { |
246 | 0 | off = static_cast<std::size_t>(m_current - m_start); |
247 | 0 | return PARSE_CONTINUE; |
248 | 0 | } |
249 | 2.25k | bool fixed_trail_again = false; |
250 | 2.06M | do { |
251 | 2.06M | if (m_cs == MSGPACK_CS_HEADER) { |
252 | 2.04M | fixed_trail_again = false; |
253 | 2.04M | int selector = *reinterpret_cast<const unsigned char*>(m_current); |
254 | 2.04M | if (0x00 <= selector && selector <= 0x7f) { // Positive Fixnum |
255 | 800k | uint8_t tmp = *reinterpret_cast<const uint8_t*>(m_current); |
256 | 800k | bool visret = holder().visitor().visit_positive_integer(tmp); |
257 | 800k | parse_return upr = after_visit_proc(visret, off); |
258 | 800k | if (upr != PARSE_CONTINUE) return upr; |
259 | 1.24M | } else if(0xe0 <= selector && selector <= 0xff) { // Negative Fixnum |
260 | 185k | int8_t tmp = *reinterpret_cast<const int8_t*>(m_current); |
261 | 185k | bool visret = holder().visitor().visit_negative_integer(tmp); |
262 | 185k | parse_return upr = after_visit_proc(visret, off); |
263 | 185k | if (upr != PARSE_CONTINUE) return upr; |
264 | 1.06M | } else if (0xc4 <= selector && selector <= 0xdf) { |
265 | 623k | const uint32_t trail[] = { |
266 | 623k | 1, // bin 8 0xc4 |
267 | 623k | 2, // bin 16 0xc5 |
268 | 623k | 4, // bin 32 0xc6 |
269 | 623k | 1, // ext 8 0xc7 |
270 | 623k | 2, // ext 16 0xc8 |
271 | 623k | 4, // ext 32 0xc9 |
272 | 623k | 4, // float 32 0xca |
273 | 623k | 8, // float 64 0xcb |
274 | 623k | 1, // uint 8 0xcc |
275 | 623k | 2, // uint 16 0xcd |
276 | 623k | 4, // uint 32 0xce |
277 | 623k | 8, // uint 64 0xcf |
278 | 623k | 1, // int 8 0xd0 |
279 | 623k | 2, // int 16 0xd1 |
280 | 623k | 4, // int 32 0xd2 |
281 | 623k | 8, // int 64 0xd3 |
282 | 623k | 2, // fixext 1 0xd4 |
283 | 623k | 3, // fixext 2 0xd5 |
284 | 623k | 5, // fixext 4 0xd6 |
285 | 623k | 9, // fixext 8 0xd7 |
286 | 623k | 17,// fixext 16 0xd8 |
287 | 623k | 1, // str 8 0xd9 |
288 | 623k | 2, // str 16 0xda |
289 | 623k | 4, // str 32 0xdb |
290 | 623k | 2, // array 16 0xdc |
291 | 623k | 4, // array 32 0xdd |
292 | 623k | 2, // map 16 0xde |
293 | 623k | 4, // map 32 0xdf |
294 | 623k | }; |
295 | 623k | m_trail = trail[selector - 0xc4]; |
296 | 623k | m_cs = next_cs(m_current); |
297 | 623k | fixed_trail_again = true; |
298 | 623k | } else if(0xa0 <= selector && selector <= 0xbf) { // FixStr |
299 | 16.5k | m_trail = static_cast<uint32_t>(*m_current) & 0x1f; |
300 | 16.5k | if(m_trail == 0) { |
301 | 3.46k | bool visret = holder().visitor().visit_str(n, static_cast<uint32_t>(m_trail)); |
302 | 3.46k | parse_return upr = after_visit_proc(visret, off); |
303 | 3.46k | if (upr != PARSE_CONTINUE) return upr; |
304 | 3.46k | } |
305 | 13.0k | else { |
306 | 13.0k | m_cs = MSGPACK_ACS_STR_VALUE; |
307 | 13.0k | fixed_trail_again = true; |
308 | 13.0k | } |
309 | 420k | } else if(0x90 <= selector && selector <= 0x9f) { // FixArray |
310 | 165k | parse_return ret = start_aggregate<fix_tag>(array_sv(holder()), array_ev(holder()), m_current, off); |
311 | 165k | if (ret != PARSE_CONTINUE) return ret; |
312 | 255k | } else if(0x80 <= selector && selector <= 0x8f) { // FixMap |
313 | 240k | parse_return ret = start_aggregate<fix_tag>(map_sv(holder()), map_ev(holder()), m_current, off); |
314 | 240k | if (ret != PARSE_CONTINUE) return ret; |
315 | 240k | } else if(selector == 0xc2) { // false |
316 | 1.67k | bool visret = holder().visitor().visit_boolean(false); |
317 | 1.67k | parse_return upr = after_visit_proc(visret, off); |
318 | 1.67k | if (upr != PARSE_CONTINUE) return upr; |
319 | 13.0k | } else if(selector == 0xc3) { // true |
320 | 8.35k | bool visret = holder().visitor().visit_boolean(true); |
321 | 8.35k | parse_return upr = after_visit_proc(visret, off); |
322 | 8.35k | if (upr != PARSE_CONTINUE) return upr; |
323 | 8.35k | } else if(selector == 0xc0) { // nil |
324 | 4.70k | bool visret = holder().visitor().visit_nil(); |
325 | 4.70k | parse_return upr = after_visit_proc(visret, off); |
326 | 4.70k | if (upr != PARSE_CONTINUE) return upr; |
327 | 4.70k | } else { |
328 | 1 | off = static_cast<std::size_t>(m_current - m_start); |
329 | 1 | holder().visitor().parse_error(off - 1, off); |
330 | 1 | return PARSE_PARSE_ERROR; |
331 | 1 | } |
332 | | // end MSGPACK_CS_HEADER |
333 | 2.04M | } |
334 | 2.06M | if (m_cs != MSGPACK_CS_HEADER || fixed_trail_again) { |
335 | 652k | if (fixed_trail_again) { |
336 | 652k | ++m_current; |
337 | 652k | fixed_trail_again = false; |
338 | 652k | } |
339 | 652k | if(static_cast<std::size_t>(pe - m_current) < m_trail) { |
340 | 253 | off = static_cast<std::size_t>(m_current - m_start); |
341 | 253 | return PARSE_CONTINUE; |
342 | 253 | } |
343 | 652k | n = m_current; |
344 | 652k | m_current += m_trail - 1; |
345 | 652k | switch(m_cs) { |
346 | | //case MSGPACK_CS_ |
347 | | //case MSGPACK_CS_ |
348 | 488k | case MSGPACK_CS_FLOAT: { |
349 | 488k | union { uint32_t i; float f; } mem; |
350 | 488k | load<uint32_t>(mem.i, n); |
351 | 488k | bool visret = holder().visitor().visit_float32(mem.f); |
352 | 488k | parse_return upr = after_visit_proc(visret, off); |
353 | 488k | if (upr != PARSE_CONTINUE) return upr; |
354 | 488k | } break; |
355 | 487k | case MSGPACK_CS_DOUBLE: { |
356 | 29.1k | union { uint64_t i; double f; } mem; |
357 | 29.1k | load<uint64_t>(mem.i, n); |
358 | | #if defined(TARGET_OS_IPHONE) |
359 | | // ok |
360 | | #elif defined(__arm__) && !(__ARM_EABI__) // arm-oabi |
361 | | // https://github.com/msgpack/msgpack-perl/pull/1 |
362 | | mem.i = (mem.i & 0xFFFFFFFFUL) << 32UL | (mem.i >> 32UL); |
363 | | #endif |
364 | 29.1k | bool visret = holder().visitor().visit_float64(mem.f); |
365 | 29.1k | parse_return upr = after_visit_proc(visret, off); |
366 | 29.1k | if (upr != PARSE_CONTINUE) return upr; |
367 | 29.1k | } break; |
368 | 29.0k | case MSGPACK_CS_UINT_8: { |
369 | 7.26k | uint8_t tmp; |
370 | 7.26k | load<uint8_t>(tmp, n); |
371 | 7.26k | bool visret = holder().visitor().visit_positive_integer(tmp); |
372 | 7.26k | parse_return upr = after_visit_proc(visret, off); |
373 | 7.26k | if (upr != PARSE_CONTINUE) return upr; |
374 | 7.26k | } break; |
375 | 7.25k | case MSGPACK_CS_UINT_16: { |
376 | 2.18k | uint16_t tmp; |
377 | 2.18k | load<uint16_t>(tmp, n); |
378 | 2.18k | bool visret = holder().visitor().visit_positive_integer(tmp); |
379 | 2.18k | parse_return upr = after_visit_proc(visret, off); |
380 | 2.18k | if (upr != PARSE_CONTINUE) return upr; |
381 | 2.18k | } break; |
382 | 2.15k | case MSGPACK_CS_UINT_32: { |
383 | 690 | uint32_t tmp; |
384 | 690 | load<uint32_t>(tmp, n); |
385 | 690 | bool visret = holder().visitor().visit_positive_integer(tmp); |
386 | 690 | parse_return upr = after_visit_proc(visret, off); |
387 | 690 | if (upr != PARSE_CONTINUE) return upr; |
388 | 690 | } break; |
389 | 4.85k | case MSGPACK_CS_UINT_64: { |
390 | 4.85k | uint64_t tmp; |
391 | 4.85k | load<uint64_t>(tmp, n); |
392 | 4.85k | bool visret = holder().visitor().visit_positive_integer(tmp); |
393 | 4.85k | parse_return upr = after_visit_proc(visret, off); |
394 | 4.85k | if (upr != PARSE_CONTINUE) return upr; |
395 | 4.85k | } break; |
396 | 4.78k | case MSGPACK_CS_INT_8: { |
397 | 2.88k | int8_t tmp; |
398 | 2.88k | load<int8_t>(tmp, n); |
399 | 2.88k | bool visret = holder().visitor().visit_negative_integer(tmp); |
400 | 2.88k | parse_return upr = after_visit_proc(visret, off); |
401 | 2.88k | if (upr != PARSE_CONTINUE) return upr; |
402 | 2.88k | } break; |
403 | 4.37k | case MSGPACK_CS_INT_16: { |
404 | 4.37k | int16_t tmp; |
405 | 4.37k | load<int16_t>(tmp, n); |
406 | 4.37k | bool visret = holder().visitor().visit_negative_integer(tmp); |
407 | 4.37k | parse_return upr = after_visit_proc(visret, off); |
408 | 4.37k | if (upr != PARSE_CONTINUE) return upr; |
409 | 4.37k | } break; |
410 | 4.32k | case MSGPACK_CS_INT_32: { |
411 | 2.18k | int32_t tmp; |
412 | 2.18k | load<int32_t>(tmp, n); |
413 | 2.18k | bool visret = holder().visitor().visit_negative_integer(tmp); |
414 | 2.18k | parse_return upr = after_visit_proc(visret, off); |
415 | 2.18k | if (upr != PARSE_CONTINUE) return upr; |
416 | 2.18k | } break; |
417 | 6.01k | case MSGPACK_CS_INT_64: { |
418 | 6.01k | int64_t tmp; |
419 | 6.01k | load<int64_t>(tmp, n); |
420 | 6.01k | bool visret = holder().visitor().visit_negative_integer(tmp); |
421 | 6.01k | parse_return upr = after_visit_proc(visret, off); |
422 | 6.01k | if (upr != PARSE_CONTINUE) return upr; |
423 | 6.01k | } break; |
424 | 5.86k | case MSGPACK_CS_FIXEXT_1: { |
425 | 1.45k | bool visret = holder().visitor().visit_ext(n, 1+1); |
426 | 1.45k | parse_return upr = after_visit_proc(visret, off); |
427 | 1.45k | if (upr != PARSE_CONTINUE) return upr; |
428 | 1.45k | } break; |
429 | 2.83k | case MSGPACK_CS_FIXEXT_2: { |
430 | 2.83k | bool visret = holder().visitor().visit_ext(n, 2+1); |
431 | 2.83k | parse_return upr = after_visit_proc(visret, off); |
432 | 2.83k | if (upr != PARSE_CONTINUE) return upr; |
433 | 2.83k | } break; |
434 | 2.83k | case MSGPACK_CS_FIXEXT_4: { |
435 | 2.13k | bool visret = holder().visitor().visit_ext(n, 4+1); |
436 | 2.13k | parse_return upr = after_visit_proc(visret, off); |
437 | 2.13k | if (upr != PARSE_CONTINUE) return upr; |
438 | 2.13k | } break; |
439 | 25.2k | case MSGPACK_CS_FIXEXT_8: { |
440 | 25.2k | bool visret = holder().visitor().visit_ext(n, 8+1); |
441 | 25.2k | parse_return upr = after_visit_proc(visret, off); |
442 | 25.2k | if (upr != PARSE_CONTINUE) return upr; |
443 | 25.2k | } break; |
444 | 25.2k | case MSGPACK_CS_FIXEXT_16: { |
445 | 905 | bool visret = holder().visitor().visit_ext(n, 16+1); |
446 | 905 | parse_return upr = after_visit_proc(visret, off); |
447 | 905 | if (upr != PARSE_CONTINUE) return upr; |
448 | 905 | } break; |
449 | 2.14k | case MSGPACK_CS_STR_8: { |
450 | 2.14k | uint8_t tmp; |
451 | 2.14k | load<uint8_t>(tmp, n); |
452 | 2.14k | m_trail = tmp; |
453 | 2.14k | if(m_trail == 0) { |
454 | 761 | bool visret = holder().visitor().visit_str(n, static_cast<uint32_t>(m_trail)); |
455 | 761 | parse_return upr = after_visit_proc(visret, off); |
456 | 761 | if (upr != PARSE_CONTINUE) return upr; |
457 | 761 | } |
458 | 1.38k | else { |
459 | 1.38k | m_cs = MSGPACK_ACS_STR_VALUE; |
460 | 1.38k | fixed_trail_again = true; |
461 | 1.38k | } |
462 | 2.14k | } break; |
463 | 3.26k | case MSGPACK_CS_BIN_8: { |
464 | 3.26k | uint8_t tmp; |
465 | 3.26k | load<uint8_t>(tmp, n); |
466 | 3.26k | m_trail = tmp; |
467 | 3.26k | if(m_trail == 0) { |
468 | 1.11k | bool visret = holder().visitor().visit_bin(n, static_cast<uint32_t>(m_trail)); |
469 | 1.11k | parse_return upr = after_visit_proc(visret, off); |
470 | 1.11k | if (upr != PARSE_CONTINUE) return upr; |
471 | 1.11k | } |
472 | 2.14k | else { |
473 | 2.14k | m_cs = MSGPACK_ACS_BIN_VALUE; |
474 | 2.14k | fixed_trail_again = true; |
475 | 2.14k | } |
476 | 3.26k | } break; |
477 | 3.25k | case MSGPACK_CS_EXT_8: { |
478 | 1.02k | uint8_t tmp; |
479 | 1.02k | load<uint8_t>(tmp, n); |
480 | 1.02k | m_trail = tmp + 1; |
481 | 1.02k | if(m_trail == 0) { |
482 | 0 | bool visret = holder().visitor().visit_ext(n, static_cast<uint32_t>(m_trail)); |
483 | 0 | parse_return upr = after_visit_proc(visret, off); |
484 | 0 | if (upr != PARSE_CONTINUE) return upr; |
485 | 0 | } |
486 | 1.02k | else { |
487 | 1.02k | m_cs = MSGPACK_ACS_EXT_VALUE; |
488 | 1.02k | fixed_trail_again = true; |
489 | 1.02k | } |
490 | 1.02k | } break; |
491 | 8.46k | case MSGPACK_CS_STR_16: { |
492 | 8.46k | uint16_t tmp; |
493 | 8.46k | load<uint16_t>(tmp, n); |
494 | 8.46k | m_trail = tmp; |
495 | 8.46k | if(m_trail == 0) { |
496 | 3.34k | bool visret = holder().visitor().visit_str(n, static_cast<uint32_t>(m_trail)); |
497 | 3.34k | parse_return upr = after_visit_proc(visret, off); |
498 | 3.34k | if (upr != PARSE_CONTINUE) return upr; |
499 | 3.34k | } |
500 | 5.11k | else { |
501 | 5.11k | m_cs = MSGPACK_ACS_STR_VALUE; |
502 | 5.11k | fixed_trail_again = true; |
503 | 5.11k | } |
504 | 8.46k | } break; |
505 | 8.46k | case MSGPACK_CS_BIN_16: { |
506 | 1.19k | uint16_t tmp; |
507 | 1.19k | load<uint16_t>(tmp, n); |
508 | 1.19k | m_trail = tmp; |
509 | 1.19k | if(m_trail == 0) { |
510 | 229 | bool visret = holder().visitor().visit_bin(n, static_cast<uint32_t>(m_trail)); |
511 | 229 | parse_return upr = after_visit_proc(visret, off); |
512 | 229 | if (upr != PARSE_CONTINUE) return upr; |
513 | 229 | } |
514 | 961 | else { |
515 | 961 | m_cs = MSGPACK_ACS_BIN_VALUE; |
516 | 961 | fixed_trail_again = true; |
517 | 961 | } |
518 | 1.19k | } break; |
519 | 2.60k | case MSGPACK_CS_EXT_16: { |
520 | 2.60k | uint16_t tmp; |
521 | 2.60k | load<uint16_t>(tmp, n); |
522 | 2.60k | m_trail = tmp + 1; |
523 | 2.60k | if(m_trail == 0) { |
524 | 0 | bool visret = holder().visitor().visit_ext(n, static_cast<uint32_t>(m_trail)); |
525 | 0 | parse_return upr = after_visit_proc(visret, off); |
526 | 0 | if (upr != PARSE_CONTINUE) return upr; |
527 | 0 | } |
528 | 2.60k | else { |
529 | 2.60k | m_cs = MSGPACK_ACS_EXT_VALUE; |
530 | 2.60k | fixed_trail_again = true; |
531 | 2.60k | } |
532 | 2.60k | } break; |
533 | 3.73k | case MSGPACK_CS_STR_32: { |
534 | 3.73k | uint32_t tmp; |
535 | 3.73k | load<uint32_t>(tmp, n); |
536 | 3.73k | m_trail = tmp; |
537 | 3.73k | if(m_trail == 0) { |
538 | 1.83k | bool visret = holder().visitor().visit_str(n, static_cast<uint32_t>(m_trail)); |
539 | 1.83k | parse_return upr = after_visit_proc(visret, off); |
540 | 1.83k | if (upr != PARSE_CONTINUE) return upr; |
541 | 1.83k | } |
542 | 1.90k | else { |
543 | 1.90k | m_cs = MSGPACK_ACS_STR_VALUE; |
544 | 1.90k | fixed_trail_again = true; |
545 | 1.90k | } |
546 | 3.73k | } break; |
547 | 3.73k | case MSGPACK_CS_BIN_32: { |
548 | 2.11k | uint32_t tmp; |
549 | 2.11k | load<uint32_t>(tmp, n); |
550 | 2.11k | m_trail = tmp; |
551 | 2.11k | if(m_trail == 0) { |
552 | 1.83k | bool visret = holder().visitor().visit_bin(n, static_cast<uint32_t>(m_trail)); |
553 | 1.83k | parse_return upr = after_visit_proc(visret, off); |
554 | 1.83k | if (upr != PARSE_CONTINUE) return upr; |
555 | 1.83k | } |
556 | 273 | else { |
557 | 273 | m_cs = MSGPACK_ACS_BIN_VALUE; |
558 | 273 | fixed_trail_again = true; |
559 | 273 | } |
560 | 2.11k | } break; |
561 | 2.11k | case MSGPACK_CS_EXT_32: { |
562 | 194 | uint32_t tmp; |
563 | 194 | load<uint32_t>(tmp, n); |
564 | 194 | check_ext_size<sizeof(std::size_t)>(tmp); |
565 | 194 | m_trail = tmp; |
566 | 194 | ++m_trail; |
567 | 194 | if(m_trail == 0) { |
568 | 0 | bool visret = holder().visitor().visit_ext(n, static_cast<uint32_t>(m_trail)); |
569 | 0 | parse_return upr = after_visit_proc(visret, off); |
570 | 0 | if (upr != PARSE_CONTINUE) return upr; |
571 | 0 | } |
572 | 194 | else { |
573 | 194 | m_cs = MSGPACK_ACS_EXT_VALUE; |
574 | 194 | fixed_trail_again = true; |
575 | 194 | } |
576 | 194 | } break; |
577 | 21.3k | case MSGPACK_ACS_STR_VALUE: { |
578 | 21.3k | bool visret = holder().visitor().visit_str(n, static_cast<uint32_t>(m_trail)); |
579 | 21.3k | parse_return upr = after_visit_proc(visret, off); |
580 | 21.3k | if (upr != PARSE_CONTINUE) return upr; |
581 | 21.3k | } break; |
582 | 21.2k | case MSGPACK_ACS_BIN_VALUE: { |
583 | 3.28k | bool visret = holder().visitor().visit_bin(n, static_cast<uint32_t>(m_trail)); |
584 | 3.28k | parse_return upr = after_visit_proc(visret, off); |
585 | 3.28k | if (upr != PARSE_CONTINUE) return upr; |
586 | 3.28k | } break; |
587 | 3.79k | case MSGPACK_ACS_EXT_VALUE: { |
588 | 3.79k | bool visret = holder().visitor().visit_ext(n, static_cast<uint32_t>(m_trail)); |
589 | 3.79k | parse_return upr = after_visit_proc(visret, off); |
590 | 3.79k | if (upr != PARSE_CONTINUE) return upr; |
591 | 3.79k | } break; |
592 | 10.6k | case MSGPACK_CS_ARRAY_16: { |
593 | 10.6k | parse_return ret = start_aggregate<uint16_t>(array_sv(holder()), array_ev(holder()), n, off); |
594 | 10.6k | if (ret != PARSE_CONTINUE) return ret; |
595 | | |
596 | 10.6k | } break; |
597 | 10.6k | case MSGPACK_CS_ARRAY_32: { |
598 | 1.78k | parse_return ret = start_aggregate<uint32_t>(array_sv(holder()), array_ev(holder()), n, off); |
599 | 1.78k | if (ret != PARSE_CONTINUE) return ret; |
600 | 1.78k | } break; |
601 | 3.16k | case MSGPACK_CS_MAP_16: { |
602 | 3.16k | parse_return ret = start_aggregate<uint16_t>(map_sv(holder()), map_ev(holder()), n, off); |
603 | 3.16k | if (ret != PARSE_CONTINUE) return ret; |
604 | 3.16k | } break; |
605 | 3.17k | case MSGPACK_CS_MAP_32: { |
606 | 3.17k | parse_return ret = start_aggregate<uint32_t>(map_sv(holder()), map_ev(holder()), n, off); |
607 | 3.17k | if (ret != PARSE_CONTINUE) return ret; |
608 | 3.17k | } break; |
609 | 3.17k | default: |
610 | 0 | off = static_cast<std::size_t>(m_current - m_start); |
611 | 0 | holder().visitor().parse_error(static_cast<std::size_t>(n - m_start - 1), static_cast<std::size_t>(n - m_start)); |
612 | 0 | return PARSE_PARSE_ERROR; |
613 | 652k | } |
614 | 652k | } |
615 | 2.06M | } while(m_current != pe); |
616 | | |
617 | 691 | off = static_cast<std::size_t>(m_current - m_start); |
618 | 691 | return PARSE_CONTINUE; |
619 | 2.25k | } msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::execute(char const*, unsigned long, unsigned long&) Line | Count | Source | 237 | 2.25k | { | 238 | 2.25k | MSGPACK_ASSERT(len >= off); | 239 | | | 240 | 0 | m_start = data; | 241 | 2.25k | m_current = data + off; | 242 | 2.25k | const char* const pe = data + len; | 243 | 2.25k | const char* n = MSGPACK_NULLPTR; | 244 | | | 245 | 2.25k | if(m_current == pe) { | 246 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 247 | 0 | return PARSE_CONTINUE; | 248 | 0 | } | 249 | 2.25k | bool fixed_trail_again = false; | 250 | 2.06M | do { | 251 | 2.06M | if (m_cs == MSGPACK_CS_HEADER) { | 252 | 2.04M | fixed_trail_again = false; | 253 | 2.04M | int selector = *reinterpret_cast<const unsigned char*>(m_current); | 254 | 2.04M | if (0x00 <= selector && selector <= 0x7f) { // Positive Fixnum | 255 | 800k | uint8_t tmp = *reinterpret_cast<const uint8_t*>(m_current); | 256 | 800k | bool visret = holder().visitor().visit_positive_integer(tmp); | 257 | 800k | parse_return upr = after_visit_proc(visret, off); | 258 | 800k | if (upr != PARSE_CONTINUE) return upr; | 259 | 1.24M | } else if(0xe0 <= selector && selector <= 0xff) { // Negative Fixnum | 260 | 185k | int8_t tmp = *reinterpret_cast<const int8_t*>(m_current); | 261 | 185k | bool visret = holder().visitor().visit_negative_integer(tmp); | 262 | 185k | parse_return upr = after_visit_proc(visret, off); | 263 | 185k | if (upr != PARSE_CONTINUE) return upr; | 264 | 1.06M | } else if (0xc4 <= selector && selector <= 0xdf) { | 265 | 623k | const uint32_t trail[] = { | 266 | 623k | 1, // bin 8 0xc4 | 267 | 623k | 2, // bin 16 0xc5 | 268 | 623k | 4, // bin 32 0xc6 | 269 | 623k | 1, // ext 8 0xc7 | 270 | 623k | 2, // ext 16 0xc8 | 271 | 623k | 4, // ext 32 0xc9 | 272 | 623k | 4, // float 32 0xca | 273 | 623k | 8, // float 64 0xcb | 274 | 623k | 1, // uint 8 0xcc | 275 | 623k | 2, // uint 16 0xcd | 276 | 623k | 4, // uint 32 0xce | 277 | 623k | 8, // uint 64 0xcf | 278 | 623k | 1, // int 8 0xd0 | 279 | 623k | 2, // int 16 0xd1 | 280 | 623k | 4, // int 32 0xd2 | 281 | 623k | 8, // int 64 0xd3 | 282 | 623k | 2, // fixext 1 0xd4 | 283 | 623k | 3, // fixext 2 0xd5 | 284 | 623k | 5, // fixext 4 0xd6 | 285 | 623k | 9, // fixext 8 0xd7 | 286 | 623k | 17,// fixext 16 0xd8 | 287 | 623k | 1, // str 8 0xd9 | 288 | 623k | 2, // str 16 0xda | 289 | 623k | 4, // str 32 0xdb | 290 | 623k | 2, // array 16 0xdc | 291 | 623k | 4, // array 32 0xdd | 292 | 623k | 2, // map 16 0xde | 293 | 623k | 4, // map 32 0xdf | 294 | 623k | }; | 295 | 623k | m_trail = trail[selector - 0xc4]; | 296 | 623k | m_cs = next_cs(m_current); | 297 | 623k | fixed_trail_again = true; | 298 | 623k | } else if(0xa0 <= selector && selector <= 0xbf) { // FixStr | 299 | 16.5k | m_trail = static_cast<uint32_t>(*m_current) & 0x1f; | 300 | 16.5k | if(m_trail == 0) { | 301 | 3.46k | bool visret = holder().visitor().visit_str(n, static_cast<uint32_t>(m_trail)); | 302 | 3.46k | parse_return upr = after_visit_proc(visret, off); | 303 | 3.46k | if (upr != PARSE_CONTINUE) return upr; | 304 | 3.46k | } | 305 | 13.0k | else { | 306 | 13.0k | m_cs = MSGPACK_ACS_STR_VALUE; | 307 | 13.0k | fixed_trail_again = true; | 308 | 13.0k | } | 309 | 420k | } else if(0x90 <= selector && selector <= 0x9f) { // FixArray | 310 | 165k | parse_return ret = start_aggregate<fix_tag>(array_sv(holder()), array_ev(holder()), m_current, off); | 311 | 165k | if (ret != PARSE_CONTINUE) return ret; | 312 | 255k | } else if(0x80 <= selector && selector <= 0x8f) { // FixMap | 313 | 240k | parse_return ret = start_aggregate<fix_tag>(map_sv(holder()), map_ev(holder()), m_current, off); | 314 | 240k | if (ret != PARSE_CONTINUE) return ret; | 315 | 240k | } else if(selector == 0xc2) { // false | 316 | 1.67k | bool visret = holder().visitor().visit_boolean(false); | 317 | 1.67k | parse_return upr = after_visit_proc(visret, off); | 318 | 1.67k | if (upr != PARSE_CONTINUE) return upr; | 319 | 13.0k | } else if(selector == 0xc3) { // true | 320 | 8.35k | bool visret = holder().visitor().visit_boolean(true); | 321 | 8.35k | parse_return upr = after_visit_proc(visret, off); | 322 | 8.35k | if (upr != PARSE_CONTINUE) return upr; | 323 | 8.35k | } else if(selector == 0xc0) { // nil | 324 | 4.70k | bool visret = holder().visitor().visit_nil(); | 325 | 4.70k | parse_return upr = after_visit_proc(visret, off); | 326 | 4.70k | if (upr != PARSE_CONTINUE) return upr; | 327 | 4.70k | } else { | 328 | 1 | off = static_cast<std::size_t>(m_current - m_start); | 329 | 1 | holder().visitor().parse_error(off - 1, off); | 330 | 1 | return PARSE_PARSE_ERROR; | 331 | 1 | } | 332 | | // end MSGPACK_CS_HEADER | 333 | 2.04M | } | 334 | 2.06M | if (m_cs != MSGPACK_CS_HEADER || fixed_trail_again) { | 335 | 652k | if (fixed_trail_again) { | 336 | 652k | ++m_current; | 337 | 652k | fixed_trail_again = false; | 338 | 652k | } | 339 | 652k | if(static_cast<std::size_t>(pe - m_current) < m_trail) { | 340 | 253 | off = static_cast<std::size_t>(m_current - m_start); | 341 | 253 | return PARSE_CONTINUE; | 342 | 253 | } | 343 | 652k | n = m_current; | 344 | 652k | m_current += m_trail - 1; | 345 | 652k | switch(m_cs) { | 346 | | //case MSGPACK_CS_ | 347 | | //case MSGPACK_CS_ | 348 | 488k | case MSGPACK_CS_FLOAT: { | 349 | 488k | union { uint32_t i; float f; } mem; | 350 | 488k | load<uint32_t>(mem.i, n); | 351 | 488k | bool visret = holder().visitor().visit_float32(mem.f); | 352 | 488k | parse_return upr = after_visit_proc(visret, off); | 353 | 488k | if (upr != PARSE_CONTINUE) return upr; | 354 | 488k | } break; | 355 | 487k | case MSGPACK_CS_DOUBLE: { | 356 | 29.1k | union { uint64_t i; double f; } mem; | 357 | 29.1k | load<uint64_t>(mem.i, n); | 358 | | #if defined(TARGET_OS_IPHONE) | 359 | | // ok | 360 | | #elif defined(__arm__) && !(__ARM_EABI__) // arm-oabi | 361 | | // https://github.com/msgpack/msgpack-perl/pull/1 | 362 | | mem.i = (mem.i & 0xFFFFFFFFUL) << 32UL | (mem.i >> 32UL); | 363 | | #endif | 364 | 29.1k | bool visret = holder().visitor().visit_float64(mem.f); | 365 | 29.1k | parse_return upr = after_visit_proc(visret, off); | 366 | 29.1k | if (upr != PARSE_CONTINUE) return upr; | 367 | 29.1k | } break; | 368 | 29.0k | case MSGPACK_CS_UINT_8: { | 369 | 7.26k | uint8_t tmp; | 370 | 7.26k | load<uint8_t>(tmp, n); | 371 | 7.26k | bool visret = holder().visitor().visit_positive_integer(tmp); | 372 | 7.26k | parse_return upr = after_visit_proc(visret, off); | 373 | 7.26k | if (upr != PARSE_CONTINUE) return upr; | 374 | 7.26k | } break; | 375 | 7.25k | case MSGPACK_CS_UINT_16: { | 376 | 2.18k | uint16_t tmp; | 377 | 2.18k | load<uint16_t>(tmp, n); | 378 | 2.18k | bool visret = holder().visitor().visit_positive_integer(tmp); | 379 | 2.18k | parse_return upr = after_visit_proc(visret, off); | 380 | 2.18k | if (upr != PARSE_CONTINUE) return upr; | 381 | 2.18k | } break; | 382 | 2.15k | case MSGPACK_CS_UINT_32: { | 383 | 690 | uint32_t tmp; | 384 | 690 | load<uint32_t>(tmp, n); | 385 | 690 | bool visret = holder().visitor().visit_positive_integer(tmp); | 386 | 690 | parse_return upr = after_visit_proc(visret, off); | 387 | 690 | if (upr != PARSE_CONTINUE) return upr; | 388 | 690 | } break; | 389 | 4.85k | case MSGPACK_CS_UINT_64: { | 390 | 4.85k | uint64_t tmp; | 391 | 4.85k | load<uint64_t>(tmp, n); | 392 | 4.85k | bool visret = holder().visitor().visit_positive_integer(tmp); | 393 | 4.85k | parse_return upr = after_visit_proc(visret, off); | 394 | 4.85k | if (upr != PARSE_CONTINUE) return upr; | 395 | 4.85k | } break; | 396 | 4.78k | case MSGPACK_CS_INT_8: { | 397 | 2.88k | int8_t tmp; | 398 | 2.88k | load<int8_t>(tmp, n); | 399 | 2.88k | bool visret = holder().visitor().visit_negative_integer(tmp); | 400 | 2.88k | parse_return upr = after_visit_proc(visret, off); | 401 | 2.88k | if (upr != PARSE_CONTINUE) return upr; | 402 | 2.88k | } break; | 403 | 4.37k | case MSGPACK_CS_INT_16: { | 404 | 4.37k | int16_t tmp; | 405 | 4.37k | load<int16_t>(tmp, n); | 406 | 4.37k | bool visret = holder().visitor().visit_negative_integer(tmp); | 407 | 4.37k | parse_return upr = after_visit_proc(visret, off); | 408 | 4.37k | if (upr != PARSE_CONTINUE) return upr; | 409 | 4.37k | } break; | 410 | 4.32k | case MSGPACK_CS_INT_32: { | 411 | 2.18k | int32_t tmp; | 412 | 2.18k | load<int32_t>(tmp, n); | 413 | 2.18k | bool visret = holder().visitor().visit_negative_integer(tmp); | 414 | 2.18k | parse_return upr = after_visit_proc(visret, off); | 415 | 2.18k | if (upr != PARSE_CONTINUE) return upr; | 416 | 2.18k | } break; | 417 | 6.01k | case MSGPACK_CS_INT_64: { | 418 | 6.01k | int64_t tmp; | 419 | 6.01k | load<int64_t>(tmp, n); | 420 | 6.01k | bool visret = holder().visitor().visit_negative_integer(tmp); | 421 | 6.01k | parse_return upr = after_visit_proc(visret, off); | 422 | 6.01k | if (upr != PARSE_CONTINUE) return upr; | 423 | 6.01k | } break; | 424 | 5.86k | case MSGPACK_CS_FIXEXT_1: { | 425 | 1.45k | bool visret = holder().visitor().visit_ext(n, 1+1); | 426 | 1.45k | parse_return upr = after_visit_proc(visret, off); | 427 | 1.45k | if (upr != PARSE_CONTINUE) return upr; | 428 | 1.45k | } break; | 429 | 2.83k | case MSGPACK_CS_FIXEXT_2: { | 430 | 2.83k | bool visret = holder().visitor().visit_ext(n, 2+1); | 431 | 2.83k | parse_return upr = after_visit_proc(visret, off); | 432 | 2.83k | if (upr != PARSE_CONTINUE) return upr; | 433 | 2.83k | } break; | 434 | 2.83k | case MSGPACK_CS_FIXEXT_4: { | 435 | 2.13k | bool visret = holder().visitor().visit_ext(n, 4+1); | 436 | 2.13k | parse_return upr = after_visit_proc(visret, off); | 437 | 2.13k | if (upr != PARSE_CONTINUE) return upr; | 438 | 2.13k | } break; | 439 | 25.2k | case MSGPACK_CS_FIXEXT_8: { | 440 | 25.2k | bool visret = holder().visitor().visit_ext(n, 8+1); | 441 | 25.2k | parse_return upr = after_visit_proc(visret, off); | 442 | 25.2k | if (upr != PARSE_CONTINUE) return upr; | 443 | 25.2k | } break; | 444 | 25.2k | case MSGPACK_CS_FIXEXT_16: { | 445 | 905 | bool visret = holder().visitor().visit_ext(n, 16+1); | 446 | 905 | parse_return upr = after_visit_proc(visret, off); | 447 | 905 | if (upr != PARSE_CONTINUE) return upr; | 448 | 905 | } break; | 449 | 2.14k | case MSGPACK_CS_STR_8: { | 450 | 2.14k | uint8_t tmp; | 451 | 2.14k | load<uint8_t>(tmp, n); | 452 | 2.14k | m_trail = tmp; | 453 | 2.14k | if(m_trail == 0) { | 454 | 761 | bool visret = holder().visitor().visit_str(n, static_cast<uint32_t>(m_trail)); | 455 | 761 | parse_return upr = after_visit_proc(visret, off); | 456 | 761 | if (upr != PARSE_CONTINUE) return upr; | 457 | 761 | } | 458 | 1.38k | else { | 459 | 1.38k | m_cs = MSGPACK_ACS_STR_VALUE; | 460 | 1.38k | fixed_trail_again = true; | 461 | 1.38k | } | 462 | 2.14k | } break; | 463 | 3.26k | case MSGPACK_CS_BIN_8: { | 464 | 3.26k | uint8_t tmp; | 465 | 3.26k | load<uint8_t>(tmp, n); | 466 | 3.26k | m_trail = tmp; | 467 | 3.26k | if(m_trail == 0) { | 468 | 1.11k | bool visret = holder().visitor().visit_bin(n, static_cast<uint32_t>(m_trail)); | 469 | 1.11k | parse_return upr = after_visit_proc(visret, off); | 470 | 1.11k | if (upr != PARSE_CONTINUE) return upr; | 471 | 1.11k | } | 472 | 2.14k | else { | 473 | 2.14k | m_cs = MSGPACK_ACS_BIN_VALUE; | 474 | 2.14k | fixed_trail_again = true; | 475 | 2.14k | } | 476 | 3.26k | } break; | 477 | 3.25k | case MSGPACK_CS_EXT_8: { | 478 | 1.02k | uint8_t tmp; | 479 | 1.02k | load<uint8_t>(tmp, n); | 480 | 1.02k | m_trail = tmp + 1; | 481 | 1.02k | if(m_trail == 0) { | 482 | 0 | bool visret = holder().visitor().visit_ext(n, static_cast<uint32_t>(m_trail)); | 483 | 0 | parse_return upr = after_visit_proc(visret, off); | 484 | 0 | if (upr != PARSE_CONTINUE) return upr; | 485 | 0 | } | 486 | 1.02k | else { | 487 | 1.02k | m_cs = MSGPACK_ACS_EXT_VALUE; | 488 | 1.02k | fixed_trail_again = true; | 489 | 1.02k | } | 490 | 1.02k | } break; | 491 | 8.46k | case MSGPACK_CS_STR_16: { | 492 | 8.46k | uint16_t tmp; | 493 | 8.46k | load<uint16_t>(tmp, n); | 494 | 8.46k | m_trail = tmp; | 495 | 8.46k | if(m_trail == 0) { | 496 | 3.34k | bool visret = holder().visitor().visit_str(n, static_cast<uint32_t>(m_trail)); | 497 | 3.34k | parse_return upr = after_visit_proc(visret, off); | 498 | 3.34k | if (upr != PARSE_CONTINUE) return upr; | 499 | 3.34k | } | 500 | 5.11k | else { | 501 | 5.11k | m_cs = MSGPACK_ACS_STR_VALUE; | 502 | 5.11k | fixed_trail_again = true; | 503 | 5.11k | } | 504 | 8.46k | } break; | 505 | 8.46k | case MSGPACK_CS_BIN_16: { | 506 | 1.19k | uint16_t tmp; | 507 | 1.19k | load<uint16_t>(tmp, n); | 508 | 1.19k | m_trail = tmp; | 509 | 1.19k | if(m_trail == 0) { | 510 | 229 | bool visret = holder().visitor().visit_bin(n, static_cast<uint32_t>(m_trail)); | 511 | 229 | parse_return upr = after_visit_proc(visret, off); | 512 | 229 | if (upr != PARSE_CONTINUE) return upr; | 513 | 229 | } | 514 | 961 | else { | 515 | 961 | m_cs = MSGPACK_ACS_BIN_VALUE; | 516 | 961 | fixed_trail_again = true; | 517 | 961 | } | 518 | 1.19k | } break; | 519 | 2.60k | case MSGPACK_CS_EXT_16: { | 520 | 2.60k | uint16_t tmp; | 521 | 2.60k | load<uint16_t>(tmp, n); | 522 | 2.60k | m_trail = tmp + 1; | 523 | 2.60k | if(m_trail == 0) { | 524 | 0 | bool visret = holder().visitor().visit_ext(n, static_cast<uint32_t>(m_trail)); | 525 | 0 | parse_return upr = after_visit_proc(visret, off); | 526 | 0 | if (upr != PARSE_CONTINUE) return upr; | 527 | 0 | } | 528 | 2.60k | else { | 529 | 2.60k | m_cs = MSGPACK_ACS_EXT_VALUE; | 530 | 2.60k | fixed_trail_again = true; | 531 | 2.60k | } | 532 | 2.60k | } break; | 533 | 3.73k | case MSGPACK_CS_STR_32: { | 534 | 3.73k | uint32_t tmp; | 535 | 3.73k | load<uint32_t>(tmp, n); | 536 | 3.73k | m_trail = tmp; | 537 | 3.73k | if(m_trail == 0) { | 538 | 1.83k | bool visret = holder().visitor().visit_str(n, static_cast<uint32_t>(m_trail)); | 539 | 1.83k | parse_return upr = after_visit_proc(visret, off); | 540 | 1.83k | if (upr != PARSE_CONTINUE) return upr; | 541 | 1.83k | } | 542 | 1.90k | else { | 543 | 1.90k | m_cs = MSGPACK_ACS_STR_VALUE; | 544 | 1.90k | fixed_trail_again = true; | 545 | 1.90k | } | 546 | 3.73k | } break; | 547 | 3.73k | case MSGPACK_CS_BIN_32: { | 548 | 2.11k | uint32_t tmp; | 549 | 2.11k | load<uint32_t>(tmp, n); | 550 | 2.11k | m_trail = tmp; | 551 | 2.11k | if(m_trail == 0) { | 552 | 1.83k | bool visret = holder().visitor().visit_bin(n, static_cast<uint32_t>(m_trail)); | 553 | 1.83k | parse_return upr = after_visit_proc(visret, off); | 554 | 1.83k | if (upr != PARSE_CONTINUE) return upr; | 555 | 1.83k | } | 556 | 273 | else { | 557 | 273 | m_cs = MSGPACK_ACS_BIN_VALUE; | 558 | 273 | fixed_trail_again = true; | 559 | 273 | } | 560 | 2.11k | } break; | 561 | 2.11k | case MSGPACK_CS_EXT_32: { | 562 | 194 | uint32_t tmp; | 563 | 194 | load<uint32_t>(tmp, n); | 564 | 194 | check_ext_size<sizeof(std::size_t)>(tmp); | 565 | 194 | m_trail = tmp; | 566 | 194 | ++m_trail; | 567 | 194 | if(m_trail == 0) { | 568 | 0 | bool visret = holder().visitor().visit_ext(n, static_cast<uint32_t>(m_trail)); | 569 | 0 | parse_return upr = after_visit_proc(visret, off); | 570 | 0 | if (upr != PARSE_CONTINUE) return upr; | 571 | 0 | } | 572 | 194 | else { | 573 | 194 | m_cs = MSGPACK_ACS_EXT_VALUE; | 574 | 194 | fixed_trail_again = true; | 575 | 194 | } | 576 | 194 | } break; | 577 | 21.3k | case MSGPACK_ACS_STR_VALUE: { | 578 | 21.3k | bool visret = holder().visitor().visit_str(n, static_cast<uint32_t>(m_trail)); | 579 | 21.3k | parse_return upr = after_visit_proc(visret, off); | 580 | 21.3k | if (upr != PARSE_CONTINUE) return upr; | 581 | 21.3k | } break; | 582 | 21.2k | case MSGPACK_ACS_BIN_VALUE: { | 583 | 3.28k | bool visret = holder().visitor().visit_bin(n, static_cast<uint32_t>(m_trail)); | 584 | 3.28k | parse_return upr = after_visit_proc(visret, off); | 585 | 3.28k | if (upr != PARSE_CONTINUE) return upr; | 586 | 3.28k | } break; | 587 | 3.79k | case MSGPACK_ACS_EXT_VALUE: { | 588 | 3.79k | bool visret = holder().visitor().visit_ext(n, static_cast<uint32_t>(m_trail)); | 589 | 3.79k | parse_return upr = after_visit_proc(visret, off); | 590 | 3.79k | if (upr != PARSE_CONTINUE) return upr; | 591 | 3.79k | } break; | 592 | 10.6k | case MSGPACK_CS_ARRAY_16: { | 593 | 10.6k | parse_return ret = start_aggregate<uint16_t>(array_sv(holder()), array_ev(holder()), n, off); | 594 | 10.6k | if (ret != PARSE_CONTINUE) return ret; | 595 | | | 596 | 10.6k | } break; | 597 | 10.6k | case MSGPACK_CS_ARRAY_32: { | 598 | 1.78k | parse_return ret = start_aggregate<uint32_t>(array_sv(holder()), array_ev(holder()), n, off); | 599 | 1.78k | if (ret != PARSE_CONTINUE) return ret; | 600 | 1.78k | } break; | 601 | 3.16k | case MSGPACK_CS_MAP_16: { | 602 | 3.16k | parse_return ret = start_aggregate<uint16_t>(map_sv(holder()), map_ev(holder()), n, off); | 603 | 3.16k | if (ret != PARSE_CONTINUE) return ret; | 604 | 3.16k | } break; | 605 | 3.17k | case MSGPACK_CS_MAP_32: { | 606 | 3.17k | parse_return ret = start_aggregate<uint32_t>(map_sv(holder()), map_ev(holder()), n, off); | 607 | 3.17k | if (ret != PARSE_CONTINUE) return ret; | 608 | 3.17k | } break; | 609 | 3.17k | default: | 610 | 0 | off = static_cast<std::size_t>(m_current - m_start); | 611 | 0 | holder().visitor().parse_error(static_cast<std::size_t>(n - m_start - 1), static_cast<std::size_t>(n - m_start)); | 612 | 0 | return PARSE_PARSE_ERROR; | 613 | 652k | } | 614 | 652k | } | 615 | 2.06M | } while(m_current != pe); | 616 | | | 617 | 691 | off = static_cast<std::size_t>(m_current - m_start); | 618 | 691 | return PARSE_CONTINUE; | 619 | 2.25k | } |
Unexecuted instantiation: msgpack::v2::detail::context<msgpack::v2::unpacker>::execute(char const*, unsigned long, unsigned long&) |
620 | | |
621 | | } // detail |
622 | | |
623 | | |
624 | | /// Parsing class for a stream deserialization. |
625 | | |
626 | | template <typename VisitorHolder, typename ReferencedBufferHook> |
627 | | class parser : public detail::context<VisitorHolder> { |
628 | | typedef parser<VisitorHolder, ReferencedBufferHook> this_type; |
629 | | typedef detail::context<VisitorHolder> context_type; |
630 | | public: |
631 | | /// Constructor |
632 | | /** |
633 | | * @param hook The handler that is called when buffer is allocated internally. |
634 | | * `hook` should be callable with char* parameter. |
635 | | * `parser` gives a chance to prepare finalizer. |
636 | | * See https://github.com/msgpack/msgpack-c/wiki/v2_0_cpp_visitor#parse-api |
637 | | * @param initial_buffer_size The memory size to allocate when unpacker is constructed. |
638 | | * |
639 | | */ |
640 | | parser(ReferencedBufferHook& hook, |
641 | | std::size_t initial_buffer_size = MSGPACK_UNPACKER_INIT_BUFFER_SIZE); |
642 | | |
643 | | #if !defined(MSGPACK_USE_CPP03) |
644 | | parser(this_type&& other); |
645 | | this_type& operator=(this_type&& other); |
646 | | #endif // !defined(MSGPACK_USE_CPP03) |
647 | | |
648 | | ~parser(); |
649 | | |
650 | | public: |
651 | | /// Reserve a buffer memory. |
652 | | /** |
653 | | * @param size The size of allocating memory. |
654 | | * |
655 | | * After returning this function, buffer_capacity() returns at least 'size'. |
656 | | * See: |
657 | | * https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_unpacker#msgpack-controls-a-buffer |
658 | | */ |
659 | | void reserve_buffer(std::size_t size = MSGPACK_UNPACKER_RESERVE_SIZE); |
660 | | |
661 | | /// Get buffer pointer. |
662 | | /** |
663 | | * You need to care about the memory is enable between buffer() and buffer() + buffer_capacity() |
664 | | * See: |
665 | | * https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_unpacker#msgpack-controls-a-buffer |
666 | | */ |
667 | | char* buffer(); |
668 | | |
669 | | /// Get buffer capacity. |
670 | | /** |
671 | | * @return The memory size that you can write. |
672 | | * |
673 | | * See: |
674 | | * https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_unpacker#msgpack-controls-a-buffer |
675 | | */ |
676 | | std::size_t buffer_capacity() const; |
677 | | |
678 | | /// Notify a buffer consumed information to msgpack::unpacker. |
679 | | /** |
680 | | * @param size The size of memory that you consumed. |
681 | | * |
682 | | * After copying the data to the memory that is pointed by buffer(), you need to call the |
683 | | * function to notify how many bytes are consumed. Then you can call next() functions. |
684 | | * |
685 | | * See: |
686 | | * https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_unpacker#msgpack-controls-a-buffer |
687 | | */ |
688 | | void buffer_consumed(std::size_t size); |
689 | | |
690 | | /// Unpack one msgpack::object. |
691 | | /** |
692 | | * |
693 | | * |
694 | | * @return If one msgpack::object is unpacked, then return true, if msgpack::object is incomplete |
695 | | * and additional data is required, then return false. If data format is invalid, throw |
696 | | * msgpack::parse_error. |
697 | | * |
698 | | * See: |
699 | | * https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_unpacker#msgpack-controls-a-buffer |
700 | | */ |
701 | | bool next(); |
702 | | |
703 | | /// Get message size. |
704 | | /** |
705 | | * @return Returns parsed_size() + nonparsed_size() |
706 | | */ |
707 | | std::size_t message_size() const; |
708 | | |
709 | | public: |
710 | | /// Get parsed message size. |
711 | | /** |
712 | | * @return Parsed message size. |
713 | | * |
714 | | * This function is usable when non-MessagePack message follows after |
715 | | * MessagePack message. |
716 | | */ |
717 | | std::size_t parsed_size() const; |
718 | | |
719 | | /// Get the address that is not parsed in the buffer. |
720 | | /** |
721 | | * @return Address of the buffer that is not parsed |
722 | | * |
723 | | * This function is usable when non-MessagePack message follows after |
724 | | * MessagePack message. |
725 | | */ |
726 | | char* nonparsed_buffer(); |
727 | | |
728 | | /// Get the size of the buffer that is not parsed. |
729 | | /** |
730 | | * @return Size of the buffer that is not parsed |
731 | | * |
732 | | * This function is usable when non-MessagePack message follows after |
733 | | * MessagePack message. |
734 | | */ |
735 | | std::size_t nonparsed_size() const; |
736 | | |
737 | | /// Skip the specified size of non-parsed buffer. |
738 | | /** |
739 | | * @param size to skip |
740 | | * |
741 | | * Note that the `size' argument must be smaller than nonparsed_size(). |
742 | | * This function is usable when non-MessagePack message follows after |
743 | | * MessagePack message. |
744 | | */ |
745 | | void skip_nonparsed_buffer(std::size_t size); |
746 | | |
747 | | /// Remove nonparsed buffer and reset the current position as a new start point. |
748 | | /** |
749 | | * This function is usable when non-MessagePack message follows after |
750 | | * MessagePack message. |
751 | | */ |
752 | | void remove_nonparsed_buffer(); |
753 | | |
754 | | void reset(); |
755 | | |
756 | | protected: |
757 | 0 | char* get_raw_buffer() { |
758 | 0 | return m_buffer; |
759 | 0 | } |
760 | | private: |
761 | | void expand_buffer(std::size_t size); |
762 | | parse_return execute_imp(); |
763 | | |
764 | | private: |
765 | | char* m_buffer; |
766 | | std::size_t m_used; |
767 | | std::size_t m_free; |
768 | | std::size_t m_off; |
769 | | std::size_t m_parsed; |
770 | | std::size_t m_initial_buffer_size; |
771 | | ReferencedBufferHook& m_referenced_buffer_hook; |
772 | | |
773 | | #if defined(MSGPACK_USE_CPP03) |
774 | | private: |
775 | | parser(const this_type&); |
776 | | this_type& operator=(const this_type&); |
777 | | #else // defined(MSGPACK_USE_CPP03) |
778 | | public: |
779 | | parser(const this_type&) = delete; |
780 | | this_type& operator=(const this_type&) = delete; |
781 | | #endif // defined(MSGPACK_USE_CPP03) |
782 | | }; |
783 | | |
784 | | template <typename VisitorHolder, typename ReferencedBufferHook> |
785 | | inline parser<VisitorHolder, ReferencedBufferHook>::parser( |
786 | | ReferencedBufferHook& hook, |
787 | | std::size_t initial_buffer_size) |
788 | | :m_referenced_buffer_hook(hook) |
789 | | { |
790 | | if(initial_buffer_size < COUNTER_SIZE) { |
791 | | initial_buffer_size = COUNTER_SIZE; |
792 | | } |
793 | | |
794 | | char* buffer = static_cast<char*>(::malloc(initial_buffer_size)); |
795 | | if(!buffer) { |
796 | | throw std::bad_alloc(); |
797 | | } |
798 | | |
799 | | m_buffer = buffer; |
800 | | m_used = COUNTER_SIZE; |
801 | | m_free = initial_buffer_size - m_used; |
802 | | m_off = COUNTER_SIZE; |
803 | | m_parsed = 0; |
804 | | m_initial_buffer_size = initial_buffer_size; |
805 | | |
806 | | detail::init_count(m_buffer); |
807 | | } |
808 | | |
809 | | #if !defined(MSGPACK_USE_CPP03) |
810 | | // Move constructor and move assignment operator |
811 | | |
812 | | template <typename VisitorHolder, typename ReferencedBufferHook> |
813 | | inline parser<VisitorHolder, ReferencedBufferHook>::parser(this_type&& other) |
814 | | :context_type(std::move(other)), |
815 | | m_buffer(other.m_buffer), |
816 | | m_used(other.m_used), |
817 | | m_free(other.m_free), |
818 | | m_off(other.m_off), |
819 | | m_parsed(other.m_parsed), |
820 | | m_initial_buffer_size(other.m_initial_buffer_size), |
821 | | m_referenced_buffer_hook(other.m_referenced_buffer_hook) { |
822 | | other.m_buffer = MSGPACK_NULLPTR; |
823 | | other.m_used = 0; |
824 | | other.m_free = 0; |
825 | | other.m_off = 0; |
826 | | other.m_parsed = 0; |
827 | | } |
828 | | |
829 | | template <typename VisitorHolder, typename ReferencedBufferHook> |
830 | | inline parser<VisitorHolder, ReferencedBufferHook>& parser<VisitorHolder, ReferencedBufferHook>::operator=(this_type&& other) { |
831 | | this->~parser(); |
832 | | new (this) this_type(std::move(other)); |
833 | | return *this; |
834 | | } |
835 | | |
836 | | #endif // !defined(MSGPACK_USE_CPP03) |
837 | | |
838 | | |
839 | | template <typename VisitorHolder, typename ReferencedBufferHook> |
840 | | inline parser<VisitorHolder, ReferencedBufferHook>::~parser() |
841 | | { |
842 | | // These checks are required for move operations. |
843 | | if (m_buffer) detail::decr_count(m_buffer); |
844 | | } |
845 | | |
846 | | |
847 | | template <typename VisitorHolder, typename ReferencedBufferHook> |
848 | | inline void parser<VisitorHolder, ReferencedBufferHook>::reserve_buffer(std::size_t size) |
849 | | { |
850 | | if(m_free >= size) return; |
851 | | expand_buffer(size); |
852 | | } |
853 | | |
854 | | template <typename VisitorHolder, typename ReferencedBufferHook> |
855 | | inline void parser<VisitorHolder, ReferencedBufferHook>::expand_buffer(std::size_t size) |
856 | | { |
857 | | if(m_used == m_off && detail::get_count(m_buffer) == 1 |
858 | | && !static_cast<VisitorHolder&>(*this).visitor().referenced()) { |
859 | | // rewind buffer |
860 | | m_free += m_used - COUNTER_SIZE; |
861 | | m_used = COUNTER_SIZE; |
862 | | m_off = COUNTER_SIZE; |
863 | | |
864 | | if(m_free >= size) return; |
865 | | } |
866 | | |
867 | | if(m_off == COUNTER_SIZE) { |
868 | | std::size_t next_size = (m_used + m_free) * 2; // include COUNTER_SIZE |
869 | | while(next_size < size + m_used) { |
870 | | std::size_t tmp_next_size = next_size * 2; |
871 | | if (tmp_next_size <= next_size) { |
872 | | next_size = size + m_used; |
873 | | break; |
874 | | } |
875 | | next_size = tmp_next_size; |
876 | | } |
877 | | |
878 | | char* tmp = static_cast<char*>(::realloc(m_buffer, next_size)); |
879 | | if(!tmp) { |
880 | | throw std::bad_alloc(); |
881 | | } |
882 | | |
883 | | m_buffer = tmp; |
884 | | m_free = next_size - m_used; |
885 | | |
886 | | } else { |
887 | | std::size_t next_size = m_initial_buffer_size; // include COUNTER_SIZE |
888 | | std::size_t not_parsed = m_used - m_off; |
889 | | while(next_size < size + not_parsed + COUNTER_SIZE) { |
890 | | std::size_t tmp_next_size = next_size * 2; |
891 | | if (tmp_next_size <= next_size) { |
892 | | next_size = size + not_parsed + COUNTER_SIZE; |
893 | | break; |
894 | | } |
895 | | next_size = tmp_next_size; |
896 | | } |
897 | | |
898 | | char* tmp = static_cast<char*>(::malloc(next_size)); |
899 | | if(!tmp) { |
900 | | throw std::bad_alloc(); |
901 | | } |
902 | | |
903 | | detail::init_count(tmp); |
904 | | |
905 | | std::memcpy(tmp+COUNTER_SIZE, m_buffer + m_off, not_parsed); |
906 | | |
907 | | if(static_cast<VisitorHolder&>(*this).referenced()) { |
908 | | try { |
909 | | m_referenced_buffer_hook(m_buffer); |
910 | | } |
911 | | catch (...) { |
912 | | ::free(tmp); |
913 | | throw; |
914 | | } |
915 | | static_cast<VisitorHolder&>(*this).set_referenced(false); |
916 | | } else { |
917 | | detail::decr_count(m_buffer); |
918 | | } |
919 | | |
920 | | m_buffer = tmp; |
921 | | m_used = not_parsed + COUNTER_SIZE; |
922 | | m_free = next_size - m_used; |
923 | | m_off = COUNTER_SIZE; |
924 | | } |
925 | | } |
926 | | |
927 | | template <typename VisitorHolder, typename ReferencedBufferHook> |
928 | | inline char* parser<VisitorHolder, ReferencedBufferHook>::buffer() |
929 | | { |
930 | | return m_buffer + m_used; |
931 | | } |
932 | | |
933 | | template <typename VisitorHolder, typename ReferencedBufferHook> |
934 | | inline std::size_t parser<VisitorHolder, ReferencedBufferHook>::buffer_capacity() const |
935 | | { |
936 | | return m_free; |
937 | | } |
938 | | |
939 | | template <typename VisitorHolder, typename ReferencedBufferHook> |
940 | | inline void parser<VisitorHolder, ReferencedBufferHook>::buffer_consumed(std::size_t size) |
941 | | { |
942 | | m_used += size; |
943 | | m_free -= size; |
944 | | } |
945 | | |
946 | | template <typename VisitorHolder, typename ReferencedBufferHook> |
947 | | inline bool parser<VisitorHolder, ReferencedBufferHook>::next() |
948 | 0 | { |
949 | 0 | parse_return ret = execute_imp(); |
950 | 0 | return ret == PARSE_SUCCESS; |
951 | 0 | } |
952 | | |
953 | | template <typename VisitorHolder, typename ReferencedBufferHook> |
954 | | inline parse_return parser<VisitorHolder, ReferencedBufferHook>::execute_imp() |
955 | 0 | { |
956 | 0 | std::size_t off = m_off; |
957 | 0 | parse_return ret = context_type::execute(m_buffer, m_used, m_off); |
958 | 0 | if(m_off > off) { |
959 | 0 | m_parsed += m_off - off; |
960 | 0 | } |
961 | 0 | return ret; |
962 | 0 | } |
963 | | |
964 | | template <typename VisitorHolder, typename ReferencedBufferHook> |
965 | | inline void parser<VisitorHolder, ReferencedBufferHook>::reset() |
966 | 0 | { |
967 | 0 | context_type::init(); |
968 | 0 | // don't reset referenced flag |
969 | 0 | m_parsed = 0; |
970 | 0 | } |
971 | | |
972 | | template <typename VisitorHolder, typename ReferencedBufferHook> |
973 | | inline std::size_t parser<VisitorHolder, ReferencedBufferHook>::message_size() const |
974 | | { |
975 | | return m_parsed - m_off + m_used; |
976 | | } |
977 | | |
978 | | template <typename VisitorHolder, typename ReferencedBufferHook> |
979 | | inline std::size_t parser<VisitorHolder, ReferencedBufferHook>::parsed_size() const |
980 | | { |
981 | | return m_parsed; |
982 | | } |
983 | | |
984 | | template <typename VisitorHolder, typename ReferencedBufferHook> |
985 | | inline char* parser<VisitorHolder, ReferencedBufferHook>::nonparsed_buffer() |
986 | | { |
987 | | return m_buffer + m_off; |
988 | | } |
989 | | |
990 | | template <typename VisitorHolder, typename ReferencedBufferHook> |
991 | | inline std::size_t parser<VisitorHolder, ReferencedBufferHook>::nonparsed_size() const |
992 | | { |
993 | | return m_used - m_off; |
994 | | } |
995 | | |
996 | | template <typename VisitorHolder, typename ReferencedBufferHook> |
997 | | inline void parser<VisitorHolder, ReferencedBufferHook>::skip_nonparsed_buffer(std::size_t size) |
998 | | { |
999 | | m_off += size; |
1000 | | } |
1001 | | |
1002 | | template <typename VisitorHolder, typename ReferencedBufferHook> |
1003 | | inline void parser<VisitorHolder, ReferencedBufferHook>::remove_nonparsed_buffer() |
1004 | | { |
1005 | | m_used = m_off; |
1006 | | } |
1007 | | |
1008 | | template <typename Visitor> |
1009 | | inline bool parse(const char* data, size_t len, size_t& off, Visitor& v) { |
1010 | | parse_return ret = msgpack::detail::parse_imp(data, len, off, v); |
1011 | | return ret == PARSE_SUCCESS || ret == PARSE_EXTRA_BYTES; |
1012 | | } |
1013 | | |
1014 | | template <typename Visitor> |
1015 | | inline bool parse(const char* data, size_t len, Visitor& v) { |
1016 | | std::size_t off = 0; |
1017 | | return msgpack::parse(data, len, off, v); |
1018 | | } |
1019 | | |
1020 | | namespace detail { |
1021 | | |
1022 | | template <typename Visitor> |
1023 | | struct parse_helper : detail::context<parse_helper<Visitor> > { |
1024 | 2.25k | parse_helper(Visitor& v):m_visitor(v) {} |
1025 | 2.25k | parse_return execute(const char* data, std::size_t len, std::size_t& off) { |
1026 | 2.25k | return detail::context<parse_helper<Visitor> >::execute(data, len, off); |
1027 | 2.25k | } |
1028 | 6.52M | Visitor& visitor() const { return m_visitor; } |
1029 | | Visitor& m_visitor; |
1030 | | }; |
1031 | | |
1032 | | template <typename Visitor> |
1033 | | inline parse_return |
1034 | 2.25k | parse_imp(const char* data, size_t len, size_t& off, Visitor& v) { |
1035 | 2.25k | std::size_t noff = off; |
1036 | | |
1037 | 2.25k | if(len <= noff) { |
1038 | | // FIXME |
1039 | 0 | v.insufficient_bytes(noff, noff); |
1040 | 0 | return PARSE_CONTINUE; |
1041 | 0 | } |
1042 | 2.25k | detail::parse_helper<Visitor> h(v); |
1043 | 2.25k | parse_return ret = h.execute(data, len, noff); |
1044 | 2.25k | switch (ret) { |
1045 | 942 | case PARSE_CONTINUE: |
1046 | 942 | off = noff; |
1047 | 942 | v.insufficient_bytes(noff - 1, noff); |
1048 | 942 | return ret; |
1049 | 1.19k | case PARSE_SUCCESS: |
1050 | 1.19k | off = noff; |
1051 | 1.19k | if(noff < len) { |
1052 | 50 | return PARSE_EXTRA_BYTES; |
1053 | 50 | } |
1054 | 1.14k | return ret; |
1055 | 0 | default: |
1056 | 0 | return ret; |
1057 | 2.25k | } |
1058 | 2.25k | } |
1059 | | |
1060 | | } // detail |
1061 | | |
1062 | | |
1063 | | /// @cond |
1064 | | } // MSGPACK_API_VERSION_NAMESPACE(v2) |
1065 | | /// @endcond |
1066 | | |
1067 | | } // namespace msgpack |
1068 | | |
1069 | | #endif // MSGPACK_DEFAULT_API_VERSION >= 2 |
1070 | | |
1071 | | #endif // MSGPACK_V2_PARSE_HPP |