From 3885fa1d1017aa5debd1638bb0d85f21778cd909 Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Sun, 26 Jun 2022 13:30:33 +0100 Subject: [PATCH] LibJS: Store fn pointer to its intrinsic constructor on TypedArrayBase This represents "the intrinsic object listed in column one of Table X" in the spec. --- Userland/Libraries/LibJS/Runtime/TypedArray.cpp | 3 ++- Userland/Libraries/LibJS/Runtime/TypedArray.h | 11 ++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibJS/Runtime/TypedArray.cpp b/Userland/Libraries/LibJS/Runtime/TypedArray.cpp index 47691a0f12..d597fc4d25 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArray.cpp +++ b/Userland/Libraries/LibJS/Runtime/TypedArray.cpp @@ -373,7 +373,8 @@ void TypedArrayBase::visit_edges(Visitor& visitor) } \ \ ClassName::ClassName(Object& prototype, u32 length, ArrayBuffer& array_buffer) \ - : TypedArray(prototype, length, array_buffer) \ + : TypedArray(prototype, \ + reinterpret_cast(&GlobalObject::snake_name##_constructor), length, array_buffer) \ { \ if constexpr (StringView { #ClassName }.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 ca81edccdc..d11711f3aa 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArray.h +++ b/Userland/Libraries/LibJS/Runtime/TypedArray.h @@ -32,11 +32,14 @@ public: Number, }; + using IntrinsicConstructor = TypedArrayConstructor* (GlobalObject::*)(); + u32 array_length() const { return m_array_length; } u32 byte_length() const { return m_byte_length; } u32 byte_offset() const { return m_byte_offset; } ContentType content_type() const { return m_content_type; } ArrayBuffer* viewed_array_buffer() const { return m_viewed_array_buffer; } + IntrinsicConstructor intrinsic_constructor() const { return m_intrinsic_constructor; } void set_array_length(u32 length) { m_array_length = length; } void set_byte_length(u32 length) { m_byte_length = length; } @@ -58,8 +61,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: - explicit TypedArrayBase(Object& prototype) + TypedArrayBase(Object& prototype, IntrinsicConstructor intrinsic_constructor) : Object(prototype) + , m_intrinsic_constructor(intrinsic_constructor) { } @@ -68,6 +72,7 @@ protected: u32 m_byte_offset { 0 }; ContentType m_content_type { ContentType::Number }; ArrayBuffer* m_viewed_array_buffer { nullptr }; + IntrinsicConstructor m_intrinsic_constructor { nullptr }; private: virtual void visit_edges(Visitor&) override; @@ -430,8 +435,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, u32 array_length, ArrayBuffer& array_buffer) - : TypedArrayBase(prototype) + TypedArray(Object& prototype, IntrinsicConstructor intrinsic_constructor, u32 array_length, ArrayBuffer& array_buffer) + : TypedArrayBase(prototype, intrinsic_constructor) { VERIFY(!Checked::multiplication_would_overflow(array_length, sizeof(UnderlyingBufferDataType))); m_viewed_array_buffer = &array_buffer;