diff --git a/Userland/Libraries/LibJS/Runtime/ArrayBuffer.cpp b/Userland/Libraries/LibJS/Runtime/ArrayBuffer.cpp index c8bc89586d..fc168cabf2 100644 --- a/Userland/Libraries/LibJS/Runtime/ArrayBuffer.cpp +++ b/Userland/Libraries/LibJS/Runtime/ArrayBuffer.cpp @@ -19,6 +19,11 @@ ArrayBuffer* ArrayBuffer::create(GlobalObject& global_object, ByteBuffer& buffer return global_object.heap().allocate(global_object, buffer, *global_object.array_buffer_prototype()); } +ArrayBuffer* ArrayBuffer::create(GlobalObject& global_object, ByteBuffer* buffer) +{ + return global_object.heap().allocate(global_object, buffer, *global_object.array_buffer_prototype()); +} + ArrayBuffer::ArrayBuffer(size_t byte_size, Object& prototype) : Object(prototype) , m_buffer(ByteBuffer::create_zeroed(byte_size)) @@ -31,6 +36,12 @@ ArrayBuffer::ArrayBuffer(ByteBuffer& buffer, Object& prototype) { } +ArrayBuffer::ArrayBuffer(ByteBuffer* buffer, Object& prototype) + : Object(prototype) + , m_buffer(buffer) +{ +} + ArrayBuffer::~ArrayBuffer() { } diff --git a/Userland/Libraries/LibJS/Runtime/ArrayBuffer.h b/Userland/Libraries/LibJS/Runtime/ArrayBuffer.h index 4c5dfb869c..d731afc322 100644 --- a/Userland/Libraries/LibJS/Runtime/ArrayBuffer.h +++ b/Userland/Libraries/LibJS/Runtime/ArrayBuffer.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include namespace JS { @@ -17,17 +18,28 @@ class ArrayBuffer : public Object { public: static ArrayBuffer* create(GlobalObject&, size_t); static ArrayBuffer* create(GlobalObject&, ByteBuffer&); + static ArrayBuffer* create(GlobalObject&, ByteBuffer*); ArrayBuffer(size_t, Object& prototype); ArrayBuffer(ByteBuffer& buffer, Object& prototype); + ArrayBuffer(ByteBuffer* buffer, Object& prototype); virtual ~ArrayBuffer() override; - size_t byte_length() const { return m_buffer.size(); } - ByteBuffer& buffer() { return m_buffer; } - const ByteBuffer& buffer() const { return m_buffer; } + size_t byte_length() const { return buffer_impl().size(); } + ByteBuffer& buffer() { return buffer_impl(); } + const ByteBuffer& buffer() const { return buffer_impl(); } private: - ByteBuffer m_buffer; + ByteBuffer& buffer_impl() + { + ByteBuffer* ptr { nullptr }; + m_buffer.visit([&](auto* pointer) { ptr = pointer; }, [&](auto& value) { ptr = &value; }); + return *ptr; + } + + const ByteBuffer& buffer_impl() const { return const_cast(this)->buffer_impl(); } + + Variant m_buffer; }; }