|
@@ -384,35 +384,9 @@ impl<'src> ScopeState {
|
|
/// Uses the currently active [`Bump`] allocator
|
|
/// Uses the currently active [`Bump`] allocator
|
|
pub fn raw_text(&'src self, args: Arguments) -> &'src str {
|
|
pub fn raw_text(&'src self, args: Arguments) -> &'src str {
|
|
args.as_str().unwrap_or_else(|| {
|
|
args.as_str().unwrap_or_else(|| {
|
|
|
|
+ use bumpalo::core_alloc::fmt::Write;
|
|
let mut str_buf = bumpalo::collections::String::new_in(self.bump());
|
|
let mut str_buf = bumpalo::collections::String::new_in(self.bump());
|
|
- struct Wrapper<'a, 'b>(&'a mut bumpalo::collections::Vec<'b, u8>);
|
|
|
|
-
|
|
|
|
- impl<'a, 'b> std::fmt::Write for Wrapper<'a, 'b> {
|
|
|
|
- fn write_str(&mut self, s: &str) -> std::fmt::Result {
|
|
|
|
- unsafe {
|
|
|
|
- copy(s, self.0);
|
|
|
|
- }
|
|
|
|
- Ok(())
|
|
|
|
- }
|
|
|
|
- fn write_char(&mut self, c: char) -> std::fmt::Result {
|
|
|
|
- self.0.push(c as u8);
|
|
|
|
- Ok(())
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- unsafe fn copy<'a>(s: &str, buf: &mut bumpalo::collections::Vec<'a, u8>) {
|
|
|
|
- let old_len = buf.len();
|
|
|
|
- buf.reserve(s.len());
|
|
|
|
- let ptr = buf.as_mut_ptr().add(old_len);
|
|
|
|
- let bytes = s.as_bytes();
|
|
|
|
- let str_ptr = bytes.as_ptr();
|
|
|
|
- for o in 0..s.len() {
|
|
|
|
- *ptr.add(o) = *str_ptr.add(o);
|
|
|
|
- }
|
|
|
|
- buf.set_len(old_len + s.len());
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- let _ = unsafe { std::fmt::write(&mut Wrapper(str_buf.as_mut_vec()), args) };
|
|
|
|
|
|
+ str_buf.write_fmt(args).unwrap();
|
|
str_buf.into_bump_str()
|
|
str_buf.into_bump_str()
|
|
})
|
|
})
|
|
}
|
|
}
|