diff --git a/Userland/Libraries/LibJS/Runtime/Intrinsics.cpp b/Userland/Libraries/LibJS/Runtime/Intrinsics.cpp index dd10a764e5..ff4ee891a3 100644 --- a/Userland/Libraries/LibJS/Runtime/Intrinsics.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intrinsics.cpp @@ -259,12 +259,27 @@ void Intrinsics::initialize_intrinsics(Realm& realm) m_object_prototype_to_string_function = &object_prototype()->get_without_side_effects(vm.names.toString).as_function(); } +template +constexpr inline bool IsTypedArrayConstructor = false; + +#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName, ArrayType) \ + template<> \ + constexpr inline bool IsTypedArrayConstructor = true; +JS_ENUMERATE_TYPED_ARRAYS +#undef __JS_ENUMERATE + #define __JS_ENUMERATE_INNER(ClassName, snake_name, PrototypeName, ConstructorName, Namespace, snake_namespace) \ void Intrinsics::initialize_##snake_namespace##snake_name() \ { \ auto& vm = this->vm(); \ - m_##snake_namespace##snake_name##_prototype = heap().allocate(m_realm, m_realm); \ - m_##snake_namespace##snake_name##_constructor = heap().allocate(m_realm, m_realm); \ + \ + if constexpr (IsTypedArrayConstructor) { \ + m_##snake_namespace##snake_name##_prototype = heap().allocate(m_realm, *typed_array_prototype()); \ + m_##snake_namespace##snake_name##_constructor = heap().allocate(m_realm, m_realm, *typed_array_constructor()); \ + } else { \ + m_##snake_namespace##snake_name##_prototype = heap().allocate(m_realm, m_realm); \ + m_##snake_namespace##snake_name##_constructor = heap().allocate(m_realm, m_realm); \ + } \ \ /* FIXME: Add these special cases to JS_ENUMERATE_NATIVE_OBJECTS */ \ if constexpr (IsSame) \ diff --git a/Userland/Libraries/LibJS/Runtime/TypedArray.cpp b/Userland/Libraries/LibJS/Runtime/TypedArray.cpp index 45e3b9a1f0..5652ccdc02 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArray.cpp +++ b/Userland/Libraries/LibJS/Runtime/TypedArray.cpp @@ -462,8 +462,8 @@ void TypedArrayBase::visit_edges(Visitor& visitor) return vm().names.ClassName.as_string(); \ } \ \ - PrototypeName::PrototypeName(Realm& realm) \ - : Object(*realm.intrinsics().typed_array_prototype()) \ + PrototypeName::PrototypeName(Object& prototype) \ + : Object(prototype) \ { \ } \ \ @@ -478,8 +478,8 @@ void TypedArrayBase::visit_edges(Visitor& visitor) define_direct_property(vm.names.BYTES_PER_ELEMENT, Value((i32)sizeof(Type)), 0); \ } \ \ - ConstructorName::ConstructorName(Realm& realm) \ - : TypedArrayConstructor(realm.vm().names.ClassName.as_string(), *realm.intrinsics().typed_array_constructor()) \ + ConstructorName::ConstructorName(Realm& realm, Object& prototype) \ + : TypedArrayConstructor(realm.vm().names.ClassName.as_string(), prototype) \ { \ } \ \ diff --git a/Userland/Libraries/LibJS/Runtime/TypedArray.h b/Userland/Libraries/LibJS/Runtime/TypedArray.h index 58459fd26c..d1d0361bcc 100644 --- a/Userland/Libraries/LibJS/Runtime/TypedArray.h +++ b/Userland/Libraries/LibJS/Runtime/TypedArray.h @@ -484,7 +484,7 @@ ThrowCompletionOr compare_typed_array_elements(VM&, Value x, Value y, Fu virtual ~PrototypeName() override; \ \ private: \ - PrototypeName(Realm&); \ + PrototypeName(Object& prototype); \ }; \ class ConstructorName final : public TypedArrayConstructor { \ JS_OBJECT(ConstructorName, TypedArrayConstructor); \ @@ -497,7 +497,7 @@ ThrowCompletionOr compare_typed_array_elements(VM&, Value x, Value y, Fu virtual ThrowCompletionOr construct(FunctionObject& new_target) override; \ \ private: \ - explicit ConstructorName(Realm&); \ + explicit ConstructorName(Realm&, Object& prototype); \ virtual bool has_constructor() const override \ { \ return true; \