Coverage Report

Created: 2026-01-13 06:55

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/msgpack-c/include/msgpack/v2/parse.hpp
Line
Count
Source
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
2.20k
        :m_trail(0), m_cs(MSGPACK_CS_HEADER)
40
2.20k
    {
41
2.20k
    }
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
669k
    {
57
669k
        return static_cast<uint32_t>(*p) & 0x1f;
58
669k
    }
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
669k
    {
57
669k
        return static_cast<uint32_t>(*p) & 0x1f;
58
669k
    }
Unexecuted instantiation: unsigned int msgpack::v2::detail::context<msgpack::v2::unpacker>::next_cs<char const*>(char const*)
59
60
7.06M
    VisitorHolder& holder() {
61
7.06M
        return static_cast<VisitorHolder&>(*this);
62
7.06M
    }
msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::holder()
Line
Count
Source
60
7.06M
    VisitorHolder& holder() {
61
7.06M
        return static_cast<VisitorHolder&>(*this);
62
7.06M
    }
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
584k
        std::size_t& off) {
70
584k
        typename value<T>::type size;
71
584k
        load<T>(size, load_pos);
72
584k
        ++m_current;
73
584k
        if (size == 0) {
74
166k
            if (!sv(size)) {
75
0
                off = static_cast<std::size_t>(m_current - m_start);
76
0
                return PARSE_STOP_VISITOR;
77
0
            }
78
166k
            if (!ev()) {
79
0
                off = static_cast<std::size_t>(m_current - m_start);
80
0
                return PARSE_STOP_VISITOR;
81
0
            }
82
166k
            parse_return ret = m_stack.consume(holder());
83
166k
            if (ret != PARSE_CONTINUE) {
84
81
                off = static_cast<std::size_t>(m_current - m_start);
85
81
                return ret;
86
81
            }
87
166k
        }
88
417k
        else {
89
417k
            if (!sv(size)) {
90
0
                off = static_cast<std::size_t>(m_current - m_start);
91
0
                return PARSE_STOP_VISITOR;
92
0
            }
93
417k
            parse_return ret = m_stack.push(holder(), sv.type(), static_cast<uint32_t>(size));
94
417k
            if (ret != PARSE_CONTINUE) {
95
0
                off = static_cast<std::size_t>(m_current - m_start);
96
0
                return ret;
97
0
            }
98
417k
        }
99
584k
        m_cs = MSGPACK_CS_HEADER;
100
584k
        return PARSE_CONTINUE;
101
584k
    }
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
111k
        std::size_t& off) {
70
111k
        typename value<T>::type size;
71
111k
        load<T>(size, load_pos);
72
111k
        ++m_current;
73
111k
        if (size == 0) {
74
14.6k
            if (!sv(size)) {
75
0
                off = static_cast<std::size_t>(m_current - m_start);
76
0
                return PARSE_STOP_VISITOR;
77
0
            }
78
14.6k
            if (!ev()) {
79
0
                off = static_cast<std::size_t>(m_current - m_start);
80
0
                return PARSE_STOP_VISITOR;
81
0
            }
82
14.6k
            parse_return ret = m_stack.consume(holder());
83
14.6k
            if (ret != PARSE_CONTINUE) {
84
36
                off = static_cast<std::size_t>(m_current - m_start);
85
36
                return ret;
86
36
            }
87
14.6k
        }
88
96.6k
        else {
89
96.6k
            if (!sv(size)) {
90
0
                off = static_cast<std::size_t>(m_current - m_start);
91
0
                return PARSE_STOP_VISITOR;
92
0
            }
93
96.6k
            parse_return ret = m_stack.push(holder(), sv.type(), static_cast<uint32_t>(size));
94
96.6k
            if (ret != PARSE_CONTINUE) {
95
0
                off = static_cast<std::size_t>(m_current - m_start);
96
0
                return ret;
97
0
            }
98
96.6k
        }
99
111k
        m_cs = MSGPACK_CS_HEADER;
100
111k
        return PARSE_CONTINUE;
101
111k
    }
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
436k
        std::size_t& off) {
70
436k
        typename value<T>::type size;
71
436k
        load<T>(size, load_pos);
72
436k
        ++m_current;
73
436k
        if (size == 0) {
74
143k
            if (!sv(size)) {
75
0
                off = static_cast<std::size_t>(m_current - m_start);
76
0
                return PARSE_STOP_VISITOR;
77
0
            }
78
143k
            if (!ev()) {
79
0
                off = static_cast<std::size_t>(m_current - m_start);
80
0
                return PARSE_STOP_VISITOR;
81
0
            }
82
143k
            parse_return ret = m_stack.consume(holder());
83
143k
            if (ret != PARSE_CONTINUE) {
84
41
                off = static_cast<std::size_t>(m_current - m_start);
85
41
                return ret;
86
41
            }
87
143k
        }
88
293k
        else {
89
293k
            if (!sv(size)) {
90
0
                off = static_cast<std::size_t>(m_current - m_start);
91
0
                return PARSE_STOP_VISITOR;
92
0
            }
93
293k
            parse_return ret = m_stack.push(holder(), sv.type(), static_cast<uint32_t>(size));
94
293k
            if (ret != PARSE_CONTINUE) {
95
0
                off = static_cast<std::size_t>(m_current - m_start);
96
0
                return ret;
97
0
            }
98
293k
        }
99
436k
        m_cs = MSGPACK_CS_HEADER;
100
436k
        return PARSE_CONTINUE;
101
436k
    }
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
27.9k
        std::size_t& off) {
70
27.9k
        typename value<T>::type size;
71
27.9k
        load<T>(size, load_pos);
72
27.9k
        ++m_current;
73
27.9k
        if (size == 0) {
74
4.98k
            if (!sv(size)) {
75
0
                off = static_cast<std::size_t>(m_current - m_start);
76
0
                return PARSE_STOP_VISITOR;
77
0
            }
78
4.98k
            if (!ev()) {
79
0
                off = static_cast<std::size_t>(m_current - m_start);
80
0
                return PARSE_STOP_VISITOR;
81
0
            }
82
4.98k
            parse_return ret = m_stack.consume(holder());
83
4.98k
            if (ret != PARSE_CONTINUE) {
84
1
                off = static_cast<std::size_t>(m_current - m_start);
85
1
                return ret;
86
1
            }
87
4.98k
        }
88
22.9k
        else {
89
22.9k
            if (!sv(size)) {
90
0
                off = static_cast<std::size_t>(m_current - m_start);
91
0
                return PARSE_STOP_VISITOR;
92
0
            }
93
22.9k
            parse_return ret = m_stack.push(holder(), sv.type(), static_cast<uint32_t>(size));
94
22.9k
            if (ret != PARSE_CONTINUE) {
95
0
                off = static_cast<std::size_t>(m_current - m_start);
96
0
                return ret;
97
0
            }
98
22.9k
        }
99
27.9k
        m_cs = MSGPACK_CS_HEADER;
100
27.9k
        return PARSE_CONTINUE;
101
27.9k
    }
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.26k
        std::size_t& off) {
70
1.26k
        typename value<T>::type size;
71
1.26k
        load<T>(size, load_pos);
72
1.26k
        ++m_current;
73
1.26k
        if (size == 0) {
74
817
            if (!sv(size)) {
75
0
                off = static_cast<std::size_t>(m_current - m_start);
76
0
                return PARSE_STOP_VISITOR;
77
0
            }
78
817
            if (!ev()) {
79
0
                off = static_cast<std::size_t>(m_current - m_start);
80
0
                return PARSE_STOP_VISITOR;
81
0
            }
82
817
            parse_return ret = m_stack.consume(holder());
83
817
            if (ret != PARSE_CONTINUE) {
84
1
                off = static_cast<std::size_t>(m_current - m_start);
85
1
                return ret;
86
1
            }
87
817
        }
88
450
        else {
89
450
            if (!sv(size)) {
90
0
                off = static_cast<std::size_t>(m_current - m_start);
91
0
                return PARSE_STOP_VISITOR;
92
0
            }
93
450
            parse_return ret = m_stack.push(holder(), sv.type(), static_cast<uint32_t>(size));
94
450
            if (ret != PARSE_CONTINUE) {
95
0
                off = static_cast<std::size_t>(m_current - m_start);
96
0
                return ret;
97
0
            }
98
450
        }
99
1.26k
        m_cs = MSGPACK_CS_HEADER;
100
1.26k
        return PARSE_CONTINUE;
101
1.26k
    }
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
4.34k
        std::size_t& off) {
70
4.34k
        typename value<T>::type size;
71
4.34k
        load<T>(size, load_pos);
72
4.34k
        ++m_current;
73
4.34k
        if (size == 0) {
74
672
            if (!sv(size)) {
75
0
                off = static_cast<std::size_t>(m_current - m_start);
76
0
                return PARSE_STOP_VISITOR;
77
0
            }
78
672
            if (!ev()) {
79
0
                off = static_cast<std::size_t>(m_current - m_start);
80
0
                return PARSE_STOP_VISITOR;
81
0
            }
82
672
            parse_return ret = m_stack.consume(holder());
83
672
            if (ret != PARSE_CONTINUE) {
84
1
                off = static_cast<std::size_t>(m_current - m_start);
85
1
                return ret;
86
1
            }
87
672
        }
88
3.67k
        else {
89
3.67k
            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.67k
            parse_return ret = m_stack.push(holder(), sv.type(), static_cast<uint32_t>(size));
94
3.67k
            if (ret != PARSE_CONTINUE) {
95
0
                off = static_cast<std::size_t>(m_current - m_start);
96
0
                return ret;
97
0
            }
98
3.67k
        }
99
4.34k
        m_cs = MSGPACK_CS_HEADER;
100
4.34k
        return PARSE_CONTINUE;
101
4.34k
    }
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.31k
        std::size_t& off) {
70
3.31k
        typename value<T>::type size;
71
3.31k
        load<T>(size, load_pos);
72
3.31k
        ++m_current;
73
3.31k
        if (size == 0) {
74
2.47k
            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.47k
            if (!ev()) {
79
0
                off = static_cast<std::size_t>(m_current - m_start);
80
0
                return PARSE_STOP_VISITOR;
81
0
            }
82
2.47k
            parse_return ret = m_stack.consume(holder());
83
2.47k
            if (ret != PARSE_CONTINUE) {
84
1
                off = static_cast<std::size_t>(m_current - m_start);
85
1
                return ret;
86
1
            }
87
2.47k
        }
88
841
        else {
89
841
            if (!sv(size)) {
90
0
                off = static_cast<std::size_t>(m_current - m_start);
91
0
                return PARSE_STOP_VISITOR;
92
0
            }
93
841
            parse_return ret = m_stack.push(holder(), sv.type(), static_cast<uint32_t>(size));
94
841
            if (ret != PARSE_CONTINUE) {
95
0
                off = static_cast<std::size_t>(m_current - m_start);
96
0
                return ret;
97
0
            }
98
841
        }
99
3.31k
        m_cs = MSGPACK_CS_HEADER;
100
3.31k
        return PARSE_CONTINUE;
101
3.31k
    }
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
2.65M
    parse_return after_visit_proc(bool visit_result, std::size_t& off) {
104
2.65M
        ++m_current;
105
2.65M
        if (!visit_result) {
106
0
            off = static_cast<std::size_t>(m_current - m_start);
107
0
            return PARSE_STOP_VISITOR;
108
0
        }
109
2.65M
        parse_return ret = m_stack.consume(holder());
110
2.65M
        if (ret != PARSE_CONTINUE) {
111
984
            off = static_cast<std::size_t>(m_current - m_start);
112
984
        }
113
2.65M
        m_cs = MSGPACK_CS_HEADER;
114
2.65M
        return ret;
115
2.65M
    }
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
2.65M
    parse_return after_visit_proc(bool visit_result, std::size_t& off) {
104
2.65M
        ++m_current;
105
2.65M
        if (!visit_result) {
106
0
            off = static_cast<std::size_t>(m_current - m_start);
107
0
            return PARSE_STOP_VISITOR;
108
0
        }
109
2.65M
        parse_return ret = m_stack.consume(holder());
110
2.65M
        if (ret != PARSE_CONTINUE) {
111
984
            off = static_cast<std::size_t>(m_current - m_start);
112
984
        }
113
2.65M
        m_cs = MSGPACK_CS_HEADER;
114
2.65M
        return ret;
115
2.65M
    }
Unexecuted instantiation: msgpack::v2::detail::context<msgpack::v2::unpacker>::after_visit_proc(bool, unsigned long&)
116
117
    struct array_sv {
118
140k
        array_sv(VisitorHolder& visitor_holder):m_visitor_holder(visitor_holder) {}
119
140k
        bool operator()(uint32_t size) const {
120
140k
            return m_visitor_holder.visitor().start_array(size);
121
140k
        }
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
140k
        bool operator()(uint32_t size) const {
120
140k
            return m_visitor_holder.visitor().start_array(size);
121
140k
        }
Unexecuted instantiation: msgpack::v2::detail::context<msgpack::v2::unpacker>::array_sv::operator()(unsigned int) const
122
119k
        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
119k
        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
140k
        array_ev(VisitorHolder& visitor_holder):m_visitor_holder(visitor_holder) {}
128
20.4k
        bool operator()() const {
129
20.4k
            return m_visitor_holder.visitor().end_array();
130
20.4k
        }
msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::array_ev::operator()() const
Line
Count
Source
128
20.4k
        bool operator()() const {
129
20.4k
            return m_visitor_holder.visitor().end_array();
130
20.4k
        }
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
444k
        map_sv(VisitorHolder& visitor_holder):m_visitor_holder(visitor_holder) {}
136
444k
        bool operator()(uint32_t size) const {
137
444k
            return m_visitor_holder.visitor().start_map(size);
138
444k
        }
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
444k
        bool operator()(uint32_t size) const {
137
444k
            return m_visitor_holder.visitor().start_map(size);
138
444k
        }
Unexecuted instantiation: msgpack::v2::detail::context<msgpack::v2::unpacker>::map_sv::operator()(unsigned int) const
139
297k
        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
297k
        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
444k
        map_ev(VisitorHolder& visitor_holder):m_visitor_holder(visitor_holder) {}
145
146k
        bool operator()() const {
146
146k
            return m_visitor_holder.visitor().end_map();
147
146k
        }
msgpack::v2::detail::context<msgpack::v2::detail::parse_helper<msgpack::v2::detail::create_object_visitor> >::map_ev::operator()() const
Line
Count
Source
145
146k
        bool operator()() const {
146
146k
            return m_visitor_holder.visitor().end_map();
147
146k
        }
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
417k
            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.20k
        unpack_stack() {
159
2.20k
            m_stack.reserve(MSGPACK_EMBED_STACK_SIZE);
160
2.20k
        }
161
417k
        parse_return push(VisitorHolder& visitor_holder, msgpack_container_type type, uint32_t rest) {
162
417k
            m_stack.push_back(stack_elem(type, rest));
163
417k
            switch (type) {
164
119k
            case MSGPACK_CT_ARRAY_ITEM:
165
119k
                return visitor_holder.visitor().start_array_item() ? PARSE_CONTINUE : PARSE_STOP_VISITOR;
166
297k
            case MSGPACK_CT_MAP_KEY:
167
297k
                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
417k
            }
172
0
            MSGPACK_ASSERT(0);
173
0
            return PARSE_STOP_VISITOR;
174
0
        }
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
417k
        parse_return push(VisitorHolder& visitor_holder, msgpack_container_type type, uint32_t rest) {
162
417k
            m_stack.push_back(stack_elem(type, rest));
163
417k
            switch (type) {
164
119k
            case MSGPACK_CT_ARRAY_ITEM:
165
119k
                return visitor_holder.visitor().start_array_item() ? PARSE_CONTINUE : PARSE_STOP_VISITOR;
166
297k
            case MSGPACK_CT_MAP_KEY:
167
297k
                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
417k
            }
172
0
            MSGPACK_ASSERT(0);
173
0
            return PARSE_STOP_VISITOR;
174
0
        }
Unexecuted instantiation: msgpack::v2::detail::context<msgpack::v2::unpacker>::unpack_stack::push(msgpack::v2::unpacker&, msgpack_container_type, unsigned int)
175
2.82M
        parse_return consume(VisitorHolder& visitor_holder) {
176
3.22M
            while (!m_stack.empty()) {
177
3.22M
                stack_elem& e = m_stack.back();
178
3.22M
                switch (e.m_type) {
179
1.14M
                case MSGPACK_CT_ARRAY_ITEM:
180
1.14M
                    if (!visitor_holder.visitor().end_array_item()) return PARSE_STOP_VISITOR;
181
1.14M
                    if (--e.m_rest == 0)  {
182
110k
                        m_stack.pop_back();
183
110k
                        if (!visitor_holder.visitor().end_array()) return PARSE_STOP_VISITOR;
184
110k
                    }
185
1.03M
                    else {
186
1.03M
                        if (!visitor_holder.visitor().start_array_item()) return PARSE_STOP_VISITOR;
187
1.03M
                        return PARSE_CONTINUE;
188
1.03M
                    }
189
110k
                    break;
190
1.03M
                case MSGPACK_CT_MAP_KEY:
191
1.03M
                    if (!visitor_holder.visitor().end_map_key()) return PARSE_STOP_VISITOR;
192
1.03M
                    if (!visitor_holder.visitor().start_map_value()) return PARSE_STOP_VISITOR;
193
1.03M
                    e.m_type = MSGPACK_CT_MAP_VALUE;
194
1.03M
                    return PARSE_CONTINUE;
195
1.03M
                case MSGPACK_CT_MAP_VALUE:
196
1.03M
                    if (!visitor_holder.visitor().end_map_value()) return PARSE_STOP_VISITOR;
197
1.03M
                    if (--e.m_rest == 0) {
198
288k
                        m_stack.pop_back();
199
288k
                        if (!visitor_holder.visitor().end_map()) return PARSE_STOP_VISITOR;
200
288k
                    }
201
748k
                    else {
202
748k
                        e.m_type = MSGPACK_CT_MAP_KEY;
203
748k
                        if (!visitor_holder.visitor().start_map_key()) return PARSE_STOP_VISITOR;
204
748k
                        return PARSE_CONTINUE;
205
748k
                    }
206
288k
                    break;
207
3.22M
                }
208
3.22M
            }
209
1.06k
            return PARSE_SUCCESS;
210
2.82M
        }
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
2.82M
        parse_return consume(VisitorHolder& visitor_holder) {
176
3.22M
            while (!m_stack.empty()) {
177
3.22M
                stack_elem& e = m_stack.back();
178
3.22M
                switch (e.m_type) {
179
1.14M
                case MSGPACK_CT_ARRAY_ITEM:
180
1.14M
                    if (!visitor_holder.visitor().end_array_item()) return PARSE_STOP_VISITOR;
181
1.14M
                    if (--e.m_rest == 0)  {
182
110k
                        m_stack.pop_back();
183
110k
                        if (!visitor_holder.visitor().end_array()) return PARSE_STOP_VISITOR;
184
110k
                    }
185
1.03M
                    else {
186
1.03M
                        if (!visitor_holder.visitor().start_array_item()) return PARSE_STOP_VISITOR;
187
1.03M
                        return PARSE_CONTINUE;
188
1.03M
                    }
189
110k
                    break;
190
1.03M
                case MSGPACK_CT_MAP_KEY:
191
1.03M
                    if (!visitor_holder.visitor().end_map_key()) return PARSE_STOP_VISITOR;
192
1.03M
                    if (!visitor_holder.visitor().start_map_value()) return PARSE_STOP_VISITOR;
193
1.03M
                    e.m_type = MSGPACK_CT_MAP_VALUE;
194
1.03M
                    return PARSE_CONTINUE;
195
1.03M
                case MSGPACK_CT_MAP_VALUE:
196
1.03M
                    if (!visitor_holder.visitor().end_map_value()) return PARSE_STOP_VISITOR;
197
1.03M
                    if (--e.m_rest == 0) {
198
288k
                        m_stack.pop_back();
199
288k
                        if (!visitor_holder.visitor().end_map()) return PARSE_STOP_VISITOR;
200
288k
                    }
201
748k
                    else {
202
748k
                        e.m_type = MSGPACK_CT_MAP_KEY;
203
748k
                        if (!visitor_holder.visitor().start_map_key()) return PARSE_STOP_VISITOR;
204
748k
                        return PARSE_CONTINUE;
205
748k
                    }
206
288k
                    break;
207
3.22M
                }
208
3.22M
            }
209
1.06k
            return PARSE_SUCCESS;
210
2.82M
        }
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
428
inline void check_ext_size(std::size_t /*size*/) {
228
428
}
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.20k
{
238
2.20k
    MSGPACK_ASSERT(len >= off);
239
240
2.20k
    m_start = data;
241
2.20k
    m_current = data + off;
242
2.20k
    const char* const pe = data + len;
243
2.20k
    const char* n = MSGPACK_NULLPTR;
244
245
2.20k
    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.20k
    bool fixed_trail_again = false;
250
3.26M
    do {
251
3.26M
        if (m_cs == MSGPACK_CS_HEADER) {
252
3.24M
            fixed_trail_again = false;
253
3.24M
            int selector = *reinterpret_cast<const unsigned char*>(m_current);
254
3.24M
            if (0x00 <= selector && selector <= 0x7f) { // Positive Fixnum
255
1.33M
                uint8_t tmp = *reinterpret_cast<const uint8_t*>(m_current);
256
1.33M
                bool visret = holder().visitor().visit_positive_integer(tmp);
257
1.33M
                parse_return upr = after_visit_proc(visret, off);
258
1.33M
                if (upr != PARSE_CONTINUE) return upr;
259
1.90M
            } else if(0xe0 <= selector && selector <= 0xff) { // Negative Fixnum
260
337k
                int8_t tmp = *reinterpret_cast<const int8_t*>(m_current);
261
337k
                bool visret = holder().visitor().visit_negative_integer(tmp);
262
337k
                parse_return upr = after_visit_proc(visret, off);
263
337k
                if (upr != PARSE_CONTINUE) return upr;
264
1.57M
            } else if (0xc4 <= selector && selector <= 0xdf) {
265
669k
                const uint32_t trail[] = {
266
669k
                    1, // bin     8  0xc4
267
669k
                    2, // bin    16  0xc5
268
669k
                    4, // bin    32  0xc6
269
669k
                    1, // ext     8  0xc7
270
669k
                    2, // ext    16  0xc8
271
669k
                    4, // ext    32  0xc9
272
669k
                    4, // float  32  0xca
273
669k
                    8, // float  64  0xcb
274
669k
                    1, // uint    8  0xcc
275
669k
                    2, // uint   16  0xcd
276
669k
                    4, // uint   32  0xce
277
669k
                    8, // uint   64  0xcf
278
669k
                    1, // int     8  0xd0
279
669k
                    2, // int    16  0xd1
280
669k
                    4, // int    32  0xd2
281
669k
                    8, // int    64  0xd3
282
669k
                    2, // fixext  1  0xd4
283
669k
                    3, // fixext  2  0xd5
284
669k
                    5, // fixext  4  0xd6
285
669k
                    9, // fixext  8  0xd7
286
669k
                    17,// fixext 16  0xd8
287
669k
                    1, // str     8  0xd9
288
669k
                    2, // str    16  0xda
289
669k
                    4, // str    32  0xdb
290
669k
                    2, // array  16  0xdc
291
669k
                    4, // array  32  0xdd
292
669k
                    2, // map    16  0xde
293
669k
                    4, // map    32  0xdf
294
669k
                };
295
669k
                m_trail = trail[selector - 0xc4];
296
669k
                m_cs = next_cs(m_current);
297
669k
                fixed_trail_again = true;
298
903k
            } else if(0xa0 <= selector && selector <= 0xbf) { // FixStr
299
191k
                m_trail = static_cast<uint32_t>(*m_current) & 0x1f;
300
191k
                if(m_trail == 0) {
301
168k
                    bool visret = holder().visitor().visit_str(n, static_cast<uint32_t>(m_trail));
302
168k
                    parse_return upr = after_visit_proc(visret, off);
303
168k
                    if (upr != PARSE_CONTINUE) return upr;
304
168k
                }
305
22.6k
                else {
306
22.6k
                    m_cs = MSGPACK_ACS_STR_VALUE;
307
22.6k
                    fixed_trail_again = true;
308
22.6k
                }
309
711k
            } else if(0x90 <= selector && selector <= 0x9f) { // FixArray
310
111k
                parse_return ret = start_aggregate<fix_tag>(array_sv(holder()), array_ev(holder()), m_current, off);
311
111k
                if (ret != PARSE_CONTINUE) return ret;
312
600k
            } else if(0x80 <= selector && selector <= 0x8f) { // FixMap
313
436k
                parse_return ret = start_aggregate<fix_tag>(map_sv(holder()), map_ev(holder()), m_current, off);
314
436k
                if (ret != PARSE_CONTINUE) return ret;
315
436k
            } else if(selector == 0xc2) { // false
316
83.9k
                bool visret = holder().visitor().visit_boolean(false);
317
83.9k
                parse_return upr = after_visit_proc(visret, off);
318
83.9k
                if (upr != PARSE_CONTINUE) return upr;
319
83.9k
            } else if(selector == 0xc3) { // true
320
9.50k
                bool visret = holder().visitor().visit_boolean(true);
321
9.50k
                parse_return upr = after_visit_proc(visret, off);
322
9.50k
                if (upr != PARSE_CONTINUE) return upr;
323
70.7k
            } else if(selector == 0xc0) { // nil
324
70.7k
                bool visret = holder().visitor().visit_nil();
325
70.7k
                parse_return upr = after_visit_proc(visret, off);
326
70.7k
                if (upr != PARSE_CONTINUE) return upr;
327
70.7k
            } else {
328
2
                off = static_cast<std::size_t>(m_current - m_start);
329
2
                holder().visitor().parse_error(off - 1, off);
330
2
                return PARSE_PARSE_ERROR;
331
2
            }
332
            // end MSGPACK_CS_HEADER
333
3.24M
        }
334
3.26M
        if (m_cs != MSGPACK_CS_HEADER || fixed_trail_again) {
335
711k
            if (fixed_trail_again) {
336
711k
                ++m_current;
337
711k
                fixed_trail_again = false;
338
711k
            }
339
711k
            if(static_cast<std::size_t>(pe - m_current) < m_trail) {
340
270
                off = static_cast<std::size_t>(m_current - m_start);
341
270
                return PARSE_CONTINUE;
342
270
            }
343
710k
            n = m_current;
344
710k
            m_current += m_trail - 1;
345
710k
            switch(m_cs) {
346
                //case MSGPACK_CS_
347
                //case MSGPACK_CS_
348
310k
            case MSGPACK_CS_FLOAT: {
349
310k
                union { uint32_t i; float f; } mem;
350
310k
                load<uint32_t>(mem.i, n);
351
310k
                bool visret = holder().visitor().visit_float32(mem.f);
352
310k
                parse_return upr = after_visit_proc(visret, off);
353
310k
                if (upr != PARSE_CONTINUE) return upr;
354
310k
            } break;
355
310k
            case MSGPACK_CS_DOUBLE: {
356
17.2k
                union { uint64_t i; double f; } mem;
357
17.2k
                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
17.2k
                bool visret = holder().visitor().visit_float64(mem.f);
365
17.2k
                parse_return upr = after_visit_proc(visret, off);
366
17.2k
                if (upr != PARSE_CONTINUE) return upr;
367
17.2k
            } break;
368
17.2k
            case MSGPACK_CS_UINT_8: {
369
15.4k
                uint8_t tmp;
370
15.4k
                load<uint8_t>(tmp, n);
371
15.4k
                bool visret = holder().visitor().visit_positive_integer(tmp);
372
15.4k
                parse_return upr = after_visit_proc(visret, off);
373
15.4k
                if (upr != PARSE_CONTINUE) return upr;
374
15.4k
            } break;
375
15.4k
            case MSGPACK_CS_UINT_16: {
376
6.70k
                uint16_t tmp;
377
6.70k
                load<uint16_t>(tmp, n);
378
6.70k
                bool visret = holder().visitor().visit_positive_integer(tmp);
379
6.70k
                parse_return upr = after_visit_proc(visret, off);
380
6.70k
                if (upr != PARSE_CONTINUE) return upr;
381
6.70k
            } break;
382
13.1k
            case MSGPACK_CS_UINT_32: {
383
13.1k
                uint32_t tmp;
384
13.1k
                load<uint32_t>(tmp, n);
385
13.1k
                bool visret = holder().visitor().visit_positive_integer(tmp);
386
13.1k
                parse_return upr = after_visit_proc(visret, off);
387
13.1k
                if (upr != PARSE_CONTINUE) return upr;
388
13.1k
            } break;
389
13.1k
            case MSGPACK_CS_UINT_64: {
390
2.29k
                uint64_t tmp;
391
2.29k
                load<uint64_t>(tmp, n);
392
2.29k
                bool visret = holder().visitor().visit_positive_integer(tmp);
393
2.29k
                parse_return upr = after_visit_proc(visret, off);
394
2.29k
                if (upr != PARSE_CONTINUE) return upr;
395
2.29k
            } break;
396
71.6k
            case MSGPACK_CS_INT_8: {
397
71.6k
                int8_t tmp;
398
71.6k
                load<int8_t>(tmp, n);
399
71.6k
                bool visret = holder().visitor().visit_negative_integer(tmp);
400
71.6k
                parse_return upr = after_visit_proc(visret, off);
401
71.6k
                if (upr != PARSE_CONTINUE) return upr;
402
71.6k
            } break;
403
71.6k
            case MSGPACK_CS_INT_16: {
404
23.9k
                int16_t tmp;
405
23.9k
                load<int16_t>(tmp, n);
406
23.9k
                bool visret = holder().visitor().visit_negative_integer(tmp);
407
23.9k
                parse_return upr = after_visit_proc(visret, off);
408
23.9k
                if (upr != PARSE_CONTINUE) return upr;
409
23.9k
            } break;
410
23.9k
            case MSGPACK_CS_INT_32: {
411
22.8k
                int32_t tmp;
412
22.8k
                load<int32_t>(tmp, n);
413
22.8k
                bool visret = holder().visitor().visit_negative_integer(tmp);
414
22.8k
                parse_return upr = after_visit_proc(visret, off);
415
22.8k
                if (upr != PARSE_CONTINUE) return upr;
416
22.8k
            } break;
417
25.0k
            case MSGPACK_CS_INT_64: {
418
25.0k
                int64_t tmp;
419
25.0k
                load<int64_t>(tmp, n);
420
25.0k
                bool visret = holder().visitor().visit_negative_integer(tmp);
421
25.0k
                parse_return upr = after_visit_proc(visret, off);
422
25.0k
                if (upr != PARSE_CONTINUE) return upr;
423
25.0k
            } break;
424
24.8k
            case MSGPACK_CS_FIXEXT_1: {
425
11.7k
                bool visret = holder().visitor().visit_ext(n, 1+1);
426
11.7k
                parse_return upr = after_visit_proc(visret, off);
427
11.7k
                if (upr != PARSE_CONTINUE) return upr;
428
11.7k
            } break;
429
11.7k
            case MSGPACK_CS_FIXEXT_2: {
430
7.96k
                bool visret = holder().visitor().visit_ext(n, 2+1);
431
7.96k
                parse_return upr = after_visit_proc(visret, off);
432
7.96k
                if (upr != PARSE_CONTINUE) return upr;
433
7.96k
            } break;
434
59.1k
            case MSGPACK_CS_FIXEXT_4: {
435
59.1k
                bool visret = holder().visitor().visit_ext(n, 4+1);
436
59.1k
                parse_return upr = after_visit_proc(visret, off);
437
59.1k
                if (upr != PARSE_CONTINUE) return upr;
438
59.1k
            } break;
439
59.1k
            case MSGPACK_CS_FIXEXT_8: {
440
9.52k
                bool visret = holder().visitor().visit_ext(n, 8+1);
441
9.52k
                parse_return upr = after_visit_proc(visret, off);
442
9.52k
                if (upr != PARSE_CONTINUE) return upr;
443
9.52k
            } break;
444
9.51k
            case MSGPACK_CS_FIXEXT_16: {
445
5.48k
                bool visret = holder().visitor().visit_ext(n, 16+1);
446
5.48k
                parse_return upr = after_visit_proc(visret, off);
447
5.48k
                if (upr != PARSE_CONTINUE) return upr;
448
5.48k
            } break;
449
5.48k
            case MSGPACK_CS_STR_8: {
450
3.38k
                uint8_t tmp;
451
3.38k
                load<uint8_t>(tmp, n);
452
3.38k
                m_trail = tmp;
453
3.38k
                if(m_trail == 0) {
454
1.29k
                    bool visret = holder().visitor().visit_str(n, static_cast<uint32_t>(m_trail));
455
1.29k
                    parse_return upr = after_visit_proc(visret, off);
456
1.29k
                    if (upr != PARSE_CONTINUE) return upr;
457
1.29k
                }
458
2.08k
                else {
459
2.08k
                    m_cs = MSGPACK_ACS_STR_VALUE;
460
2.08k
                    fixed_trail_again = true;
461
2.08k
                }
462
3.38k
            } break;
463
6.37k
            case MSGPACK_CS_BIN_8: {
464
6.37k
                uint8_t tmp;
465
6.37k
                load<uint8_t>(tmp, n);
466
6.37k
                m_trail = tmp;
467
6.37k
                if(m_trail == 0) {
468
4.86k
                    bool visret = holder().visitor().visit_bin(n, static_cast<uint32_t>(m_trail));
469
4.86k
                    parse_return upr = after_visit_proc(visret, off);
470
4.86k
                    if (upr != PARSE_CONTINUE) return upr;
471
4.86k
                }
472
1.51k
                else {
473
1.51k
                    m_cs = MSGPACK_ACS_BIN_VALUE;
474
1.51k
                    fixed_trail_again = true;
475
1.51k
                }
476
6.37k
            } break;
477
6.37k
            case MSGPACK_CS_EXT_8: {
478
5.09k
                uint8_t tmp;
479
5.09k
                load<uint8_t>(tmp, n);
480
5.09k
                m_trail = tmp + 1;
481
5.09k
                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
5.09k
                else {
487
5.09k
                    m_cs = MSGPACK_ACS_EXT_VALUE;
488
5.09k
                    fixed_trail_again = true;
489
5.09k
                }
490
5.09k
            } break;
491
5.09k
            case MSGPACK_CS_STR_16: {
492
4.34k
                uint16_t tmp;
493
4.34k
                load<uint16_t>(tmp, n);
494
4.34k
                m_trail = tmp;
495
4.34k
                if(m_trail == 0) {
496
1.35k
                    bool visret = holder().visitor().visit_str(n, static_cast<uint32_t>(m_trail));
497
1.35k
                    parse_return upr = after_visit_proc(visret, off);
498
1.35k
                    if (upr != PARSE_CONTINUE) return upr;
499
1.35k
                }
500
2.98k
                else {
501
2.98k
                    m_cs = MSGPACK_ACS_STR_VALUE;
502
2.98k
                    fixed_trail_again = true;
503
2.98k
                }
504
4.34k
            } break;
505
4.33k
            case MSGPACK_CS_BIN_16: {
506
4.01k
                uint16_t tmp;
507
4.01k
                load<uint16_t>(tmp, n);
508
4.01k
                m_trail = tmp;
509
4.01k
                if(m_trail == 0) {
510
573
                    bool visret = holder().visitor().visit_bin(n, static_cast<uint32_t>(m_trail));
511
573
                    parse_return upr = after_visit_proc(visret, off);
512
573
                    if (upr != PARSE_CONTINUE) return upr;
513
573
                }
514
3.44k
                else {
515
3.44k
                    m_cs = MSGPACK_ACS_BIN_VALUE;
516
3.44k
                    fixed_trail_again = true;
517
3.44k
                }
518
4.01k
            } break;
519
4.01k
            case MSGPACK_CS_EXT_16: {
520
1.78k
                uint16_t tmp;
521
1.78k
                load<uint16_t>(tmp, n);
522
1.78k
                m_trail = tmp + 1;
523
1.78k
                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
1.78k
                else {
529
1.78k
                    m_cs = MSGPACK_ACS_EXT_VALUE;
530
1.78k
                    fixed_trail_again = true;
531
1.78k
                }
532
1.78k
            } break;
533
2.99k
            case MSGPACK_CS_STR_32: {
534
2.99k
                uint32_t tmp;
535
2.99k
                load<uint32_t>(tmp, n);
536
2.99k
                m_trail = tmp;
537
2.99k
                if(m_trail == 0) {
538
1.42k
                    bool visret = holder().visitor().visit_str(n, static_cast<uint32_t>(m_trail));
539
1.42k
                    parse_return upr = after_visit_proc(visret, off);
540
1.42k
                    if (upr != PARSE_CONTINUE) return upr;
541
1.42k
                }
542
1.57k
                else {
543
1.57k
                    m_cs = MSGPACK_ACS_STR_VALUE;
544
1.57k
                    fixed_trail_again = true;
545
1.57k
                }
546
2.99k
            } break;
547
2.99k
            case MSGPACK_CS_BIN_32: {
548
1.22k
                uint32_t tmp;
549
1.22k
                load<uint32_t>(tmp, n);
550
1.22k
                m_trail = tmp;
551
1.22k
                if(m_trail == 0) {
552
871
                    bool visret = holder().visitor().visit_bin(n, static_cast<uint32_t>(m_trail));
553
871
                    parse_return upr = after_visit_proc(visret, off);
554
871
                    if (upr != PARSE_CONTINUE) return upr;
555
871
                }
556
349
                else {
557
349
                    m_cs = MSGPACK_ACS_BIN_VALUE;
558
349
                    fixed_trail_again = true;
559
349
                }
560
1.22k
            } break;
561
1.21k
            case MSGPACK_CS_EXT_32: {
562
428
                uint32_t tmp;
563
428
                load<uint32_t>(tmp, n);
564
428
                check_ext_size<sizeof(std::size_t)>(tmp);
565
428
                m_trail = tmp;
566
428
                ++m_trail;
567
428
                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
428
                else {
573
428
                    m_cs = MSGPACK_ACS_EXT_VALUE;
574
428
                    fixed_trail_again = true;
575
428
                }
576
428
            } break;
577
29.1k
            case MSGPACK_ACS_STR_VALUE: {
578
29.1k
                bool visret = holder().visitor().visit_str(n, static_cast<uint32_t>(m_trail));
579
29.1k
                parse_return upr = after_visit_proc(visret, off);
580
29.1k
                if (upr != PARSE_CONTINUE) return upr;
581
29.1k
            } break;
582
29.1k
            case MSGPACK_ACS_BIN_VALUE: {
583
5.19k
                bool visret = holder().visitor().visit_bin(n, static_cast<uint32_t>(m_trail));
584
5.19k
                parse_return upr = after_visit_proc(visret, off);
585
5.19k
                if (upr != PARSE_CONTINUE) return upr;
586
5.19k
            } break;
587
7.28k
            case MSGPACK_ACS_EXT_VALUE: {
588
7.28k
                bool visret = holder().visitor().visit_ext(n, static_cast<uint32_t>(m_trail));
589
7.28k
                parse_return upr = after_visit_proc(visret, off);
590
7.28k
                if (upr != PARSE_CONTINUE) return upr;
591
7.28k
            } break;
592
27.9k
            case MSGPACK_CS_ARRAY_16: {
593
27.9k
                parse_return ret = start_aggregate<uint16_t>(array_sv(holder()), array_ev(holder()), n, off);
594
27.9k
                if (ret != PARSE_CONTINUE) return ret;
595
596
27.9k
            } break;
597
27.9k
            case MSGPACK_CS_ARRAY_32: {
598
1.26k
                parse_return ret = start_aggregate<uint32_t>(array_sv(holder()), array_ev(holder()), n, off);
599
1.26k
                if (ret != PARSE_CONTINUE) return ret;
600
1.26k
            } break;
601
4.34k
            case MSGPACK_CS_MAP_16: {
602
4.34k
                parse_return ret = start_aggregate<uint16_t>(map_sv(holder()), map_ev(holder()), n, off);
603
4.34k
                if (ret != PARSE_CONTINUE) return ret;
604
4.34k
            } break;
605
4.34k
            case MSGPACK_CS_MAP_32: {
606
3.31k
                parse_return ret = start_aggregate<uint32_t>(map_sv(holder()), map_ev(holder()), n, off);
607
3.31k
                if (ret != PARSE_CONTINUE) return ret;
608
3.31k
            } break;
609
3.31k
            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
710k
            }
614
710k
        }
615
3.26M
    } while(m_current != pe);
616
617
710
    off = static_cast<std::size_t>(m_current - m_start);
618
710
    return PARSE_CONTINUE;
619
2.20k
}
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.20k
{
238
2.20k
    MSGPACK_ASSERT(len >= off);
239
240
2.20k
    m_start = data;
241
2.20k
    m_current = data + off;
242
2.20k
    const char* const pe = data + len;
243
2.20k
    const char* n = MSGPACK_NULLPTR;
244
245
2.20k
    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.20k
    bool fixed_trail_again = false;
250
3.26M
    do {
251
3.26M
        if (m_cs == MSGPACK_CS_HEADER) {
252
3.24M
            fixed_trail_again = false;
253
3.24M
            int selector = *reinterpret_cast<const unsigned char*>(m_current);
254
3.24M
            if (0x00 <= selector && selector <= 0x7f) { // Positive Fixnum
255
1.33M
                uint8_t tmp = *reinterpret_cast<const uint8_t*>(m_current);
256
1.33M
                bool visret = holder().visitor().visit_positive_integer(tmp);
257
1.33M
                parse_return upr = after_visit_proc(visret, off);
258
1.33M
                if (upr != PARSE_CONTINUE) return upr;
259
1.90M
            } else if(0xe0 <= selector && selector <= 0xff) { // Negative Fixnum
260
337k
                int8_t tmp = *reinterpret_cast<const int8_t*>(m_current);
261
337k
                bool visret = holder().visitor().visit_negative_integer(tmp);
262
337k
                parse_return upr = after_visit_proc(visret, off);
263
337k
                if (upr != PARSE_CONTINUE) return upr;
264
1.57M
            } else if (0xc4 <= selector && selector <= 0xdf) {
265
669k
                const uint32_t trail[] = {
266
669k
                    1, // bin     8  0xc4
267
669k
                    2, // bin    16  0xc5
268
669k
                    4, // bin    32  0xc6
269
669k
                    1, // ext     8  0xc7
270
669k
                    2, // ext    16  0xc8
271
669k
                    4, // ext    32  0xc9
272
669k
                    4, // float  32  0xca
273
669k
                    8, // float  64  0xcb
274
669k
                    1, // uint    8  0xcc
275
669k
                    2, // uint   16  0xcd
276
669k
                    4, // uint   32  0xce
277
669k
                    8, // uint   64  0xcf
278
669k
                    1, // int     8  0xd0
279
669k
                    2, // int    16  0xd1
280
669k
                    4, // int    32  0xd2
281
669k
                    8, // int    64  0xd3
282
669k
                    2, // fixext  1  0xd4
283
669k
                    3, // fixext  2  0xd5
284
669k
                    5, // fixext  4  0xd6
285
669k
                    9, // fixext  8  0xd7
286
669k
                    17,// fixext 16  0xd8
287
669k
                    1, // str     8  0xd9
288
669k
                    2, // str    16  0xda
289
669k
                    4, // str    32  0xdb
290
669k
                    2, // array  16  0xdc
291
669k
                    4, // array  32  0xdd
292
669k
                    2, // map    16  0xde
293
669k
                    4, // map    32  0xdf
294
669k
                };
295
669k
                m_trail = trail[selector - 0xc4];
296
669k
                m_cs = next_cs(m_current);
297
669k
                fixed_trail_again = true;
298
903k
            } else if(0xa0 <= selector && selector <= 0xbf) { // FixStr
299
191k
                m_trail = static_cast<uint32_t>(*m_current) & 0x1f;
300
191k
                if(m_trail == 0) {
301
168k
                    bool visret = holder().visitor().visit_str(n, static_cast<uint32_t>(m_trail));
302
168k
                    parse_return upr = after_visit_proc(visret, off);
303
168k
                    if (upr != PARSE_CONTINUE) return upr;
304
168k
                }
305
22.6k
                else {
306
22.6k
                    m_cs = MSGPACK_ACS_STR_VALUE;
307
22.6k
                    fixed_trail_again = true;
308
22.6k
                }
309
711k
            } else if(0x90 <= selector && selector <= 0x9f) { // FixArray
310
111k
                parse_return ret = start_aggregate<fix_tag>(array_sv(holder()), array_ev(holder()), m_current, off);
311
111k
                if (ret != PARSE_CONTINUE) return ret;
312
600k
            } else if(0x80 <= selector && selector <= 0x8f) { // FixMap
313
436k
                parse_return ret = start_aggregate<fix_tag>(map_sv(holder()), map_ev(holder()), m_current, off);
314
436k
                if (ret != PARSE_CONTINUE) return ret;
315
436k
            } else if(selector == 0xc2) { // false
316
83.9k
                bool visret = holder().visitor().visit_boolean(false);
317
83.9k
                parse_return upr = after_visit_proc(visret, off);
318
83.9k
                if (upr != PARSE_CONTINUE) return upr;
319
83.9k
            } else if(selector == 0xc3) { // true
320
9.50k
                bool visret = holder().visitor().visit_boolean(true);
321
9.50k
                parse_return upr = after_visit_proc(visret, off);
322
9.50k
                if (upr != PARSE_CONTINUE) return upr;
323
70.7k
            } else if(selector == 0xc0) { // nil
324
70.7k
                bool visret = holder().visitor().visit_nil();
325
70.7k
                parse_return upr = after_visit_proc(visret, off);
326
70.7k
                if (upr != PARSE_CONTINUE) return upr;
327
70.7k
            } else {
328
2
                off = static_cast<std::size_t>(m_current - m_start);
329
2
                holder().visitor().parse_error(off - 1, off);
330
2
                return PARSE_PARSE_ERROR;
331
2
            }
332
            // end MSGPACK_CS_HEADER
333
3.24M
        }
334
3.26M
        if (m_cs != MSGPACK_CS_HEADER || fixed_trail_again) {
335
711k
            if (fixed_trail_again) {
336
711k
                ++m_current;
337
711k
                fixed_trail_again = false;
338
711k
            }
339
711k
            if(static_cast<std::size_t>(pe - m_current) < m_trail) {
340
270
                off = static_cast<std::size_t>(m_current - m_start);
341
270
                return PARSE_CONTINUE;
342
270
            }
343
710k
            n = m_current;
344
710k
            m_current += m_trail - 1;
345
710k
            switch(m_cs) {
346
                //case MSGPACK_CS_
347
                //case MSGPACK_CS_
348
310k
            case MSGPACK_CS_FLOAT: {
349
310k
                union { uint32_t i; float f; } mem;
350
310k
                load<uint32_t>(mem.i, n);
351
310k
                bool visret = holder().visitor().visit_float32(mem.f);
352
310k
                parse_return upr = after_visit_proc(visret, off);
353
310k
                if (upr != PARSE_CONTINUE) return upr;
354
310k
            } break;
355
310k
            case MSGPACK_CS_DOUBLE: {
356
17.2k
                union { uint64_t i; double f; } mem;
357
17.2k
                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
17.2k
                bool visret = holder().visitor().visit_float64(mem.f);
365
17.2k
                parse_return upr = after_visit_proc(visret, off);
366
17.2k
                if (upr != PARSE_CONTINUE) return upr;
367
17.2k
            } break;
368
17.2k
            case MSGPACK_CS_UINT_8: {
369
15.4k
                uint8_t tmp;
370
15.4k
                load<uint8_t>(tmp, n);
371
15.4k
                bool visret = holder().visitor().visit_positive_integer(tmp);
372
15.4k
                parse_return upr = after_visit_proc(visret, off);
373
15.4k
                if (upr != PARSE_CONTINUE) return upr;
374
15.4k
            } break;
375
15.4k
            case MSGPACK_CS_UINT_16: {
376
6.70k
                uint16_t tmp;
377
6.70k
                load<uint16_t>(tmp, n);
378
6.70k
                bool visret = holder().visitor().visit_positive_integer(tmp);
379
6.70k
                parse_return upr = after_visit_proc(visret, off);
380
6.70k
                if (upr != PARSE_CONTINUE) return upr;
381
6.70k
            } break;
382
13.1k
            case MSGPACK_CS_UINT_32: {
383
13.1k
                uint32_t tmp;
384
13.1k
                load<uint32_t>(tmp, n);
385
13.1k
                bool visret = holder().visitor().visit_positive_integer(tmp);
386
13.1k
                parse_return upr = after_visit_proc(visret, off);
387
13.1k
                if (upr != PARSE_CONTINUE) return upr;
388
13.1k
            } break;
389
13.1k
            case MSGPACK_CS_UINT_64: {
390
2.29k
                uint64_t tmp;
391
2.29k
                load<uint64_t>(tmp, n);
392
2.29k
                bool visret = holder().visitor().visit_positive_integer(tmp);
393
2.29k
                parse_return upr = after_visit_proc(visret, off);
394
2.29k
                if (upr != PARSE_CONTINUE) return upr;
395
2.29k
            } break;
396
71.6k
            case MSGPACK_CS_INT_8: {
397
71.6k
                int8_t tmp;
398
71.6k
                load<int8_t>(tmp, n);
399
71.6k
                bool visret = holder().visitor().visit_negative_integer(tmp);
400
71.6k
                parse_return upr = after_visit_proc(visret, off);
401
71.6k
                if (upr != PARSE_CONTINUE) return upr;
402
71.6k
            } break;
403
71.6k
            case MSGPACK_CS_INT_16: {
404
23.9k
                int16_t tmp;
405
23.9k
                load<int16_t>(tmp, n);
406
23.9k
                bool visret = holder().visitor().visit_negative_integer(tmp);
407
23.9k
                parse_return upr = after_visit_proc(visret, off);
408
23.9k
                if (upr != PARSE_CONTINUE) return upr;
409
23.9k
            } break;
410
23.9k
            case MSGPACK_CS_INT_32: {
411
22.8k
                int32_t tmp;
412
22.8k
                load<int32_t>(tmp, n);
413
22.8k
                bool visret = holder().visitor().visit_negative_integer(tmp);
414
22.8k
                parse_return upr = after_visit_proc(visret, off);
415
22.8k
                if (upr != PARSE_CONTINUE) return upr;
416
22.8k
            } break;
417
25.0k
            case MSGPACK_CS_INT_64: {
418
25.0k
                int64_t tmp;
419
25.0k
                load<int64_t>(tmp, n);
420
25.0k
                bool visret = holder().visitor().visit_negative_integer(tmp);
421
25.0k
                parse_return upr = after_visit_proc(visret, off);
422
25.0k
                if (upr != PARSE_CONTINUE) return upr;
423
25.0k
            } break;
424
24.8k
            case MSGPACK_CS_FIXEXT_1: {
425
11.7k
                bool visret = holder().visitor().visit_ext(n, 1+1);
426
11.7k
                parse_return upr = after_visit_proc(visret, off);
427
11.7k
                if (upr != PARSE_CONTINUE) return upr;
428
11.7k
            } break;
429
11.7k
            case MSGPACK_CS_FIXEXT_2: {
430
7.96k
                bool visret = holder().visitor().visit_ext(n, 2+1);
431
7.96k
                parse_return upr = after_visit_proc(visret, off);
432
7.96k
                if (upr != PARSE_CONTINUE) return upr;
433
7.96k
            } break;
434
59.1k
            case MSGPACK_CS_FIXEXT_4: {
435
59.1k
                bool visret = holder().visitor().visit_ext(n, 4+1);
436
59.1k
                parse_return upr = after_visit_proc(visret, off);
437
59.1k
                if (upr != PARSE_CONTINUE) return upr;
438
59.1k
            } break;
439
59.1k
            case MSGPACK_CS_FIXEXT_8: {
440
9.52k
                bool visret = holder().visitor().visit_ext(n, 8+1);
441
9.52k
                parse_return upr = after_visit_proc(visret, off);
442
9.52k
                if (upr != PARSE_CONTINUE) return upr;
443
9.52k
            } break;
444
9.51k
            case MSGPACK_CS_FIXEXT_16: {
445
5.48k
                bool visret = holder().visitor().visit_ext(n, 16+1);
446
5.48k
                parse_return upr = after_visit_proc(visret, off);
447
5.48k
                if (upr != PARSE_CONTINUE) return upr;
448
5.48k
            } break;
449
5.48k
            case MSGPACK_CS_STR_8: {
450
3.38k
                uint8_t tmp;
451
3.38k
                load<uint8_t>(tmp, n);
452
3.38k
                m_trail = tmp;
453
3.38k
                if(m_trail == 0) {
454
1.29k
                    bool visret = holder().visitor().visit_str(n, static_cast<uint32_t>(m_trail));
455
1.29k
                    parse_return upr = after_visit_proc(visret, off);
456
1.29k
                    if (upr != PARSE_CONTINUE) return upr;
457
1.29k
                }
458
2.08k
                else {
459
2.08k
                    m_cs = MSGPACK_ACS_STR_VALUE;
460
2.08k
                    fixed_trail_again = true;
461
2.08k
                }
462
3.38k
            } break;
463
6.37k
            case MSGPACK_CS_BIN_8: {
464
6.37k
                uint8_t tmp;
465
6.37k
                load<uint8_t>(tmp, n);
466
6.37k
                m_trail = tmp;
467
6.37k
                if(m_trail == 0) {
468
4.86k
                    bool visret = holder().visitor().visit_bin(n, static_cast<uint32_t>(m_trail));
469
4.86k
                    parse_return upr = after_visit_proc(visret, off);
470
4.86k
                    if (upr != PARSE_CONTINUE) return upr;
471
4.86k
                }
472
1.51k
                else {
473
1.51k
                    m_cs = MSGPACK_ACS_BIN_VALUE;
474
1.51k
                    fixed_trail_again = true;
475
1.51k
                }
476
6.37k
            } break;
477
6.37k
            case MSGPACK_CS_EXT_8: {
478
5.09k
                uint8_t tmp;
479
5.09k
                load<uint8_t>(tmp, n);
480
5.09k
                m_trail = tmp + 1;
481
5.09k
                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
5.09k
                else {
487
5.09k
                    m_cs = MSGPACK_ACS_EXT_VALUE;
488
5.09k
                    fixed_trail_again = true;
489
5.09k
                }
490
5.09k
            } break;
491
5.09k
            case MSGPACK_CS_STR_16: {
492
4.34k
                uint16_t tmp;
493
4.34k
                load<uint16_t>(tmp, n);
494
4.34k
                m_trail = tmp;
495
4.34k
                if(m_trail == 0) {
496
1.35k
                    bool visret = holder().visitor().visit_str(n, static_cast<uint32_t>(m_trail));
497
1.35k
                    parse_return upr = after_visit_proc(visret, off);
498
1.35k
                    if (upr != PARSE_CONTINUE) return upr;
499
1.35k
                }
500
2.98k
                else {
501
2.98k
                    m_cs = MSGPACK_ACS_STR_VALUE;
502
2.98k
                    fixed_trail_again = true;
503
2.98k
                }
504
4.34k
            } break;
505
4.33k
            case MSGPACK_CS_BIN_16: {
506
4.01k
                uint16_t tmp;
507
4.01k
                load<uint16_t>(tmp, n);
508
4.01k
                m_trail = tmp;
509
4.01k
                if(m_trail == 0) {
510
573
                    bool visret = holder().visitor().visit_bin(n, static_cast<uint32_t>(m_trail));
511
573
                    parse_return upr = after_visit_proc(visret, off);
512
573
                    if (upr != PARSE_CONTINUE) return upr;
513
573
                }
514
3.44k
                else {
515
3.44k
                    m_cs = MSGPACK_ACS_BIN_VALUE;
516
3.44k
                    fixed_trail_again = true;
517
3.44k
                }
518
4.01k
            } break;
519
4.01k
            case MSGPACK_CS_EXT_16: {
520
1.78k
                uint16_t tmp;
521
1.78k
                load<uint16_t>(tmp, n);
522
1.78k
                m_trail = tmp + 1;
523
1.78k
                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
1.78k
                else {
529
1.78k
                    m_cs = MSGPACK_ACS_EXT_VALUE;
530
1.78k
                    fixed_trail_again = true;
531
1.78k
                }
532
1.78k
            } break;
533
2.99k
            case MSGPACK_CS_STR_32: {
534
2.99k
                uint32_t tmp;
535
2.99k
                load<uint32_t>(tmp, n);
536
2.99k
                m_trail = tmp;
537
2.99k
                if(m_trail == 0) {
538
1.42k
                    bool visret = holder().visitor().visit_str(n, static_cast<uint32_t>(m_trail));
539
1.42k
                    parse_return upr = after_visit_proc(visret, off);
540
1.42k
                    if (upr != PARSE_CONTINUE) return upr;
541
1.42k
                }
542
1.57k
                else {
543
1.57k
                    m_cs = MSGPACK_ACS_STR_VALUE;
544
1.57k
                    fixed_trail_again = true;
545
1.57k
                }
546
2.99k
            } break;
547
2.99k
            case MSGPACK_CS_BIN_32: {
548
1.22k
                uint32_t tmp;
549
1.22k
                load<uint32_t>(tmp, n);
550
1.22k
                m_trail = tmp;
551
1.22k
                if(m_trail == 0) {
552
871
                    bool visret = holder().visitor().visit_bin(n, static_cast<uint32_t>(m_trail));
553
871
                    parse_return upr = after_visit_proc(visret, off);
554
871
                    if (upr != PARSE_CONTINUE) return upr;
555
871
                }
556
349
                else {
557
349
                    m_cs = MSGPACK_ACS_BIN_VALUE;
558
349
                    fixed_trail_again = true;
559
349
                }
560
1.22k
            } break;
561
1.21k
            case MSGPACK_CS_EXT_32: {
562
428
                uint32_t tmp;
563
428
                load<uint32_t>(tmp, n);
564
428
                check_ext_size<sizeof(std::size_t)>(tmp);
565
428
                m_trail = tmp;
566
428
                ++m_trail;
567
428
                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
428
                else {
573
428
                    m_cs = MSGPACK_ACS_EXT_VALUE;
574
428
                    fixed_trail_again = true;
575
428
                }
576
428
            } break;
577
29.1k
            case MSGPACK_ACS_STR_VALUE: {
578
29.1k
                bool visret = holder().visitor().visit_str(n, static_cast<uint32_t>(m_trail));
579
29.1k
                parse_return upr = after_visit_proc(visret, off);
580
29.1k
                if (upr != PARSE_CONTINUE) return upr;
581
29.1k
            } break;
582
29.1k
            case MSGPACK_ACS_BIN_VALUE: {
583
5.19k
                bool visret = holder().visitor().visit_bin(n, static_cast<uint32_t>(m_trail));
584
5.19k
                parse_return upr = after_visit_proc(visret, off);
585
5.19k
                if (upr != PARSE_CONTINUE) return upr;
586
5.19k
            } break;
587
7.28k
            case MSGPACK_ACS_EXT_VALUE: {
588
7.28k
                bool visret = holder().visitor().visit_ext(n, static_cast<uint32_t>(m_trail));
589
7.28k
                parse_return upr = after_visit_proc(visret, off);
590
7.28k
                if (upr != PARSE_CONTINUE) return upr;
591
7.28k
            } break;
592
27.9k
            case MSGPACK_CS_ARRAY_16: {
593
27.9k
                parse_return ret = start_aggregate<uint16_t>(array_sv(holder()), array_ev(holder()), n, off);
594
27.9k
                if (ret != PARSE_CONTINUE) return ret;
595
596
27.9k
            } break;
597
27.9k
            case MSGPACK_CS_ARRAY_32: {
598
1.26k
                parse_return ret = start_aggregate<uint32_t>(array_sv(holder()), array_ev(holder()), n, off);
599
1.26k
                if (ret != PARSE_CONTINUE) return ret;
600
1.26k
            } break;
601
4.34k
            case MSGPACK_CS_MAP_16: {
602
4.34k
                parse_return ret = start_aggregate<uint16_t>(map_sv(holder()), map_ev(holder()), n, off);
603
4.34k
                if (ret != PARSE_CONTINUE) return ret;
604
4.34k
            } break;
605
4.34k
            case MSGPACK_CS_MAP_32: {
606
3.31k
                parse_return ret = start_aggregate<uint32_t>(map_sv(holder()), map_ev(holder()), n, off);
607
3.31k
                if (ret != PARSE_CONTINUE) return ret;
608
3.31k
            } break;
609
3.31k
            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
710k
            }
614
710k
        }
615
3.26M
    } while(m_current != pe);
616
617
710
    off = static_cast<std::size_t>(m_current - m_start);
618
710
    return PARSE_CONTINUE;
619
2.20k
}
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.20k
    parse_helper(Visitor& v):m_visitor(v) {}
1025
2.20k
    parse_return execute(const char* data, std::size_t len, std::size_t& off) {
1026
2.20k
        return detail::context<parse_helper<Visitor> >::execute(data, len, off);
1027
2.20k
    }
1028
10.2M
    Visitor& visitor() const { return m_visitor; }
1029
    Visitor& m_visitor;
1030
};
1031
1032
template <typename Visitor>
1033
inline parse_return
1034
2.20k
parse_imp(const char* data, size_t len, size_t& off, Visitor& v) {
1035
2.20k
    std::size_t noff = off;
1036
1037
2.20k
    if(len <= noff) {
1038
        // FIXME
1039
0
        v.insufficient_bytes(noff, noff);
1040
0
        return PARSE_CONTINUE;
1041
0
    }
1042
2.20k
    detail::parse_helper<Visitor> h(v);
1043
2.20k
    parse_return ret = h.execute(data, len, noff);
1044
2.20k
    switch (ret) {
1045
977
    case PARSE_CONTINUE:
1046
977
        off = noff;
1047
977
        v.insufficient_bytes(noff - 1, noff);
1048
977
        return ret;
1049
1.06k
    case PARSE_SUCCESS:
1050
1.06k
        off = noff;
1051
1.06k
        if(noff < len) {
1052
65
            return PARSE_EXTRA_BYTES;
1053
65
        }
1054
1.00k
        return ret;
1055
0
    default:
1056
0
        return ret;
1057
2.20k
    }
1058
2.20k
}
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