summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Groh <mail@linusgroh.de>2022-07-06 14:19:20 +0200
committerLinus Groh <mail@linusgroh.de>2022-07-06 15:52:57 +0200
commit028a6b90b1cba4fc94004de1ec1b712ad3ec2f35 (patch)
tree0fe88933db6f0983cf0dfaa99e7554b6eddc8665
parent69a385f5599796f48a8fb49e474ff82fd930bf79 (diff)
downloadserenity-028a6b90b1cba4fc94004de1ec1b712ad3ec2f35.zip
LibJS: Revert partial resizable ArrayBuffer implementation
This is a manual but clean revert of all commits from #12595. Adding a partial implementation of the resizable ArrayBuffer proposal without implementing all the updates to TypedArray infrastructure that is also covered by the spec introduced a bunch of crashes, so we decided to revert it for now until a full implementation is completed.
-rw-r--r--Userland/Libraries/LibJS/Runtime/ArrayBuffer.cpp39
-rw-r--r--Userland/Libraries/LibJS/Runtime/ArrayBuffer.h7
-rw-r--r--Userland/Libraries/LibJS/Runtime/ArrayBufferConstructor.cpp49
-rw-r--r--Userland/Libraries/LibJS/Runtime/ArrayBufferPrototype.cpp98
-rw-r--r--Userland/Libraries/LibJS/Runtime/ArrayBufferPrototype.h3
-rw-r--r--Userland/Libraries/LibJS/Runtime/CommonPropertyNames.h3
-rw-r--r--Userland/Libraries/LibJS/Runtime/ErrorTypes.h3
-rw-r--r--Userland/Libraries/LibJS/Runtime/VM.cpp18
-rw-r--r--Userland/Libraries/LibJS/Runtime/VM.h6
-rw-r--r--Userland/Libraries/LibJS/Tests/builtins/ArrayBuffer/ArrayBuffer.js54
-rw-r--r--Userland/Libraries/LibJS/Tests/builtins/ArrayBuffer/ArrayBuffer.prototype.resize.js35
-rw-r--r--Userland/Utilities/js.cpp4
12 files changed, 10 insertions, 309 deletions
diff --git a/Userland/Libraries/LibJS/Runtime/ArrayBuffer.cpp b/Userland/Libraries/LibJS/Runtime/ArrayBuffer.cpp
index 1c60b1f675..a8bc823207 100644
--- a/Userland/Libraries/LibJS/Runtime/ArrayBuffer.cpp
+++ b/Userland/Libraries/LibJS/Runtime/ArrayBuffer.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (c) 2020-2022, Linus Groh <linusg@serenityos.org>
- * Copyright (c) 2022, the SerenityOS developers.
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@@ -45,16 +44,6 @@ ArrayBuffer::ArrayBuffer(ByteBuffer* buffer, Object& prototype)
{
}
-// 1.1.5 IsResizableArrayBuffer ( arrayBuffer ), https://tc39.es/proposal-resizablearraybuffer/#sec-isresizablearraybuffer
-bool ArrayBuffer::is_resizable_array_buffer() const
-{
- // 1. Assert: Type(arrayBuffer) is Object and arrayBuffer has an [[ArrayBufferData]] internal slot.
-
- // 2. If buffer has an [[ArrayBufferMaxByteLength]] internal slot, return true.
- // 3. Return false.
- return m_max_byte_length.has_value();
-}
-
void ArrayBuffer::visit_edges(Cell::Visitor& visitor)
{
Base::visit_edges(visitor);
@@ -62,38 +51,22 @@ void ArrayBuffer::visit_edges(Cell::Visitor& visitor)
}
// 25.1.2.1 AllocateArrayBuffer ( constructor, byteLength ), https://tc39.es/ecma262/#sec-allocatearraybuffer
-// 1.1.2 AllocateArrayBuffer ( constructor, byteLength [, maxByteLength ] ), https://tc39.es/proposal-resizablearraybuffer/#sec-allocatearraybuffer
-ThrowCompletionOr<ArrayBuffer*> allocate_array_buffer(GlobalObject& global_object, FunctionObject& constructor, size_t byte_length, Optional<size_t> max_byte_length)
+ThrowCompletionOr<ArrayBuffer*> allocate_array_buffer(GlobalObject& global_object, FunctionObject& constructor, size_t byte_length)
{
- // 1. Let slots be « [[ArrayBufferData]], [[ArrayBufferByteLength]], [[ArrayBufferDetachKey]] ».
- // 2. If maxByteLength is present, append [[ArrayBufferMaxByteLength]] to slots.
-
- // 3. Let obj be ? OrdinaryCreateFromConstructor(constructor, "%ArrayBuffer.prototype%", slots).
+ // 1. Let obj be ? OrdinaryCreateFromConstructor(constructor, "%ArrayBuffer.prototype%", « [[ArrayBufferData]], [[ArrayBufferByteLength]], [[ArrayBufferDetachKey]] »).
auto* obj = TRY(ordinary_create_from_constructor<ArrayBuffer>(global_object, constructor, &GlobalObject::array_buffer_prototype, nullptr));
- // 4. Let block be ? CreateByteDataBlock(byteLength).
+ // 2. Let block be ? CreateByteDataBlock(byteLength).
auto block = ByteBuffer::create_zeroed(byte_length);
if (block.is_error())
return global_object.vm().throw_completion<RangeError>(global_object, ErrorType::NotEnoughMemoryToAllocate, byte_length);
- // 5. Set obj.[[ArrayBufferData]] to block.
+ // 3. Set obj.[[ArrayBufferData]] to block.
obj->set_buffer(block.release_value());
- // 6. Set obj.[[ArrayBufferByteLength]] to byteLength.
-
- // 7. If maxByteLength is present, then
- if (max_byte_length.has_value()) {
- // a. Assert: byteLength ≤ maxByteLength.
- VERIFY(byte_length <= *max_byte_length);
-
- // b. If it is not possible to create a Data Block block consisting of maxByteLength bytes, throw a RangeError exception.
- // c. NOTE: Resizable ArrayBuffers are designed to be implementable with in-place growth. Implementations reserve the right to throw if, for example, virtual memory cannot be reserved up front.
-
- // d. Set obj.[[ArrayBufferMaxByteLength]] to maxByteLength.
- obj->set_max_byte_length(*max_byte_length);
- }
+ // 4. Set obj.[[ArrayBufferByteLength]] to byteLength.
- // 8. Return obj.
+ // 5. Return obj.
return obj;
}
diff --git a/Userland/Libraries/LibJS/Runtime/ArrayBuffer.h b/Userland/Libraries/LibJS/Runtime/ArrayBuffer.h
index 8cb6aae419..e8d17c3240 100644
--- a/Userland/Libraries/LibJS/Runtime/ArrayBuffer.h
+++ b/Userland/Libraries/LibJS/Runtime/ArrayBuffer.h
@@ -34,13 +34,11 @@ public:
virtual ~ArrayBuffer() override = default;
size_t byte_length() const { return buffer_impl().size(); }
- size_t max_byte_length() const { return m_max_byte_length.value(); } // Will VERIFY() that it has value
ByteBuffer& buffer() { return buffer_impl(); }
ByteBuffer const& buffer() const { return buffer_impl(); }
// Used by allocate_array_buffer() to attach the data block after construction
void set_buffer(ByteBuffer buffer) { m_buffer = move(buffer); }
- void set_max_byte_length(size_t max_byte_length) { m_max_byte_length = max_byte_length; }
Value detach_key() const { return m_detach_key; }
void set_detach_key(Value detach_key) { m_detach_key = detach_key; }
@@ -48,8 +46,6 @@ public:
void detach_buffer() { m_buffer = Empty {}; }
bool is_detached() const { return m_buffer.has<Empty>(); }
- bool is_resizable_array_buffer() const;
-
enum Order {
SeqCst,
Unordered
@@ -77,10 +73,9 @@ private:
// The various detach related members of ArrayBuffer are not used by any ECMA262 functionality,
// but are required to be available for the use of various harnesses like the Test262 test runner.
Value m_detach_key;
- Optional<size_t> m_max_byte_length;
};
-ThrowCompletionOr<ArrayBuffer*> allocate_array_buffer(GlobalObject&, FunctionObject& constructor, size_t byte_length, Optional<size_t> max_byte_length = {});
+ThrowCompletionOr<ArrayBuffer*> allocate_array_buffer(GlobalObject&, FunctionObject& constructor, size_t byte_length);
ThrowCompletionOr<void> detach_array_buffer(GlobalObject&, ArrayBuffer& array_buffer, Optional<Value> key = {});
ThrowCompletionOr<ArrayBuffer*> clone_array_buffer(GlobalObject&, ArrayBuffer& source_buffer, size_t source_byte_offset, size_t source_length);
diff --git a/Userland/Libraries/LibJS/Runtime/ArrayBufferConstructor.cpp b/Userland/Libraries/LibJS/Runtime/ArrayBufferConstructor.cpp
index ac1e9f8500..2b9c6e2f55 100644
--- a/Userland/Libraries/LibJS/Runtime/ArrayBufferConstructor.cpp
+++ b/Userland/Libraries/LibJS/Runtime/ArrayBufferConstructor.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (c) 2020, Linus Groh <linusg@serenityos.org>
- * Copyright (c) 2022, the SerenityOS developers.
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@@ -43,63 +42,21 @@ ThrowCompletionOr<Value> ArrayBufferConstructor::call()
return vm.throw_completion<TypeError>(global_object(), ErrorType::ConstructorWithoutNew, vm.names.ArrayBuffer);
}
-// 1.1.6 GetArrayBufferMaxByteLengthOption ( options ), https://tc39.es/proposal-resizablearraybuffer/#sec-getarraybuffermaxbytelengthoption
-static ThrowCompletionOr<Optional<size_t>> get_array_buffer_max_byte_length_option(VM& vm, GlobalObject& global_object, Value options)
-{
- // 1. If Type(options) is not Object, return empty.
- if (!options.is_object())
- return Optional<size_t>();
-
- // 2. Let maxByteLength be ? Get(options, "maxByteLength").
- auto max_byte_length = TRY(options.get(global_object, vm.names.maxByteLength));
-
- // 3. If maxByteLength is undefined, return empty.
- if (max_byte_length.is_undefined())
- return Optional<size_t>();
-
- // 4. Return ? ToIndex(maxByteLength).
- return TRY(max_byte_length.to_index(global_object));
-}
-
// 25.1.3.1 ArrayBuffer ( length ), https://tc39.es/ecma262/#sec-arraybuffer-length
-// 1.2.1 ArrayBuffer ( length [, options ] ), https://tc39.es/proposal-resizablearraybuffer/#sec-arraybuffer-constructor
ThrowCompletionOr<Object*> ArrayBufferConstructor::construct(FunctionObject& new_target)
{
- auto& global_object = this->global_object();
auto& vm = this->vm();
+ auto byte_length_or_error = vm.argument(0).to_index(global_object());
- // 1. If NewTarget is undefined, throw a TypeError exception.
- // NOTE: See `ArrayBufferConstructor::call()`
-
- // 2. Let byteLength be ? ToIndex(length).
- auto byte_length_or_error = vm.argument(0).to_index(global_object);
if (byte_length_or_error.is_error()) {
auto error = byte_length_or_error.release_error();
if (error.value()->is_object() && is<RangeError>(error.value()->as_object())) {
// Re-throw more specific RangeError
- return vm.throw_completion<RangeError>(global_object, ErrorType::InvalidLength, "array buffer");
+ return vm.throw_completion<RangeError>(global_object(), ErrorType::InvalidLength, "array buffer");
}
return error;
}
- auto byte_length = byte_length_or_error.release_value();
-
- // 3. Let requestedMaxByteLength be ? GetArrayBufferMaxByteLengthOption(options).
- auto options = vm.argument(1);
- auto requested_max_byte_length_value = TRY(get_array_buffer_max_byte_length_option(vm, global_object, options));
-
- // 4. If requestedMaxByteLength is empty, then
- if (!requested_max_byte_length_value.has_value()) {
- // a. Return ? AllocateArrayBuffer(NewTarget, byteLength).
- return TRY(allocate_array_buffer(global_object, new_target, byte_length));
- }
- auto requested_max_byte_length = requested_max_byte_length_value.release_value();
-
- // 5. If byteLength > requestedMaxByteLength, throw a RangeError exception.
- if (byte_length > requested_max_byte_length)
- return vm.throw_completion<RangeError>(global_object, ErrorType::ByteLengthBeyondRequestedMax);
-
- // 6. Return ? AllocateArrayBuffer(NewTarget, byteLength, requestedMaxByteLength).
- return TRY(allocate_array_buffer(global_object, new_target, byte_length, requested_max_byte_length));
+ return TRY(allocate_array_buffer(global_object(), new_target, byte_length_or_error.release_value()));
}
// 25.1.4.1 ArrayBuffer.isView ( arg ), https://tc39.es/ecma262/#sec-arraybuffer.isview
diff --git a/Userland/Libraries/LibJS/Runtime/ArrayBufferPrototype.cpp b/Userland/Libraries/LibJS/Runtime/ArrayBufferPrototype.cpp
index 5d19401e30..463d944c48 100644
--- a/Userland/Libraries/LibJS/Runtime/ArrayBufferPrototype.cpp
+++ b/Userland/Libraries/LibJS/Runtime/ArrayBufferPrototype.cpp
@@ -2,7 +2,6 @@
* Copyright (c) 2020, Linus Groh <linusg@serenityos.org>
* Copyright (c) 2021-2022, Jamie Mansfield <jmansfield@cadixdev.org>
* Copyright (c) 2021, Idan Horowitz <idan.horowitz@serenityos.org>
- * Copyright (c) 2022, the SerenityOS developers.
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@@ -26,10 +25,7 @@ void ArrayBufferPrototype::initialize(GlobalObject& global_object)
Object::initialize(global_object);
u8 attr = Attribute::Writable | Attribute::Configurable;
define_native_function(vm.names.slice, slice, 2, attr);
- define_native_function(vm.names.resize, resize, 1, attr);
define_native_accessor(vm.names.byteLength, byte_length_getter, {}, Attribute::Configurable);
- define_native_accessor(vm.names.maxByteLength, max_byte_length_getter, {}, Attribute::Configurable);
- define_native_accessor(vm.names.resizable, resizable_getter, {}, Attribute::Configurable);
// 25.1.5.4 ArrayBuffer.prototype [ @@toStringTag ], https://tc39.es/ecma262/#sec-arraybuffer.prototype-@@tostringtag
define_direct_property(*vm.well_known_symbol_to_string_tag(), js_string(vm, vm.names.ArrayBuffer.as_string()), Attribute::Configurable);
@@ -124,60 +120,6 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayBufferPrototype::slice)
return new_array_buffer_object;
}
-// 1.3.5 ArrayBuffer.prototype.resize ( newLength ), https://tc39.es/proposal-resizablearraybuffer/#sec-arraybuffer.prototype.resize
-JS_DEFINE_NATIVE_FUNCTION(ArrayBufferPrototype::resize)
-{
- // 1. Let O be the this value.
- auto* array_buffer_object = TRY(typed_this_value(global_object));
-
- // 2. Perform ? RequireInternalSlot(O, [[ArrayBufferMaxByteLength]]).
- if (!array_buffer_object->is_resizable_array_buffer())
- return vm.throw_completion<TypeError>(global_object, ErrorType::NotAResizableArrayBuffer);
-
- // 3. If IsSharedArrayBuffer(O) is true, throw a TypeError exception.
- // FIXME: Check for shared buffer
-
- // 4. If IsDetachedBuffer(O) is true, throw a TypeError exception.
- if (array_buffer_object->is_detached())
- return vm.throw_completion<TypeError>(global_object, ErrorType::DetachedArrayBuffer);
-
- // 5. Let newByteLength be ? ToIntegerOrInfinity(newLength).
- auto new_byte_length = TRY(vm.argument(0).to_integer_or_infinity(global_object));
-
- // 6. If newByteLength < 0 or newByteLength > O.[[ArrayBufferMaxByteLength]], throw a RangeError exception.
- if (new_byte_length < 0 || new_byte_length > array_buffer_object->max_byte_length())
- return vm.throw_completion<RangeError>(global_object, ErrorType::NewByteLengthOutOfRange);
-
- // 7. Let hostHandled be ? HostResizeArrayBuffer(O, newByteLength).
- auto host_handled = TRY(vm.host_resize_array_buffer(global_object, (size_t)new_byte_length));
-
- // 8. If hostHandled is handled, return undefined.
- if (host_handled == VM::HostResizeArrayBufferResult::Handled)
- return js_undefined();
-
- // 9. Let oldBlock be O.[[ArrayBufferData]].
- // 10. Let newBlock be ? CreateByteDataBlock(newByteLength).
- // 11. Let copyLength be min(newByteLength, O.[[ArrayBufferByteLength]]).
- // 12. Perform CopyDataBlockBytes(newBlock, 0, oldBlock, 0, copyLength).
- // 13. NOTE: Neither creation of the new Data Block nor copying from the old Data Block are observable. Implementations reserve the right to implement this method as in-place growth or shrinkage.
- // 14. Set O.[[ArrayBufferData]] to newBlock.
- auto old_byte_length = array_buffer_object->byte_length();
- if (array_buffer_object->buffer().try_resize((size_t)new_byte_length).is_error())
- return global_object.vm().throw_completion<RangeError>(global_object, ErrorType::NotEnoughMemoryToAllocate, new_byte_length);
-
- // Resizing an `AK::ByteBuffer` does not zero initialize any new capacity, but we want it to be anyway
- if (new_byte_length > old_byte_length) {
- // This performs bounds checking whereas a raw `memset` call would not be
- array_buffer_object->buffer().bytes().slice(old_byte_length).fill(0);
- }
-
- // 15. Set O.[[ArrayBufferByteLength]] to newLength.
- // This value is managed by the `AK::ByteBuffer` internally, it already has its new value
-
- // 16. Return undefined.
- return js_undefined();
-}
-
// 25.1.5.1 get ArrayBuffer.prototype.byteLength, https://tc39.es/ecma262/#sec-get-arraybuffer.prototype.bytelength
JS_DEFINE_NATIVE_FUNCTION(ArrayBufferPrototype::byte_length_getter)
{
@@ -199,44 +141,4 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayBufferPrototype::byte_length_getter)
return Value(length);
}
-// 1.3.2 get ArrayBuffer.prototype.maxByteLength, https://tc39.es/proposal-resizablearraybuffer/#sec-get-arraybuffer.prototype.maxbytelength
-JS_DEFINE_NATIVE_FUNCTION(ArrayBufferPrototype::max_byte_length_getter)
-{
- // 1. Let O be the this value.
- // 2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
- auto* array_buffer_object = TRY(typed_this_value(global_object));
-
- // 3. If IsSharedArrayBuffer(O) is true, throw a TypeError exception.
- // FIXME: Check for shared buffer
-
- // 4. If IsDetachedBuffer(O) is true, return +0𝔽.
- if (array_buffer_object->is_detached())
- return Value(0);
-
- // 5. If IsResizableArrayBuffer(O) is true, then
- if (array_buffer_object->is_resizable_array_buffer()) {
- // a. Let length be O.[[ArrayBufferMaxByteLength]].
- return array_buffer_object->max_byte_length();
- }
-
- // 6. Else
- // a. Let length be O.[[ArrayBufferByteLength]].
- // 7. Return 𝔽(length).
- return array_buffer_object->byte_length();
-}
-
-// 1.3.3 get ArrayBuffer.prototype.resizable, https://tc39.es/proposal-resizablearraybuffer/#sec-get-arraybuffer.prototype.resizable
-JS_DEFINE_NATIVE_FUNCTION(ArrayBufferPrototype::resizable_getter)
-{
- // 1. Let O be the this value.
- // 2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
- auto* array_buffer_object = TRY(typed_this_value(global_object));
-
- // 3. If IsSharedArrayBuffer(O) is true, throw a TypeError exception.
- // FIXME: Check for shared buffer
-
- // 4. Return IsResizableArrayBuffer(O).
- return array_buffer_object->is_resizable_array_buffer();
-}
-
}
diff --git a/Userland/Libraries/LibJS/Runtime/ArrayBufferPrototype.h b/Userland/Libraries/LibJS/Runtime/ArrayBufferPrototype.h
index 6e427f4238..2baae73737 100644
--- a/Userland/Libraries/LibJS/Runtime/ArrayBufferPrototype.h
+++ b/Userland/Libraries/LibJS/Runtime/ArrayBufferPrototype.h
@@ -21,10 +21,7 @@ public:
private:
JS_DECLARE_NATIVE_FUNCTION(slice);
- JS_DECLARE_NATIVE_FUNCTION(resize);
JS_DECLARE_NATIVE_FUNCTION(byte_length_getter);
- JS_DECLARE_NATIVE_FUNCTION(max_byte_length_getter);
- JS_DECLARE_NATIVE_FUNCTION(resizable_getter);
};
}
diff --git a/Userland/Libraries/LibJS/Runtime/CommonPropertyNames.h b/Userland/Libraries/LibJS/Runtime/CommonPropertyNames.h
index 64098d67f3..5b9bf6d7b0 100644
--- a/Userland/Libraries/LibJS/Runtime/CommonPropertyNames.h
+++ b/Userland/Libraries/LibJS/Runtime/CommonPropertyNames.h
@@ -316,7 +316,6 @@ namespace JS {
P(log10) \
P(map) \
P(max) \
- P(maxByteLength) \
P(maximize) \
P(mergeFields) \
P(message) \
@@ -388,8 +387,6 @@ namespace JS {
P(reject) \
P(relativeTo) \
P(repeat) \
- P(resize) \
- P(resizable) \
P(resolve) \
P(resolvedOptions) \
P(reverse) \
diff --git a/Userland/Libraries/LibJS/Runtime/ErrorTypes.h b/Userland/Libraries/LibJS/Runtime/ErrorTypes.h
index c7434c5af8..bb9698990e 100644
--- a/Userland/Libraries/LibJS/Runtime/ErrorTypes.h
+++ b/Userland/Libraries/LibJS/Runtime/ErrorTypes.h
@@ -15,7 +15,6 @@
M(BigIntFromNonIntegral, "Cannot convert non-integral number to BigInt") \
M(BigIntInvalidValue, "Invalid value for BigInt: {}") \
M(BindingNotInitialized, "Binding {} is not initialized") \
- M(ByteLengthBeyondRequestedMax, "Byte length exceeds maxByteLength option") \
M(CallStackSizeExceeded, "Call stack size limit exceeded") \
M(CannotDeclareGlobalFunction, "Cannot declare global function of name '{}'") \
M(CannotDeclareGlobalVariable, "Cannot declare global variable of name '{}'") \
@@ -79,7 +78,6 @@
M(ModuleNotFound, "Cannot find/open module: '{}'") \
M(ModuleNotFoundNoReferencingScript, "Cannot resolve module {} without any active script or module") \
M(NegativeExponent, "Exponent must be positive") \
- M(NewByteLengthOutOfRange, "New byte length outside range supported by ArrayBuffer instance") \
M(NonExtensibleDefine, "Cannot define property {} on non-extensible object") \
M(NotAConstructor, "{} is not a constructor") \
M(NotAFunction, "{} is not a function") \
@@ -88,7 +86,6 @@
M(NotAnObjectOfType, "Not an object of type {}") \
M(NotAnObjectOrNull, "{} is neither an object nor null") \
M(NotAnObjectOrString, "{} is neither an object nor a string") \
- M(NotAResizableArrayBuffer, "ArrayBuffer instance not resizable") \
M(NotAString, "{} is not a string") \
M(NotASymbol, "{} is not a symbol") \
M(NotImplemented, "TODO({} is not implemented in LibJS)") \
diff --git a/Userland/Libraries/LibJS/Runtime/VM.cpp b/Userland/Libraries/LibJS/Runtime/VM.cpp
index 466bc8c7a8..193c01d25f 100644
--- a/Userland/Libraries/LibJS/Runtime/VM.cpp
+++ b/Userland/Libraries/LibJS/Runtime/VM.cpp
@@ -14,7 +14,6 @@
#include <LibJS/Interpreter.h>
#include <LibJS/Runtime/AbstractOperations.h>
#include <LibJS/Runtime/Array.h>
-#include <LibJS/Runtime/ArrayBuffer.h>
#include <LibJS/Runtime/BoundFunction.h>
#include <LibJS/Runtime/Completion.h>
#include <LibJS/Runtime/ECMAScriptFunctionObject.h>
@@ -114,23 +113,6 @@ VM::VM(OwnPtr<CustomData> custom_data)
return Vector<String> { "type" };
};
- // 1.1.7 HostResizeArrayBuffer ( buffer, newByteLength ), https://tc39.es/proposal-resizablearraybuffer/#sec-hostresizearraybuffer
- host_resize_array_buffer = [](GlobalObject& global_object, size_t new_byte_length) {
- // The host-defined abstract operation HostResizeArrayBuffer takes arguments buffer (an ArrayBuffer) and newByteLength (a non-negative integer).
- // The host-defined abstract operation HostResizeArrayBuffer takes arguments buffer (an ArrayBuffer object) and newByteLength.
- // It gives the host an opportunity to perform implementation-defined resizing of buffer. If the host chooses not to handle resizing of buffer, it may return unhandled for the default behavior.
- // The implementation of HostResizeArrayBuffer must conform to the following requirements:
- // * The abstract operation must return either NormalCompletion(handled), NormalCompletion(unhandled), or an abrupt throw completion.
- // * The abstract operation does not detach buffer.
- // * If the abstract operation completes normally with handled, buffer.[[ArrayBufferByteLength]] is newByteLength.
- // The default implementation of HostResizeArrayBuffer is to return unhandled.
-
- (void)global_object;
- (void)new_byte_length;
-
- return HostResizeArrayBufferResult::Unhandled;
- };
-
// 19.2.1.2 HostEnsureCanCompileStrings ( callerRealm, calleeRealm ), https://tc39.es/ecma262/#sec-hostensurecancompilestrings
host_ensure_can_compile_strings = [](Realm&) -> ThrowCompletionOr<void> {
// The host-defined abstract operation HostEnsureCanCompileStrings takes argument calleeRealm (a Realm Record)
diff --git a/Userland/Libraries/LibJS/Runtime/VM.h b/Userland/Libraries/LibJS/Runtime/VM.h
index cd882c6b07..4f7dc2b8db 100644
--- a/Userland/Libraries/LibJS/Runtime/VM.h
+++ b/Userland/Libraries/LibJS/Runtime/VM.h
@@ -39,11 +39,6 @@ public:
static NonnullRefPtr<VM> create(OwnPtr<CustomData> = {});
~VM() = default;
- enum class HostResizeArrayBufferResult {
- Unhandled,
- Handled,
- };
-
Heap& heap() { return m_heap; }
Heap const& heap() const { return m_heap; }
@@ -233,7 +228,6 @@ public:
Function<void(FinalizationRegistry&)> host_enqueue_finalization_registry_cleanup_job;
Function<void(Function<ThrowCompletionOr<Value>()>, Realm*)> host_enqueue_promise_job;
Function<JobCallback(FunctionObject&)> host_make_job_callback;
- Function<ThrowCompletionOr<HostResizeArrayBufferResult>(GlobalObject&, size_t)> host_resize_array_buffer;
Function<ThrowCompletionOr<void>(Realm&)> host_ensure_can_compile_strings;
private:
diff --git a/Userland/Libraries/LibJS/Tests/builtins/ArrayBuffer/ArrayBuffer.js b/Userland/Libraries/LibJS/Tests/builtins/ArrayBuffer/ArrayBuffer.js
index 193d2e47aa..8fb05a250c 100644
--- a/Userland/Libraries/LibJS/Tests/builtins/ArrayBuffer/ArrayBuffer.js
+++ b/Userland/Libraries/LibJS/Tests/builtins/ArrayBuffer/ArrayBuffer.js
@@ -11,57 +11,3 @@ test("ArrayBuffer constructor must be invoked with 'new'", () => {
ArrayBuffer();
}).toThrowWithMessage(TypeError, "ArrayBuffer constructor must be called with 'new'");
});
-
-describe("resizable array buffer", () => {
- test("construct with options", () => {
- expect(new ArrayBuffer(5, { maxByteLength: 5 })).toBeInstanceOf(ArrayBuffer);
- });
-
- test("resizable when provided max byte length", () => {
- expect(new ArrayBuffer(1).resizable).toEqual(false);
- expect(new ArrayBuffer(1, {}).resizable).toEqual(false);
- expect(new ArrayBuffer(1, { maxByteLength: undefined }).resizable).toEqual(false);
- expect(new ArrayBuffer(1, { maxByteLength: 1 }).resizable).toEqual(true);
- });
-
- test("byte length must be shorter than max byte length", () => {
- expect(() => {
- new ArrayBuffer(1, { maxByteLength: 0 });
- }).toThrowWithMessage(RangeError, "Byte length exceeds maxByteLength option");
- });
-
- test("max byte length cannot be too large", () => {
- expect(() => {
- new ArrayBuffer(0, { maxByteLength: 9007199254740992 });
- }).toThrowWithMessage(RangeError, "Index must be a positive integer");
- });
-
- test("max byte length cannot be negative", () => {
- expect(() => {
- new ArrayBuffer(0, { maxByteLength: -1 });
- }).toThrowWithMessage(RangeError, "Index must be a positive integer");
- });
-
- test("invalid max byte length object", () => {
- expect(() => {
- new ArrayBuffer(0, {
- maxByteLength: {
- toString: function () {
- return {};
- },
- valueOf: function () {
- return {};
- },
- },
- });
- }).toThrowWithMessage(TypeError, "Cannot convert object to number");
-
- expect(() => {
- new ArrayBuffer(0, {
- get maxByteLength() {
- throw "Exception";
- },
- });
- }).toThrow();
- });
-});
diff --git a/Userland/Libraries/LibJS/Tests/builtins/ArrayBuffer/ArrayBuffer.prototype.resize.js b/Userland/Libraries/LibJS/Tests/builtins/ArrayBuffer/ArrayBuffer.prototype.resize.js
deleted file mode 100644
index e8b67f16bc..0000000000
--- a/Userland/Libraries/LibJS/Tests/builtins/ArrayBuffer/ArrayBuffer.prototype.resize.js
+++ /dev/null
@@ -1,35 +0,0 @@
-test("length is 1", () => {
- expect(ArrayBuffer.prototype.resize).toHaveLength(1);
-});
-
-test("resize up to max", () => {
- let a = new ArrayBuffer(0, { maxByteLength: 10 });
- a.resize(10);
- expect(a.byteLength).toEqual(10);
-});
-
-test("resize less than max", () => {
- let a = new ArrayBuffer(10, { maxByteLength: 10 });
- a.resize(5);
- expect(a.byteLength).toEqual(5);
-});
-
-test("resize with negative length", () => {
- let a = new ArrayBuffer(10, { maxByteLength: 10 });
- expect(() => {
- a.resize(-1);
- }).toThrowWithMessage(
- RangeError,
- "New byte length outside range supported by ArrayBuffer instance"
- );
-});
-
-test("resize past max length", () => {
- let a = new ArrayBuffer(10, { maxByteLength: 10 });
- expect(() => {
- a.resize(11);
- }).toThrowWithMessage(
- RangeError,
- "New byte length outside range supported by ArrayBuffer instance"
- );
-});
diff --git a/Userland/Utilities/js.cpp b/Userland/Utilities/js.cpp
index f4a4e04ed2..22ad20c771 100644
--- a/Userland/Utilities/js.cpp
+++ b/Userland/Utilities/js.cpp
@@ -469,10 +469,6 @@ static void print_array_buffer(JS::ArrayBuffer const& array_buffer, HashTable<JS
print_type("ArrayBuffer");
js_out("\n byteLength: ");
print_value(JS::Value((double)byte_length), seen_objects);
- if (array_buffer.is_resizable_array_buffer()) {
- js_out("\n maxByteLength: ");
- print_value(JS::Value((double)array_buffer.max_byte_length()), seen_objects);
- }
if (!byte_length)
return;
js_outln();