@@ -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