Browse Source

LibJS: Add a fast path for setting valid u32 values in Uint32TypedArray

The exisiting fast path only permits for valid i32 values.

On https://cyxx.github.io/another_js, this eliminates the runtime of
typed_array_set_element, and reduces the runtime of put_by_value from
11.1% to 7.7%.
Timothy Flynn 1 year ago
parent
commit
3d2794d062
1 changed files with 9 additions and 0 deletions
  1. 9 0
      Userland/Libraries/LibJS/Bytecode/CommonImplementations.h

+ 9 - 0
Userland/Libraries/LibJS/Bytecode/CommonImplementations.h

@@ -443,6 +443,15 @@ inline ThrowCompletionOr<void> put_by_value(VM& vm, Value base, Value property_k
                 }
             }
 
+            if (typed_array.kind() == TypedArrayBase::Kind::Uint32Array && value.is_integral_number()) {
+                auto integer = value.as_double();
+
+                if (AK::is_within_range<u32>(integer) && is_valid_integer_index(typed_array, canonical_index)) {
+                    fast_typed_array_set_element<u32>(typed_array, index, static_cast<u32>(integer));
+                    return {};
+                }
+            }
+
             switch (typed_array.kind()) {
 #define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName, Type) \
     case TypedArrayBase::Kind::ClassName:                                           \