From d154a758fa30cd1a2e254489b586df04803e7c55 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 26 Nov 2023 15:08:55 +0100 Subject: [PATCH] LibJS: Devirtualize TypedArrayBase::kind() Let's put this in a member variable to avoid the virtual call. --- Userland/Libraries/LibJS/Runtime/TypedArray.cpp | 3 ++- Userland/Libraries/LibJS/Runtime/TypedArray.h | 12 +++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Userland/Libraries/LibJS/Runtime/TypedArray.cpp b/Userland/Libraries/LibJS/Runtime/TypedArray.cpp index 4ea8e4423d..e2c7ffe90a 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArray.cpp +++ b/Userland/Libraries/LibJS/Runtime/TypedArray.cpp @@ -444,7 +444,8 @@ void TypedArrayBase::visit_edges(Visitor& visitor) \ ClassName::ClassName(Object& prototype, u32 length, ArrayBuffer& array_buffer) \ : TypedArray(prototype, \ - bit_cast(&Intrinsics::snake_name##_constructor), length, array_buffer) \ + bit_cast(&Intrinsics::snake_name##_constructor), \ + length, array_buffer, Kind::ClassName) \ { \ if constexpr (#ClassName##sv.is_one_of("BigInt64Array", "BigUint64Array")) \ m_content_type = ContentType::BigInt; \ diff --git a/Userland/Libraries/LibJS/Runtime/TypedArray.h b/Userland/Libraries/LibJS/Runtime/TypedArray.h index 4e5a2eb87d..093d62cc6d 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArray.h +++ b/Userland/Libraries/LibJS/Runtime/TypedArray.h @@ -53,9 +53,10 @@ public: void set_byte_offset(u32 offset) { m_byte_offset = offset; } void set_viewed_array_buffer(ArrayBuffer* array_buffer) { m_viewed_array_buffer = array_buffer; } + [[nodiscard]] Kind kind() const { return m_kind; } + virtual size_t element_size() const = 0; virtual DeprecatedFlyString const& element_name() const = 0; - virtual Kind kind() const = 0; // 25.1.2.6 IsUnclampedIntegerElementType ( type ), https://tc39.es/ecma262/#sec-isunclampedintegerelementtype virtual bool is_unclamped_integer_element_type() const = 0; @@ -69,8 +70,9 @@ public: virtual Value get_modify_set_value_in_buffer(size_t byte_index, Value value, ReadWriteModifyFunction operation, bool is_little_endian = true) = 0; protected: - TypedArrayBase(Object& prototype, IntrinsicConstructor intrinsic_constructor) + TypedArrayBase(Object& prototype, IntrinsicConstructor intrinsic_constructor, Kind kind) : Object(ConstructWithPrototypeTag::Tag, prototype, MayInterfereWithIndexedPropertyAccess::Yes) + , m_kind(kind) , m_intrinsic_constructor(intrinsic_constructor) { } @@ -79,6 +81,7 @@ protected: u32 m_byte_length { 0 }; u32 m_byte_offset { 0 }; ContentType m_content_type { ContentType::Number }; + Kind m_kind {}; GCPtr m_viewed_array_buffer; IntrinsicConstructor m_intrinsic_constructor { nullptr }; @@ -450,8 +453,8 @@ public: Value get_modify_set_value_in_buffer(size_t byte_index, Value value, ReadWriteModifyFunction operation, bool is_little_endian = true) override { return viewed_array_buffer()->template get_modify_set_value(byte_index, value, move(operation), is_little_endian); } protected: - TypedArray(Object& prototype, IntrinsicConstructor intrinsic_constructor, u32 array_length, ArrayBuffer& array_buffer) - : TypedArrayBase(prototype, intrinsic_constructor) + TypedArray(Object& prototype, IntrinsicConstructor intrinsic_constructor, u32 array_length, ArrayBuffer& array_buffer, Kind kind) + : TypedArrayBase(prototype, intrinsic_constructor, kind) { VERIFY(!Checked::multiplication_would_overflow(array_length, sizeof(UnderlyingBufferDataType))); m_viewed_array_buffer = &array_buffer; @@ -480,7 +483,6 @@ ThrowCompletionOr compare_typed_array_elements(VM&, Value x, Value y, Fu static ThrowCompletionOr> create(Realm&, u32 length); \ static NonnullGCPtr create(Realm&, u32 length, ArrayBuffer& buffer); \ virtual DeprecatedFlyString const& element_name() const override; \ - virtual Kind kind() const override { return Kind::ClassName; } \ \ protected: \ ClassName(Object& prototype, u32 length, ArrayBuffer& array_buffer); \