Skip to content

Commit 41cf8bc

Browse files
committed
reduce stack emptiness checking
1 parent 8d11968 commit 41cf8bc

File tree

2 files changed

+167
-63
lines changed

2 files changed

+167
-63
lines changed

include/boost/json/impl/serializer.hpp

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,16 +67,18 @@ bool
6767
serialize_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

8284
template<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;
117123
do_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;
128142
do_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;
133150
do_arr3:
134151
if(BOOST_JSON_LIKELY(ss))
135152
ss.append(',');
136153
else
137154
return w.suspend(writer::state::arr3, it, pt);
138155
}
156+
139157
do_arr4:
140158
if(BOOST_JSON_LIKELY(ss))
141159
ss.append(']');

0 commit comments

Comments
 (0)