1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 20:47:45 +00:00

LibJS: Convert Atomics functions to ThrowCompletionOr

This commit is contained in:
Timothy Flynn 2021-10-23 13:58:25 -04:00 committed by Linus Groh
parent 3edf86462b
commit 20f73d2abc
2 changed files with 57 additions and 61 deletions

View file

@ -146,31 +146,31 @@ void AtomicsObject::initialize(GlobalObject& global_object)
auto& vm = this->vm();
u8 attr = Attribute::Writable | Attribute::Configurable;
define_old_native_function(vm.names.add, add, 3, attr);
define_old_native_function(vm.names.and_, and_, 3, attr);
define_old_native_function(vm.names.compareExchange, compare_exchange, 4, attr);
define_old_native_function(vm.names.exchange, exchange, 3, attr);
define_old_native_function(vm.names.isLockFree, is_lock_free, 1, attr);
define_old_native_function(vm.names.load, load, 2, attr);
define_old_native_function(vm.names.or_, or_, 3, attr);
define_old_native_function(vm.names.store, store, 3, attr);
define_old_native_function(vm.names.sub, sub, 3, attr);
define_old_native_function(vm.names.xor_, xor_, 3, attr);
define_native_function(vm.names.add, add, 3, attr);
define_native_function(vm.names.and_, and_, 3, attr);
define_native_function(vm.names.compareExchange, compare_exchange, 4, attr);
define_native_function(vm.names.exchange, exchange, 3, attr);
define_native_function(vm.names.isLockFree, is_lock_free, 1, attr);
define_native_function(vm.names.load, load, 2, attr);
define_native_function(vm.names.or_, or_, 3, attr);
define_native_function(vm.names.store, store, 3, attr);
define_native_function(vm.names.sub, sub, 3, attr);
define_native_function(vm.names.xor_, xor_, 3, attr);
// 25.4.15 Atomics [ @@toStringTag ], https://tc39.es/ecma262/#sec-atomics-@@tostringtag
define_direct_property(*vm.well_known_symbol_to_string_tag(), js_string(global_object.heap(), "Atomics"), Attribute::Configurable);
}
// 25.4.3 Atomics.add ( typedArray, index, value ), https://tc39.es/ecma262/#sec-atomics.add
JS_DEFINE_OLD_NATIVE_FUNCTION(AtomicsObject::add)
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::add)
{
auto* typed_array = TRY_OR_DISCARD(typed_array_from(global_object, vm.argument(0)));
auto* typed_array = TRY(typed_array_from(global_object, vm.argument(0)));
auto atomic_add = [](auto* storage, auto value) { return AK::atomic_fetch_add(storage, value); };
#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName, Type) \
if (is<ClassName>(typed_array)) \
return TRY_OR_DISCARD(perform_atomic_operation<Type>(global_object, *typed_array, move(atomic_add)));
return TRY(perform_atomic_operation<Type>(global_object, *typed_array, move(atomic_add)));
JS_ENUMERATE_TYPED_ARRAYS
#undef __JS_ENUMERATE
@ -178,15 +178,15 @@ JS_DEFINE_OLD_NATIVE_FUNCTION(AtomicsObject::add)
}
// 25.4.4 Atomics.and ( typedArray, index, value ), https://tc39.es/ecma262/#sec-atomics.and
JS_DEFINE_OLD_NATIVE_FUNCTION(AtomicsObject::and_)
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::and_)
{
auto* typed_array = TRY_OR_DISCARD(typed_array_from(global_object, vm.argument(0)));
auto* typed_array = TRY(typed_array_from(global_object, vm.argument(0)));
auto atomic_and = [](auto* storage, auto value) { return AK::atomic_fetch_and(storage, value); };
#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName, Type) \
if (is<ClassName>(typed_array)) \
return TRY_OR_DISCARD(perform_atomic_operation<Type>(global_object, *typed_array, move(atomic_and)));
return TRY(perform_atomic_operation<Type>(global_object, *typed_array, move(atomic_and)));
JS_ENUMERATE_TYPED_ARRAYS
#undef __JS_ENUMERATE
@ -274,13 +274,13 @@ static ThrowCompletionOr<Value> atomic_compare_exchange_impl(GlobalObject& globa
}
// 25.4.5 Atomics.compareExchange ( typedArray, index, expectedValue, replacementValue ), https://tc39.es/ecma262/#sec-atomics.compareexchange
JS_DEFINE_OLD_NATIVE_FUNCTION(AtomicsObject::compare_exchange)
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::compare_exchange)
{
auto* typed_array = TRY_OR_DISCARD(typed_array_from(global_object, vm.argument(0)));
auto* typed_array = TRY(typed_array_from(global_object, vm.argument(0)));
#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName, Type) \
if (is<ClassName>(typed_array)) \
return TRY_OR_DISCARD(atomic_compare_exchange_impl<Type>(global_object, *typed_array));
return TRY(atomic_compare_exchange_impl<Type>(global_object, *typed_array));
JS_ENUMERATE_TYPED_ARRAYS
#undef __JS_ENUMERATE
@ -288,15 +288,15 @@ JS_DEFINE_OLD_NATIVE_FUNCTION(AtomicsObject::compare_exchange)
}
// 25.4.6 Atomics.exchange ( typedArray, index, value ), https://tc39.es/ecma262/#sec-atomics.exchange
JS_DEFINE_OLD_NATIVE_FUNCTION(AtomicsObject::exchange)
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::exchange)
{
auto* typed_array = TRY_OR_DISCARD(typed_array_from(global_object, vm.argument(0)));
auto* typed_array = TRY(typed_array_from(global_object, vm.argument(0)));
auto atomic_exchange = [](auto* storage, auto value) { return AK::atomic_exchange(storage, value); };
#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName, Type) \
if (is<ClassName>(typed_array)) \
return TRY_OR_DISCARD(perform_atomic_operation<Type>(global_object, *typed_array, move(atomic_exchange)));
return TRY(perform_atomic_operation<Type>(global_object, *typed_array, move(atomic_exchange)));
JS_ENUMERATE_TYPED_ARRAYS
#undef __JS_ENUMERATE
@ -304,9 +304,9 @@ JS_DEFINE_OLD_NATIVE_FUNCTION(AtomicsObject::exchange)
}
// 25.4.7 Atomics.isLockFree ( size ), https://tc39.es/ecma262/#sec-atomics.islockfree
JS_DEFINE_OLD_NATIVE_FUNCTION(AtomicsObject::is_lock_free)
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::is_lock_free)
{
auto size = TRY_OR_DISCARD(vm.argument(0).to_integer_or_infinity(global_object));
auto size = TRY(vm.argument(0).to_integer_or_infinity(global_object));
if (size == 1)
return Value(AK::atomic_is_lock_free<u8>());
if (size == 2)
@ -319,32 +319,30 @@ JS_DEFINE_OLD_NATIVE_FUNCTION(AtomicsObject::is_lock_free)
}
// 25.4.8 Atomics.load ( typedArray, index ), https://tc39.es/ecma262/#sec-atomics.load
JS_DEFINE_OLD_NATIVE_FUNCTION(AtomicsObject::load)
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::load)
{
auto* typed_array = TRY_OR_DISCARD(typed_array_from(global_object, vm.argument(0)));
auto* typed_array = TRY(typed_array_from(global_object, vm.argument(0)));
TRY_OR_DISCARD(validate_integer_typed_array(global_object, *typed_array));
TRY(validate_integer_typed_array(global_object, *typed_array));
auto indexed_position = TRY_OR_DISCARD(validate_atomic_access(global_object, *typed_array, vm.argument(1)));
auto indexed_position = TRY(validate_atomic_access(global_object, *typed_array, vm.argument(1)));
if (typed_array->viewed_array_buffer()->is_detached()) {
vm.throw_exception<TypeError>(global_object, ErrorType::DetachedArrayBuffer);
return {};
}
if (typed_array->viewed_array_buffer()->is_detached())
return vm.throw_completion<TypeError>(global_object, ErrorType::DetachedArrayBuffer);
return typed_array->get_value_from_buffer(indexed_position, ArrayBuffer::Order::SeqCst, true);
}
// 25.4.9 Atomics.or ( typedArray, index, value ), https://tc39.es/ecma262/#sec-atomics.or
JS_DEFINE_OLD_NATIVE_FUNCTION(AtomicsObject::or_)
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::or_)
{
auto* typed_array = TRY_OR_DISCARD(typed_array_from(global_object, vm.argument(0)));
auto* typed_array = TRY(typed_array_from(global_object, vm.argument(0)));
auto atomic_or = [](auto* storage, auto value) { return AK::atomic_fetch_or(storage, value); };
#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName, Type) \
if (is<ClassName>(typed_array)) \
return TRY_OR_DISCARD(perform_atomic_operation<Type>(global_object, *typed_array, move(atomic_or)));
return TRY(perform_atomic_operation<Type>(global_object, *typed_array, move(atomic_or)));
JS_ENUMERATE_TYPED_ARRAYS
#undef __JS_ENUMERATE
@ -352,40 +350,38 @@ JS_DEFINE_OLD_NATIVE_FUNCTION(AtomicsObject::or_)
}
// 25.4.10 Atomics.store ( typedArray, index, value ), https://tc39.es/ecma262/#sec-atomics.store
JS_DEFINE_OLD_NATIVE_FUNCTION(AtomicsObject::store)
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::store)
{
auto* typed_array = TRY_OR_DISCARD(typed_array_from(global_object, vm.argument(0)));
auto* typed_array = TRY(typed_array_from(global_object, vm.argument(0)));
TRY_OR_DISCARD(validate_integer_typed_array(global_object, *typed_array));
TRY(validate_integer_typed_array(global_object, *typed_array));
auto indexed_position = TRY_OR_DISCARD(validate_atomic_access(global_object, *typed_array, vm.argument(1)));
auto indexed_position = TRY(validate_atomic_access(global_object, *typed_array, vm.argument(1)));
auto value = vm.argument(2);
Value value_to_set;
if (typed_array->content_type() == TypedArrayBase::ContentType::BigInt)
value_to_set = TRY_OR_DISCARD(value.to_bigint(global_object));
value_to_set = TRY(value.to_bigint(global_object));
else
value_to_set = Value(TRY_OR_DISCARD(value.to_integer_or_infinity(global_object)));
value_to_set = Value(TRY(value.to_integer_or_infinity(global_object)));
if (typed_array->viewed_array_buffer()->is_detached()) {
vm.throw_exception<TypeError>(global_object, ErrorType::DetachedArrayBuffer);
return {};
}
if (typed_array->viewed_array_buffer()->is_detached())
return vm.throw_completion<TypeError>(global_object, ErrorType::DetachedArrayBuffer);
typed_array->set_value_in_buffer(indexed_position, value_to_set, ArrayBuffer::Order::SeqCst, true);
return value_to_set;
}
// 25.4.11 Atomics.sub ( typedArray, index, value ), https://tc39.es/ecma262/#sec-atomics.sub
JS_DEFINE_OLD_NATIVE_FUNCTION(AtomicsObject::sub)
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::sub)
{
auto* typed_array = TRY_OR_DISCARD(typed_array_from(global_object, vm.argument(0)));
auto* typed_array = TRY(typed_array_from(global_object, vm.argument(0)));
auto atomic_sub = [](auto* storage, auto value) { return AK::atomic_fetch_sub(storage, value); };
#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName, Type) \
if (is<ClassName>(typed_array)) \
return TRY_OR_DISCARD(perform_atomic_operation<Type>(global_object, *typed_array, move(atomic_sub)));
return TRY(perform_atomic_operation<Type>(global_object, *typed_array, move(atomic_sub)));
JS_ENUMERATE_TYPED_ARRAYS
#undef __JS_ENUMERATE
@ -393,15 +389,15 @@ JS_DEFINE_OLD_NATIVE_FUNCTION(AtomicsObject::sub)
}
// 25.4.14 Atomics.xor ( typedArray, index, value ), https://tc39.es/ecma262/#sec-atomics.xor
JS_DEFINE_OLD_NATIVE_FUNCTION(AtomicsObject::xor_)
JS_DEFINE_NATIVE_FUNCTION(AtomicsObject::xor_)
{
auto* typed_array = TRY_OR_DISCARD(typed_array_from(global_object, vm.argument(0)));
auto* typed_array = TRY(typed_array_from(global_object, vm.argument(0)));
auto atomic_xor = [](auto* storage, auto value) { return AK::atomic_fetch_xor(storage, value); };
#define __JS_ENUMERATE(ClassName, snake_name, PrototypeName, ConstructorName, Type) \
if (is<ClassName>(typed_array)) \
return TRY_OR_DISCARD(perform_atomic_operation<Type>(global_object, *typed_array, move(atomic_xor)));
return TRY(perform_atomic_operation<Type>(global_object, *typed_array, move(atomic_xor)));
JS_ENUMERATE_TYPED_ARRAYS
#undef __JS_ENUMERATE