1
0
Fork 0
forked from wry/wry

wayland: keep parser data as &[u32]

This commit is contained in:
Julian Orth 2026-03-28 21:37:32 +01:00
parent fa46be9c3c
commit b745e20f7f

View file

@ -27,24 +27,20 @@ pub enum MsgParserError {
pub struct MsgParser<'a, 'b> { pub struct MsgParser<'a, 'b> {
buf: &'a mut BufFdIn, buf: &'a mut BufFdIn,
pos: usize, pos: usize,
data: &'b [u8], data: &'b [u32],
} }
impl<'a, 'b> MsgParser<'a, 'b> { impl<'a, 'b> MsgParser<'a, 'b> {
pub fn new(buf: &'a mut BufFdIn, data: &'b [u32]) -> Self { pub fn new(buf: &'a mut BufFdIn, data: &'b [u32]) -> Self {
Self { Self { buf, pos: 0, data }
buf,
pos: 0,
data: uapi::as_bytes(data),
}
} }
pub fn int(&mut self) -> Result<i32, MsgParserError> { pub fn int(&mut self) -> Result<i32, MsgParserError> {
if self.data.len() - self.pos < 4 { if self.pos >= self.data.len() {
return Err(MsgParserError::UnexpectedEof); return Err(MsgParserError::UnexpectedEof);
} }
let res = unsafe { *(self.data.as_ptr().add(self.pos) as *const i32) }; let res = unsafe { *(self.data.as_ptr().add(self.pos) as *const i32) };
self.pos += 4; self.pos += 1;
Ok(res) Ok(res)
} }
@ -123,13 +119,13 @@ impl<'a, 'b> MsgParser<'a, 'b> {
pub fn array(&mut self) -> Result<&'b [u8], MsgParserError> { pub fn array(&mut self) -> Result<&'b [u8], MsgParserError> {
let len = self.uint()? as usize; let len = self.uint()? as usize;
let cap = (len + 3) & !3; let cap = (len + 3) >> 2;
if cap > self.data.len() - self.pos { if cap > self.data.len() - self.pos {
return Err(MsgParserError::UnexpectedEof); return Err(MsgParserError::UnexpectedEof);
} }
let pos = self.pos; let pos = self.pos;
self.pos += cap; self.pos += cap;
Ok(&self.data[pos..pos + len]) Ok(&uapi::as_bytes(&self.data[pos..])[..len])
} }
pub fn binary<T: Pod>(&mut self) -> Result<T, MsgParserError> { pub fn binary<T: Pod>(&mut self) -> Result<T, MsgParserError> {