File tree Expand file tree Collapse file tree
core/engine/src/builtins/array Expand file tree Collapse file tree Original file line number Diff line number Diff 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,
You can’t perform that action at this time.
0 commit comments