6767serialize_write (writer& w, stream& ss0, integral_conversion_tag )
6868{
6969 value jv;
70- if ( StackEmpty || w. st_ . empty () )
70+ BOOST_IF_CONSTEXPR ( StackEmpty )
7171 {
72+ BOOST_ASSERT ( w.st_ .empty () );
7273 auto const pt = reinterpret_cast <T const *>(w.p_ );
7374 // as this is a number, we don't need the value to outlive the call,
7475 // so we can use this local variable
7576 jv = *pt;
7677 w.p_ = &jv;
78+ return serialize_write<true , value>(w, ss0);
7779 }
7880
79- return serialize_write<StackEmpty , value>(w, ss0);
81+ return serialize_write<false , value>(w, ss0);
8082}
8183
8284template <bool StackEmpty, class T >
@@ -90,15 +92,17 @@ serialize_write(writer& w, stream& ss0, sequence_conversion_tag )
9092 local_stream ss (ss0);
9193 ConstIterator it;
9294 ConstIterator end;
93- if ( StackEmpty || w. st_ . empty () )
95+ BOOST_IF_CONSTEXPR ( StackEmpty )
9496 {
97+ BOOST_ASSERT ( w.st_ .empty () );
9598 BOOST_ASSERT ( w.p_ );
9699 pt = reinterpret_cast <T const *>(w.p_ );
97100 it = pt->begin ();
98101 end = pt->end ();
99102 }
100103 else
101104 {
105+ BOOST_ASSERT ( !w.st_ .empty () );
102106 writer::state st;
103107 w.st_ .pop (st);
104108 w.st_ .pop (it);
@@ -114,6 +118,8 @@ serialize_write(writer& w, stream& ss0, sequence_conversion_tag )
114118 break ;
115119 }
116120 }
121+
122+ goto do_arr1;
117123do_arr1:
118124 if (BOOST_JSON_LIKELY (ss))
119125 ss.append (' [' );
@@ -125,17 +131,29 @@ serialize_write(writer& w, stream& ss0, sequence_conversion_tag )
125131 for (;;)
126132 {
127133 w.p_ = &*it;
134+ if ( true )
135+ {
136+ if ( !serialize_write<true , Value>(w, ss) )
137+ return w.suspend (writer::state::arr2, it, pt);
138+ }
139+ else
140+ {
141+ goto do_arr2;
128142do_arr2:
129- if ( !serialize_write<StackEmpty, Value>(w, ss) )
130- return w.suspend (writer::state::arr2, it, pt);
143+ if ( !serialize_write<false , Value>(w, ss) )
144+ return w.suspend (writer::state::arr2, it, pt);
145+ }
131146 if (BOOST_JSON_UNLIKELY ( ++it == end ))
132147 break ;
148+
149+ goto do_arr3;
133150do_arr3:
134151 if (BOOST_JSON_LIKELY (ss))
135152 ss.append (' ,' );
136153 else
137154 return w.suspend (writer::state::arr3, it, pt);
138155 }
156+
139157do_arr4:
140158 if (BOOST_JSON_LIKELY (ss))
141159 ss.append (' ]' );
0 commit comments