use i32 and u32 more

This commit is contained in:
Toshit Chawda 2025-03-08 15:03:30 -08:00
parent 40dff8f248
commit 652ca15d62
No known key found for this signature in database
GPG key ID: 91480ED99E2B3D9D
2 changed files with 26 additions and 25 deletions

View file

@ -172,7 +172,7 @@ impl<'data> Rewrite<'data> {
enum Change<'a> { enum Change<'a> {
Str(&'a str), Str(&'a str),
Number(usize), U32(u32),
} }
impl<'a> From<&'a str> for Change<'a> { impl<'a> From<&'a str> for Change<'a> {
@ -199,9 +199,9 @@ impl<'a> From<&'a AssignmentOperator> for Change<'a> {
} }
} }
impl From<usize> for Change<'static> { impl From<u32> for Change<'static> {
fn from(value: usize) -> Self { fn from(value: u32) -> Self {
Self::Number(value) Self::U32(value)
} }
} }
@ -286,7 +286,7 @@ impl JsChange<'_> {
fn to_inner<'alloc, 'change, E>( fn to_inner<'alloc, 'change, E>(
&'change self, &'change self,
cfg: &'change Config<'alloc, E>, cfg: &'change Config<'alloc, E>,
offset: usize, offset: u32,
) -> JsChangeInner<'change> ) -> JsChangeInner<'change>
where where
E: Fn(&str, &'alloc Allocator) -> String<'alloc>, E: Fn(&str, &'alloc Allocator) -> String<'alloc>,
@ -332,7 +332,7 @@ impl JsChange<'_> {
loc: span.start, loc: span.start,
str: changes![ str: changes![
"/*scramtag ", "/*scramtag ",
span.start as usize + offset, span.start + offset,
" ", " ",
cfg.sourcetag, cfg.sourcetag,
"*/" "*/"
@ -424,14 +424,16 @@ impl<'alloc: 'data, 'data> JsChanges<'alloc, 'data> {
where where
E: Fn(&str, &'alloc Allocator) -> String<'alloc>, E: Fn(&str, &'alloc Allocator) -> String<'alloc>,
{ {
// using wrapping adds for perf, 4gb large files is really an edge case
let mut offset = 0; let mut offset = 0;
let mut added = 0i64; let mut added = 0i32;
let mut buffer = Vec::with_capacity_in(js.len() * 2, self.alloc); let mut buffer = Vec::with_capacity_in(js.len() * 2, self.alloc);
macro_rules! tryget { macro_rules! tryget {
($range:expr) => { ($start:ident..$end:ident) => {
js.get($range) js.get($start as usize..$end as usize)
.ok_or_else(|| RewriterError::Oob(($range).start, ($range).end))? .ok_or_else(|| RewriterError::Oob($start, $end))?
}; };
} }
macro_rules! eval { macro_rules! eval {
@ -441,7 +443,7 @@ impl<'alloc: 'data, 'data> JsChanges<'alloc, 'data> {
buffer.extend_from_slice(x.as_bytes()); buffer.extend_from_slice(x.as_bytes());
x.len() x.len()
} }
Change::Number(x) => { Change::U32(x) => {
let x = format_compact_str!("{}", x); let x = format_compact_str!("{}", x);
buffer.extend_from_slice(x.as_bytes()); buffer.extend_from_slice(x.as_bytes());
x.len() x.len()
@ -457,15 +459,14 @@ impl<'alloc: 'data, 'data> JsChanges<'alloc, 'data> {
for change in &self.inner { for change in &self.inner {
let span = change.get_span(); let span = change.get_span();
let start = span.start as usize; let start = span.start;
let end = span.end as usize; let end = span.end;
buffer.extend_from_slice(tryget!(offset..start).as_bytes()); buffer.extend_from_slice(tryget!(offset..start).as_bytes());
match change.to_inner(cfg, offset) { match change.to_inner(cfg, offset) {
JsChangeInner::Insert { loc, str } => { JsChangeInner::Insert { loc, str } => {
let mut len = 0u32; let mut len = 0u32;
let loc = loc as usize;
buffer.extend_from_slice(tryget!(start..loc).as_bytes()); buffer.extend_from_slice(tryget!(start..loc).as_bytes());
for str in &str { for str in &str {
len += eval!(str) as u32; len += eval!(str) as u32;
@ -475,13 +476,11 @@ impl<'alloc: 'data, 'data> JsChanges<'alloc, 'data> {
// INSERT op // INSERT op
map.push(0); map.push(0);
// pos // pos
map.extend_from_slice( map.extend_from_slice(&loc.wrapping_add_signed(added).to_le_bytes());
&((loc as u32).wrapping_add_signed(added as i32)).to_le_bytes(),
);
// size // size
map.extend_from_slice(&len.to_le_bytes()); map.extend_from_slice(&len.to_le_bytes());
added += len as i64; added = added.wrapping_add_unsigned(len);
} }
JsChangeInner::Replace { str } => { JsChangeInner::Replace { str } => {
let mut len = 0u32; let mut len = 0u32;
@ -494,24 +493,24 @@ impl<'alloc: 'data, 'data> JsChanges<'alloc, 'data> {
// len // len
map.extend_from_slice(&(span.end - span.start).to_le_bytes()); map.extend_from_slice(&(span.end - span.start).to_le_bytes());
// start // start
map.extend_from_slice( map.extend_from_slice(&(span.start.wrapping_add_signed(added)).to_le_bytes());
&(span.start.wrapping_add_signed(added as i32)).to_le_bytes(),
);
// end // end
map.extend_from_slice( map.extend_from_slice(
&((span.start + len).wrapping_add_signed(added as i32)).to_le_bytes(), &((span.start + len).wrapping_add_signed(added)).to_le_bytes(),
); );
// oldstr // oldstr
map.extend_from_slice(tryget!(start..end).as_bytes()); map.extend_from_slice(tryget!(start..end).as_bytes());
added += len as i64 - (span.end - span.start) as i64; let len = i32::try_from(len).map_err(|_| RewriterError::AddedTooLarge)?;
let diff = len.wrapping_sub_unsigned(span.end - span.start);
added = added.wrapping_add(diff);
} }
} }
offset = end; offset = end;
} }
let js_len = js.len(); let js_len = js.len() as u32;
buffer.extend_from_slice(tryget!(offset..js_len).as_bytes()); buffer.extend_from_slice(tryget!(offset..js_len).as_bytes());
Ok(JsChangeResult { Ok(JsChangeResult {

View file

@ -20,7 +20,9 @@ pub enum RewriterError {
#[error("oxc panicked in parser: {0}")] #[error("oxc panicked in parser: {0}")]
OxcPanicked(std::string::String), OxcPanicked(std::string::String),
#[error("out of bounds while applying range: {0}..{1})")] #[error("out of bounds while applying range: {0}..{1})")]
Oob(usize, usize), Oob(u32, u32),
#[error("too much code added while applying changes")]
AddedTooLarge,
#[error("formatting error: {0}")] #[error("formatting error: {0}")]
Formatting(#[from] std::fmt::Error), Formatting(#[from] std::fmt::Error),
} }