urlyy commented on code in PR #2765:
URL: https://github.com/apache/fory/pull/2765#discussion_r2428546896
##########
rust/fory-core/src/buffer.rs:
##########
@@ -394,215 +419,254 @@ impl Reader {
}
#[inline(always)]
- pub fn read_bool(&mut self) -> bool {
- let result = unsafe { *self.ptr_at(self.cursor) };
- self.move_next(1);
- result != 0
+ pub fn read_bool(&mut self) -> Result<bool, Error> {
+ let ptr = self.ptr_at(self.cursor)?;
+ self.move_next(1)?;
+ let result = unsafe { *ptr };
+ Ok(result != 0)
}
#[inline(always)]
- pub fn read_u8(&mut self) -> u8 {
- let result = unsafe { *self.ptr_at(self.cursor) };
- self.move_next(1);
- result
+ pub fn read_u8(&mut self) -> Result<u8, Error> {
+ let ptr = self.ptr_at(self.cursor)?;
+ self.move_next(1)?;
+ let result = unsafe { *ptr };
+ Ok(result)
}
#[inline(always)]
- pub fn read_i8(&mut self) -> i8 {
- self.read_u8() as i8
+ pub fn read_i8(&mut self) -> Result<i8, Error> {
+ Ok(self.read_u8()? as i8)
}
#[inline(always)]
- pub fn read_u16(&mut self) -> u16 {
- let result = LittleEndian::read_u16(self.slice_after_cursor());
- self.move_next(2);
- result
+ pub fn read_u16(&mut self) -> Result<u16, Error> {
+ let slice = self.slice_after_cursor()?;
+ let result = LittleEndian::read_u16(slice);
+ self.move_next(2)?;
+ Ok(result)
}
#[inline(always)]
- pub fn read_i16(&mut self) -> i16 {
- let result = LittleEndian::read_i16(self.slice_after_cursor());
- self.move_next(2);
- result
+ pub fn read_i16(&mut self) -> Result<i16, Error> {
+ let slice = self.slice_after_cursor()?;
+ let result = LittleEndian::read_i16(slice);
+ self.move_next(2)?;
+ Ok(result)
}
#[inline(always)]
- pub fn read_u32(&mut self) -> u32 {
- let result = LittleEndian::read_u32(self.slice_after_cursor());
- self.move_next(4);
- result
+ pub fn read_u32(&mut self) -> Result<u32, Error> {
+ let slice = self.slice_after_cursor()?;
+ let result = LittleEndian::read_u32(slice);
+ self.move_next(4)?;
+ Ok(result)
}
#[inline(always)]
- pub fn read_i32(&mut self) -> i32 {
- let result = LittleEndian::read_i32(self.slice_after_cursor());
- self.move_next(4);
- result
+ pub fn read_i32(&mut self) -> Result<i32, Error> {
+ let slice = self.slice_after_cursor()?;
+ let result = LittleEndian::read_i32(slice);
+ self.move_next(4)?;
+ Ok(result)
}
#[inline(always)]
- pub fn read_u64(&mut self) -> u64 {
- let result = LittleEndian::read_u64(self.slice_after_cursor());
- self.move_next(8);
- result
+ pub fn read_u64(&mut self) -> Result<u64, Error> {
+ let slice = self.slice_after_cursor()?;
+ let result = LittleEndian::read_u64(slice);
+ self.move_next(8)?;
+ Ok(result)
}
#[inline(always)]
- pub fn read_i64(&mut self) -> i64 {
- let result = LittleEndian::read_i64(self.slice_after_cursor());
- self.move_next(8);
- result
+ pub fn read_i64(&mut self) -> Result<i64, Error> {
+ let slice = self.slice_after_cursor()?;
+ let result = LittleEndian::read_i64(slice);
+ self.move_next(8)?;
+ Ok(result)
}
#[inline(always)]
- pub fn read_f32(&mut self) -> f32 {
- let result = LittleEndian::read_f32(self.slice_after_cursor());
- self.move_next(4);
- result
+ pub fn read_f32(&mut self) -> Result<f32, Error> {
+ let slice = self.slice_after_cursor()?;
+ let result = LittleEndian::read_f32(slice);
+ self.move_next(4)?;
+ Ok(result)
}
#[inline(always)]
- pub fn read_f64(&mut self) -> f64 {
- let result = LittleEndian::read_f64(self.slice_after_cursor());
- self.move_next(8);
- result
+ pub fn read_f64(&mut self) -> Result<f64, Error> {
+ let slice = self.slice_after_cursor()?;
+ let result = LittleEndian::read_f64(slice);
+ self.move_next(8)?;
+ Ok(result)
}
#[inline(always)]
- pub fn read_varuint32(&mut self) -> u32 {
- let start = self.cursor;
- let b0 = unsafe { *self.bf.add(start) as u32 };
+ pub fn read_varuint32(&mut self) -> Result<u32, Error> {
+ let slice = self.slice_after_cursor()?;
+
+ let b0 = *slice
+ .first()
+ .ok_or_else(|| Error::msg("unexpected end of buffer"))? as u32;
Review Comment:
> Does this closure introduce extra cost, and will the method call here be
inlined ?
I think but not sure the LLVM will do the inline. Need to check the asm
code. `RUSTFLAGS="--emit asm" cargo build --release` and `cat
target/release/deps/project_name-hash.s`
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]