mirror of
https://github.com/matrix-construct/construct
synced 2024-11-26 00:32:35 +01:00
ircd::spirit: Improve generator overflow counting.
This commit is contained in:
parent
be07ae05b2
commit
268d4265ca
1 changed files with 9 additions and 2 deletions
|
@ -260,6 +260,9 @@ struct ircd::spirit::generator_state
|
||||||
|
|
||||||
/// Internal state for buffer_sink::copy()
|
/// Internal state for buffer_sink::copy()
|
||||||
ssize_t last_generated {0}, last_width {0};
|
ssize_t last_generated {0}, last_width {0};
|
||||||
|
|
||||||
|
/// Count of rejected from the destination buffer.
|
||||||
|
ssize_t overflow {0};
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class gen,
|
template<class gen,
|
||||||
|
@ -298,17 +301,20 @@ ircd::generate(mutable_buffer &out,
|
||||||
karma::generate(sink, std::forward<gen>(g), std::forward<attr>(a)...)
|
karma::generate(sink, std::forward<gen>(g), std::forward<attr>(a)...)
|
||||||
};
|
};
|
||||||
|
|
||||||
if(unlikely(size_t(state.generated) > max))
|
if(unlikely(state.overflow))
|
||||||
{
|
{
|
||||||
char pbuf[2][48];
|
char pbuf[2][48];
|
||||||
|
begin(out) = end(out) - max;
|
||||||
throw spirit::buffer_overrun
|
throw spirit::buffer_overrun
|
||||||
{
|
{
|
||||||
"Insufficient buffer of %s for %s",
|
"Insufficient buffer of %s for %s",
|
||||||
pretty(pbuf[0], iec(max)),
|
pretty(pbuf[0], iec(max)),
|
||||||
pretty(pbuf[1], iec(state.generated)),
|
pretty(pbuf[1], iec(max + state.overflow)),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert(begin(out) >= end(out) - max);
|
||||||
|
assert(begin(out) <= end(out));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -397,6 +403,7 @@ boost::spirit::karma::detail::buffer_sink::output(const char &value)
|
||||||
};
|
};
|
||||||
|
|
||||||
this->width += consumed;
|
this->width += consumed;
|
||||||
|
state.overflow += !consumed;
|
||||||
state.generated++;
|
state.generated++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue