Skip to content

Commit 1bc27d7

Browse files
authored
Merge pull request #568 from dstahlke/fix
Fixed spurious start_map_key/start_array_item calls
2 parents b4fe698 + e58b000 commit 1bc27d7

File tree

1 file changed

+17
-8
lines changed

1 file changed

+17
-8
lines changed

include/msgpack/v2/parse.hpp

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,15 @@ class context {
7575
}
7676
}
7777
else {
78-
m_stack.push(sv.type(), static_cast<uint32_t>(size));
7978
if (!sv(size)) {
8079
off = m_current - m_start;
8180
return PARSE_STOP_VISITOR;
8281
}
82+
parse_return ret = m_stack.push(holder(), sv.type(), static_cast<uint32_t>(size));
83+
if (ret != PARSE_CONTINUE) {
84+
off = m_current - m_start;
85+
return ret;
86+
}
8387
}
8488
m_cs = MSGPACK_CS_HEADER;
8589
return PARSE_CONTINUE;
@@ -145,8 +149,19 @@ class context {
145149
unpack_stack() {
146150
m_stack.reserve(MSGPACK_EMBED_STACK_SIZE);
147151
}
148-
void push(msgpack_container_type type, uint32_t rest) {
152+
parse_return push(VisitorHolder& visitor_holder, msgpack_container_type type, uint32_t rest) {
149153
m_stack.push_back(stack_elem(type, rest));
154+
switch (type) {
155+
case MSGPACK_CT_ARRAY_ITEM:
156+
return visitor_holder.visitor().start_array_item() ? PARSE_CONTINUE : PARSE_STOP_VISITOR;
157+
case MSGPACK_CT_MAP_KEY:
158+
return visitor_holder.visitor().start_map_key() ? PARSE_CONTINUE : PARSE_STOP_VISITOR;
159+
case MSGPACK_CT_MAP_VALUE:
160+
assert(0);
161+
return PARSE_STOP_VISITOR;
162+
}
163+
assert(0);
164+
return PARSE_STOP_VISITOR;
150165
}
151166
parse_return consume(VisitorHolder& visitor_holder) {
152167
while (!m_stack.empty()) {
@@ -287,11 +302,9 @@ inline parse_return context<VisitorHolder>::execute(const char* data, std::size_
287302
} else if(0x90 <= selector && selector <= 0x9f) { // FixArray
288303
parse_return ret = start_aggregate<fix_tag>(array_sv(holder()), array_ev(holder()), m_current, off);
289304
if (ret != PARSE_CONTINUE) return ret;
290-
if (!holder().visitor().start_array_item()) return PARSE_STOP_VISITOR;
291305
} else if(0x80 <= selector && selector <= 0x8f) { // FixMap
292306
parse_return ret = start_aggregate<fix_tag>(map_sv(holder()), map_ev(holder()), m_current, off);
293307
if (ret != PARSE_CONTINUE) return ret;
294-
if (!holder().visitor().start_map_key()) return PARSE_STOP_VISITOR;
295308
} else if(selector == 0xc2) { // false
296309
bool visret = holder().visitor().visit_boolean(false);
297310
parse_return upr = after_visit_proc(visret, off);
@@ -572,23 +585,19 @@ inline parse_return context<VisitorHolder>::execute(const char* data, std::size_
572585
case MSGPACK_CS_ARRAY_16: {
573586
parse_return ret = start_aggregate<uint16_t>(array_sv(holder()), array_ev(holder()), n, off);
574587
if (ret != PARSE_CONTINUE) return ret;
575-
if (!holder().visitor().start_array_item()) return PARSE_STOP_VISITOR;
576588

577589
} break;
578590
case MSGPACK_CS_ARRAY_32: {
579591
parse_return ret = start_aggregate<uint32_t>(array_sv(holder()), array_ev(holder()), n, off);
580592
if (ret != PARSE_CONTINUE) return ret;
581-
if (!holder().visitor().start_array_item()) return PARSE_STOP_VISITOR;
582593
} break;
583594
case MSGPACK_CS_MAP_16: {
584595
parse_return ret = start_aggregate<uint16_t>(map_sv(holder()), map_ev(holder()), n, off);
585596
if (ret != PARSE_CONTINUE) return ret;
586-
if (!holder().visitor().start_map_key()) return PARSE_STOP_VISITOR;
587597
} break;
588598
case MSGPACK_CS_MAP_32: {
589599
parse_return ret = start_aggregate<uint32_t>(map_sv(holder()), map_ev(holder()), n, off);
590600
if (ret != PARSE_CONTINUE) return ret;
591-
if (!holder().visitor().start_map_key()) return PARSE_STOP_VISITOR;
592601
} break;
593602
default:
594603
off = m_current - m_start;

0 commit comments

Comments
 (0)