mirror of
https://github.com/MercuryWorkshop/scramjet.git
synced 2025-05-13 06:20:02 -04:00
use i32 and u32 more
This commit is contained in:
parent
40dff8f248
commit
652ca15d62
2 changed files with 26 additions and 25 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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),
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue