Skip to content

Commit a4a2a88

Browse files
committed
perf(array): add dense array fast-path for Array.prototype.unshift
Signed-off-by: Exar04 <yashdhadwe@gmail.com>
1 parent 3cec5e6 commit a4a2a88

1 file changed

Lines changed: 42 additions & 0 deletions

File tree

  • core/engine/src/builtins/array

core/engine/src/builtins/array/mod.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1291,6 +1291,48 @@ impl Array {
12911291
.with_message("length + number of arguments exceeds the max safe integer limit")
12921292
.into());
12931293
}
1294+
1295+
if o.is_array() {
1296+
let mut o_borrow = o.borrow_mut();
1297+
let props = &mut o_borrow.properties_mut().indexed_properties;
1298+
1299+
let fast_path = match props {
1300+
IndexedProperties::DenseI32(dense) if dense.len() as u64 == len => {
1301+
let all_i32: Option<ThinVec<i32>> =
1302+
args.iter().map(JsValue::as_i32).collect();
1303+
if let Some(items) = all_i32 {
1304+
dense.splice(0..0, items);
1305+
true
1306+
} else {
1307+
false
1308+
}
1309+
}
1310+
IndexedProperties::DenseF64(dense) if dense.len() as u64 == len => {
1311+
let all_f64: Option<ThinVec<f64>> =
1312+
args.iter().map(JsValue::as_number).collect();
1313+
if let Some(items) = all_f64 {
1314+
dense.splice(0..0, items);
1315+
true
1316+
} else {
1317+
false
1318+
}
1319+
}
1320+
IndexedProperties::DenseElement(dense) if dense.len() as u64 == len => {
1321+
dense.splice(0..0, args.iter().cloned());
1322+
true
1323+
}
1324+
_ => false,
1325+
};
1326+
1327+
drop(o_borrow);
1328+
1329+
if fast_path {
1330+
let new_len = len + arg_count;
1331+
Self::set_length(&o, new_len, context)?;
1332+
return Ok(new_len.into());
1333+
}
1334+
}
1335+
12941336
// b. Let k be len.
12951337
let mut k = len;
12961338
// c. Repeat, while k > 0,

0 commit comments

Comments
 (0)