Coverage Report

Created: 2023-09-25 06:13

/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