From 720bb21ee2e03bc5c4389e2dfbe9ce1b4478f61b Mon Sep 17 00:00:00 2001 From: Idan Horowitz Date: Fri, 29 Oct 2021 00:55:10 +0300 Subject: [PATCH] LibJS: Convert ArrayBufferPrototype functions to ThrowCompletionOr --- .../LibJS/Runtime/ArrayBufferPrototype.cpp | 56 ++++++++----------- .../LibJS/Runtime/ArrayBufferPrototype.h | 4 +- 2 files changed, 24 insertions(+), 36 deletions(-) diff --git a/Userland/Libraries/LibJS/Runtime/ArrayBufferPrototype.cpp b/Userland/Libraries/LibJS/Runtime/ArrayBufferPrototype.cpp index dedbe5c045..3ce1636e20 100644 --- a/Userland/Libraries/LibJS/Runtime/ArrayBufferPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/ArrayBufferPrototype.cpp @@ -23,8 +23,8 @@ void ArrayBufferPrototype::initialize(GlobalObject& global_object) auto& vm = this->vm(); Object::initialize(global_object); u8 attr = Attribute::Writable | Attribute::Configurable; - define_old_native_function(vm.names.slice, slice, 2, attr); - define_old_native_accessor(vm.names.byteLength, byte_length_getter, {}, Attribute::Configurable); + define_native_function(vm.names.slice, slice, 2, attr); + define_native_accessor(vm.names.byteLength, byte_length_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); @@ -35,18 +35,16 @@ ArrayBufferPrototype::~ArrayBufferPrototype() } // 25.1.5.3 ArrayBuffer.prototype.slice ( start, end ), https://tc39.es/ecma262/#sec-arraybuffer.prototype.slice -JS_DEFINE_OLD_NATIVE_FUNCTION(ArrayBufferPrototype::slice) +JS_DEFINE_NATIVE_FUNCTION(ArrayBufferPrototype::slice) { - auto* array_buffer_object = TRY_OR_DISCARD(typed_this_value(global_object)); + auto* array_buffer_object = TRY(typed_this_value(global_object)); // FIXME: Check for shared buffer - if (array_buffer_object->is_detached()) { - vm.throw_exception(global_object, ErrorType::DetachedArrayBuffer); - return {}; - } + if (array_buffer_object->is_detached()) + return vm.throw_completion(global_object, ErrorType::DetachedArrayBuffer); auto length = array_buffer_object->byte_length(); - auto relative_start = TRY_OR_DISCARD(vm.argument(0).to_integer_or_infinity(global_object)); + auto relative_start = TRY(vm.argument(0).to_integer_or_infinity(global_object)); double first; if (relative_start < 0) @@ -54,7 +52,7 @@ JS_DEFINE_OLD_NATIVE_FUNCTION(ArrayBufferPrototype::slice) else first = min(relative_start, (double)length); - auto relative_end = vm.argument(1).is_undefined() ? length : TRY_OR_DISCARD(vm.argument(1).to_integer_or_infinity(global_object)); + auto relative_end = vm.argument(1).is_undefined() ? length : TRY(vm.argument(1).to_integer_or_infinity(global_object)); double final; if (relative_end < 0) @@ -64,36 +62,26 @@ JS_DEFINE_OLD_NATIVE_FUNCTION(ArrayBufferPrototype::slice) auto new_length = max(final - first, 0.0); - auto* constructor = TRY_OR_DISCARD(species_constructor(global_object, *array_buffer_object, *global_object.array_buffer_constructor())); + auto* constructor = TRY(species_constructor(global_object, *array_buffer_object, *global_object.array_buffer_constructor())); MarkedValueList arguments(vm.heap()); arguments.append(Value(new_length)); - auto* new_array_buffer = TRY_OR_DISCARD(construct(global_object, *constructor, move(arguments))); + auto* new_array_buffer = TRY(construct(global_object, *constructor, move(arguments))); - if (!is(new_array_buffer)) { - vm.throw_exception(global_object, ErrorType::SpeciesConstructorDidNotCreate, "an ArrayBuffer"); - return {}; - } + if (!is(new_array_buffer)) + return vm.throw_completion(global_object, ErrorType::SpeciesConstructorDidNotCreate, "an ArrayBuffer"); auto* new_array_buffer_object = static_cast(new_array_buffer); // FIXME: Check for shared buffer - if (new_array_buffer_object->is_detached()) { - vm.throw_exception(global_object, ErrorType::SpeciesConstructorReturned, "a detached ArrayBuffer"); - return {}; - } - if (same_value(new_array_buffer_object, array_buffer_object)) { - vm.throw_exception(global_object, ErrorType::SpeciesConstructorReturned, "same ArrayBuffer instance"); - return {}; - } - if (new_array_buffer_object->byte_length() < new_length) { - vm.throw_exception(global_object, ErrorType::SpeciesConstructorReturned, "an ArrayBuffer smaller than requested"); - return {}; - } + if (new_array_buffer_object->is_detached()) + return vm.throw_completion(global_object, ErrorType::SpeciesConstructorReturned, "a detached ArrayBuffer"); + if (same_value(new_array_buffer_object, array_buffer_object)) + return vm.throw_completion(global_object, ErrorType::SpeciesConstructorReturned, "same ArrayBuffer instance"); + if (new_array_buffer_object->byte_length() < new_length) + return vm.throw_completion(global_object, ErrorType::SpeciesConstructorReturned, "an ArrayBuffer smaller than requested"); - if (array_buffer_object->is_detached()) { - vm.throw_exception(global_object, ErrorType::DetachedArrayBuffer); - return {}; - } + if (array_buffer_object->is_detached()) + return vm.throw_completion(global_object, ErrorType::DetachedArrayBuffer); // This is ugly, is there a better way to do this? array_buffer_object->buffer().span().slice(first, new_length).copy_to(new_array_buffer_object->buffer().span()); @@ -101,9 +89,9 @@ JS_DEFINE_OLD_NATIVE_FUNCTION(ArrayBufferPrototype::slice) } // 25.1.5.1 get ArrayBuffer.prototype.byteLength, https://tc39.es/ecma262/#sec-get-arraybuffer.prototype.bytelength -JS_DEFINE_OLD_NATIVE_FUNCTION(ArrayBufferPrototype::byte_length_getter) +JS_DEFINE_NATIVE_FUNCTION(ArrayBufferPrototype::byte_length_getter) { - auto* array_buffer_object = TRY_OR_DISCARD(typed_this_value(global_object)); + auto* array_buffer_object = TRY(typed_this_value(global_object)); // FIXME: Check for shared buffer if (array_buffer_object->is_detached()) return Value(0); diff --git a/Userland/Libraries/LibJS/Runtime/ArrayBufferPrototype.h b/Userland/Libraries/LibJS/Runtime/ArrayBufferPrototype.h index ea812a63e0..7dead0a111 100644 --- a/Userland/Libraries/LibJS/Runtime/ArrayBufferPrototype.h +++ b/Userland/Libraries/LibJS/Runtime/ArrayBufferPrototype.h @@ -20,8 +20,8 @@ public: virtual ~ArrayBufferPrototype() override; private: - JS_DECLARE_OLD_NATIVE_FUNCTION(slice); - JS_DECLARE_OLD_NATIVE_FUNCTION(byte_length_getter); + JS_DECLARE_NATIVE_FUNCTION(slice); + JS_DECLARE_NATIVE_FUNCTION(byte_length_getter); }; }