Skip to content

Commit 171ca07

Browse files
committed
Source tree at time of rustc crash
Crashed after cargo test --all-features
1 parent 3ba6832 commit 171ca07

File tree

8 files changed

+961
-36
lines changed

8 files changed

+961
-36
lines changed

Cargo.lock

+898
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/events/mod.rs

+10
Original file line numberDiff line numberDiff line change
@@ -1006,8 +1006,12 @@ pub enum Event<'a> {
10061006
Empty(BytesStart<'a>),
10071007
/// Escaped character data between tags.
10081008
Text(BytesText<'a>),
1009+
/// Escaped character data between tags.
1010+
TextChunk(BytesText<'a>),
10091011
/// Unescaped character data stored in `<![CDATA[...]]>`.
10101012
CData(BytesCData<'a>),
1013+
/// Unescaped character data stored in `<![CDATA[...]]>`.
1014+
CDataChunk(BytesCData<'a>),
10111015
/// Comment `<!-- ... -->`.
10121016
Comment(BytesText<'a>),
10131017
/// XML declaration `<?xml ...?>`.
@@ -1029,8 +1033,10 @@ impl<'a> Event<'a> {
10291033
Event::End(e) => Event::End(e.into_owned()),
10301034
Event::Empty(e) => Event::Empty(e.into_owned()),
10311035
Event::Text(e) => Event::Text(e.into_owned()),
1036+
Event::TextChunk(e) => Event::TextChunk(e.into_owned()),
10321037
Event::Comment(e) => Event::Comment(e.into_owned()),
10331038
Event::CData(e) => Event::CData(e.into_owned()),
1039+
Event::CDataChunk(e) => Event::CDataChunk(e.into_owned()),
10341040
Event::Decl(e) => Event::Decl(e.into_owned()),
10351041
Event::PI(e) => Event::PI(e.into_owned()),
10361042
Event::DocType(e) => Event::DocType(e.into_owned()),
@@ -1046,8 +1052,10 @@ impl<'a> Event<'a> {
10461052
Event::End(e) => Event::End(e.borrow()),
10471053
Event::Empty(e) => Event::Empty(e.borrow()),
10481054
Event::Text(e) => Event::Text(e.borrow()),
1055+
Event::TextChunk(e) => Event::TextChunk(e.borrow()),
10491056
Event::Comment(e) => Event::Comment(e.borrow()),
10501057
Event::CData(e) => Event::CData(e.borrow()),
1058+
Event::CDataChunk(e) => Event::CDataChunk(e.borrow()),
10511059
Event::Decl(e) => Event::Decl(e.borrow()),
10521060
Event::PI(e) => Event::PI(e.borrow()),
10531061
Event::DocType(e) => Event::DocType(e.borrow()),
@@ -1064,9 +1072,11 @@ impl<'a> Deref for Event<'a> {
10641072
Event::Start(ref e) | Event::Empty(ref e) => e,
10651073
Event::End(ref e) => e,
10661074
Event::Text(ref e) => e,
1075+
Event::TextChunk(ref e) => e,
10671076
Event::Decl(ref e) => e,
10681077
Event::PI(ref e) => e,
10691078
Event::CData(ref e) => e,
1079+
Event::CDataChunk(ref e) => e,
10701080
Event::Comment(ref e) => e,
10711081
Event::DocType(ref e) => e,
10721082
Event::Eof => &[],

src/reader/buffered_reader.rs

+42-32
Original file line numberDiff line numberDiff line change
@@ -54,47 +54,57 @@ macro_rules! impl_buffered_source {
5454
buf: &'b mut Vec<u8>,
5555
position: &mut usize,
5656
) -> ReadTextResult<'b, &'b mut Vec<u8>> {
57-
let mut read = 0;
5857
let start = buf.len();
5958
loop {
60-
let available = match self $(.$reader)? .fill_buf() $(.$await)? {
61-
Ok(n) if n.is_empty() => break,
62-
Ok(n) => n,
63-
Err(ref e) if e.kind() == io::ErrorKind::Interrupted => continue,
64-
Err(e) => {
65-
*position += read;
66-
return ReadTextResult::Err(e);
67-
}
59+
return match self.read_text_chunk(&mut *buf, position) $(.$await)? {
60+
ReadTextResult::Markup(_) => return ReadTextResult::Markup(buf),
61+
ReadTextResult::UpToMarkup(_) => ReadTextResult::UpToMarkup(&buf[start..]),
62+
ReadTextResult::UpToEof(n) if n.is_empty() => ReadTextResult::UpToEof(&buf[start..]),
63+
ReadTextResult::UpToEof(_) => continue,
64+
65+
ReadTextResult::Err(e) if e.kind() == io::ErrorKind::Interrupted => continue,
66+
ReadTextResult::Err(e) => ReadTextResult::Err(e),
6867
};
68+
}
69+
}
6970

70-
match memchr::memchr(b'<', available) {
71-
Some(0) => {
72-
self $(.$reader)? .consume(1);
73-
*position += 1;
74-
return ReadTextResult::Markup(buf);
75-
}
76-
Some(i) => {
77-
buf.extend_from_slice(&available[..i]);
71+
#[inline]
72+
$($async)? fn read_text_chunk $(<$lf>)? (
73+
&mut self,
74+
buf: &'b mut Vec<u8>,
75+
position: &mut usize,
76+
) -> ReadTextResult<'b, &'b mut Vec<u8>> {
77+
let start = buf.len();
78+
let available = match self $(.$reader)? .fill_buf() $(.$await)? {
79+
Ok(n) => n,
80+
Err(e) => return ReadTextResult::Err(e),
81+
};
82+
83+
match memchr::memchr(b'<', available) {
84+
Some(0) => {
85+
self $(.$reader)? .consume(1);
86+
*position += 1;
87+
ReadTextResult::Markup(buf)
88+
}
89+
Some(i) => {
90+
buf.extend_from_slice(&available[..i]);
7891

79-
let used = i + 1;
80-
self $(.$reader)? .consume(used);
81-
read += used;
92+
let used = i + 1;
93+
self $(.$reader)? .consume(used);
8294

83-
*position += read;
84-
return ReadTextResult::UpToMarkup(&buf[start..]);
85-
}
86-
None => {
87-
buf.extend_from_slice(available);
95+
*position += used;
96+
ReadTextResult::UpToMarkup(&buf[start..])
97+
}
98+
None => {
99+
buf.extend_from_slice(available);
88100

89-
let used = available.len();
90-
self $(.$reader)? .consume(used);
91-
read += used;
92-
}
101+
let used = available.len();
102+
self $(.$reader)? .consume(used);
103+
104+
*position += used;
105+
ReadTextResult::UpToEof(&buf[start..])
93106
}
94107
}
95-
96-
*position += read;
97-
ReadTextResult::UpToEof(&buf[start..])
98108
}
99109

100110
#[inline]

src/reader/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -814,6 +814,7 @@ trait XmlSource<'r, B> {
814814
///
815815
/// [events]: crate::events::Event
816816
fn read_text(&mut self, buf: B, position: &mut usize) -> ReadTextResult<'r, B>;
817+
fn read_text_chunk(&mut self, buf: B, position: &mut usize) -> ReadTextResult<'r, B>;
817818

818819
/// Read input until `byte` is found or end of input is reached.
819820
///

src/reader/slice_reader.rs

+5
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,11 @@ impl<'a> XmlSource<'a, ()> for &'a [u8] {
279279
}
280280
}
281281

282+
#[inline(always)]
283+
fn read_text_chunk(&mut self, buf: (), position: &mut usize) -> ReadTextResult<'a, ()> {
284+
self.read_text(buf, position)
285+
}
286+
282287
#[inline]
283288
fn read_bytes_until(
284289
&mut self,

src/writer.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -210,12 +210,12 @@ impl<W: Write> Writer<W> {
210210
self.write_wrapped(b"</", e, b">")
211211
}
212212
Event::Empty(ref e) => self.write_wrapped(b"<", e, b"/>"),
213-
Event::Text(ref e) => {
213+
Event::Text(ref e) | Event::TextChunk(ref e) => {
214214
next_should_line_break = false;
215215
self.write(e)
216216
}
217217
Event::Comment(ref e) => self.write_wrapped(b"<!--", e, b"-->"),
218-
Event::CData(ref e) => {
218+
Event::CData(ref e) | Event::CDataChunk(ref e) => {
219219
next_should_line_break = false;
220220
self.write(b"<![CDATA[")?;
221221
self.write(e)?;

src/writer/async_tokio.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ impl<W: AsyncWrite + Unpin> Writer<W> {
2626
self.write_wrapped_async(b"</", e, b">").await
2727
}
2828
Event::Empty(ref e) => self.write_wrapped_async(b"<", e, b"/>").await,
29-
Event::Text(ref e) => {
29+
Event::Text(ref e) | Event::TextChunk(ref e) => {
3030
next_should_line_break = false;
3131
self.write_async(e).await
3232
}
3333
Event::Comment(ref e) => self.write_wrapped_async(b"<!--", e, b"-->").await,
34-
Event::CData(ref e) => {
34+
Event::CData(ref e) | Event::CDataChunk(ref e) => {
3535
next_should_line_break = false;
3636
self.write_async(b"<![CDATA[").await?;
3737
self.write_async(e).await?;

tests/xmlrs_reader_tests.rs

+1
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,7 @@ fn test_bytes(input: &[u8], output: &[u8], trim: bool) {
386386
},
387387
Ok((_, Event::Eof)) => "EndDocument".to_string(),
388388
Err(e) => format!("Error: {}", e),
389+
Ok((_, Event::TextChunk(_))) | Ok((_, Event::CDataChunk(_))) => todo!(),
389390
};
390391
if let Some((n, spec)) = spec_lines.next() {
391392
if spec.trim() == "EndDocument" {

0 commit comments

Comments
 (0)