Skip to content

Commit e176ab8

Browse files
committed
Parser: ensure no state change has overlapping flags
1 parent b18ba06 commit e176ab8

File tree

2 files changed

+6
-5
lines changed

2 files changed

+6
-5
lines changed

src/c4/yml/parse_engine.def.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3938,10 +3938,11 @@ void ParseEngine<EventHandler>::addrem_flags(ParserFlag_t on, ParserFlag_t off,
39383938
csubstr buf1 = detail::_parser_flags_to_str(buf1_, on);
39393939
csubstr buf2 = detail::_parser_flags_to_str(buf2_, off);
39403940
csubstr buf3 = detail::_parser_flags_to_str(buf3_, s->flags);
3941-
csubstr buf4 = detail::_parser_flags_to_str(buf4_, ((s->flags|on)&(~off)));
3941+
csubstr buf4 = detail::_parser_flags_to_str(buf4_, (~off)&((s->flags|on)));
39423942
_c4dbgpf("state[{}]: add {} / rem {}: before={} after={}", s->level, buf1, buf2, buf3, buf4);
3943-
s->flags |= on;
3943+
_RYML_ASSERT_BASIC((on & off) == ParserFlag_t(0));
39443944
s->flags &= ~off;
3945+
s->flags |= on;
39453946
}
39463947

39473948
template<class EventHandler>
@@ -7630,7 +7631,7 @@ void ParseEngine<EventHandler>::_handle_unk()
76307631
addrem_flags(RMAP|RBLCK|RKEY, RUNK|RTOP|RDOC);
76317632
_handle_annotations_and_indentation_after_start_mapblck(remindent, m_evt_handler->m_curr->pos.line);
76327633
m_evt_handler->begin_map_key_flow();
7633-
addrem_flags(RMAP|RFLOW|RKEY, RBLCK|RKEY);
7634+
addrem_flags(RMAP|RFLOW, RBLCK);
76347635
_set_indentation(remindent);
76357636
}
76367637
_line_progressed(1);

src/c4/yml/parse_engine.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -609,10 +609,10 @@ class ParseEngine
609609

610610
#ifndef RYML_DBG
611611
C4_ALWAYS_INLINE static void add_flags(ParserFlag_t on, ParserState *C4_RESTRICT s) noexcept { s->flags |= on; }
612-
C4_ALWAYS_INLINE static void addrem_flags(ParserFlag_t on, ParserFlag_t off, ParserState *C4_RESTRICT s) noexcept { s->flags &= ~off; s->flags |= on; }
612+
C4_ALWAYS_INLINE static void addrem_flags(ParserFlag_t on, ParserFlag_t off, ParserState *C4_RESTRICT s) noexcept { _RYML_ASSERT_BASIC((on & off) == 0); s->flags &= ~off; s->flags |= on; }
613613
C4_ALWAYS_INLINE static void rem_flags(ParserFlag_t off, ParserState *C4_RESTRICT s) noexcept { s->flags &= ~off; }
614614
C4_ALWAYS_INLINE void add_flags(ParserFlag_t on) noexcept { m_evt_handler->m_curr->flags |= on; }
615-
C4_ALWAYS_INLINE void addrem_flags(ParserFlag_t on, ParserFlag_t off) noexcept { m_evt_handler->m_curr->flags &= ~off; m_evt_handler->m_curr->flags |= on; }
615+
C4_ALWAYS_INLINE void addrem_flags(ParserFlag_t on, ParserFlag_t off) noexcept { _RYML_ASSERT_BASIC((on & off) == 0); m_evt_handler->m_curr->flags &= ~off; m_evt_handler->m_curr->flags |= on; }
616616
C4_ALWAYS_INLINE void rem_flags(ParserFlag_t off) noexcept { m_evt_handler->m_curr->flags &= ~off; }
617617
#else
618618
static void add_flags(ParserFlag_t on, ParserState *C4_RESTRICT s);

0 commit comments

Comments
 (0)