diff --git a/jerry-core/CMakeLists.txt b/jerry-core/CMakeLists.txt index f4e08de8b..0a3f5e32f 100644 --- a/jerry-core/CMakeLists.txt +++ b/jerry-core/CMakeLists.txt @@ -166,6 +166,7 @@ set(SOURCE_CORE_FILES ecma/builtin-objects/ecma-builtin-async-generator-prototype.c ecma/builtin-objects/ecma-builtin-async-generator.c ecma/builtin-objects/ecma-builtin-async-iterator-prototype.c + ecma/builtin-objects/ecma-builtin-atomics.c ecma/builtin-objects/ecma-builtin-bigint-prototype.c ecma/builtin-objects/ecma-builtin-bigint.c ecma/builtin-objects/ecma-builtin-boolean-prototype.c @@ -265,6 +266,7 @@ set(SOURCE_CORE_FILES ecma/operations/ecma-array-object.c ecma/operations/ecma-arraybuffer-object.c ecma/operations/ecma-async-generator-object.c + ecma/operations/ecma-atomics-object.c ecma/operations/ecma-big-uint.c ecma/operations/ecma-bigint-object.c ecma/operations/ecma-bigint.c @@ -362,6 +364,7 @@ if(ENABLE_AMALGAM) ecma/builtin-objects/ecma-builtin-async-generator-prototype.inc.h ecma/builtin-objects/ecma-builtin-async-generator.inc.h ecma/builtin-objects/ecma-builtin-async-iterator-prototype.inc.h + ecma/builtin-objects/ecma-builtin-atomics.inc.h ecma/builtin-objects/ecma-builtin-bigint-prototype.inc.h ecma/builtin-objects/ecma-builtin-bigint.inc.h ecma/builtin-objects/ecma-builtin-boolean-prototype.inc.h @@ -440,6 +443,7 @@ if(ENABLE_AMALGAM) ecma/operations/ecma-array-object.h ecma/operations/ecma-arraybuffer-object.h ecma/operations/ecma-async-generator-object.h + ecma/operations/ecma-atomics-object.h ecma/operations/ecma-big-uint.h ecma/operations/ecma-bigint-object.h ecma/operations/ecma-bigint.h diff --git a/jerry-core/config.h b/jerry-core/config.h index 7c5d0305f..d2b2204d0 100644 --- a/jerry-core/config.h +++ b/jerry-core/config.h @@ -115,6 +115,10 @@ # define JERRY_BUILTIN_SHAREDARRAYBUFFER JERRY_ESNEXT #endif /* !defined (JERRY_BUILTIN_SHAREDARRAYBUFFER) */ +#ifndef JERRY_BUILTIN_ATOMICS +# define JERRY_BUILTIN_ATOMICS JERRY_ESNEXT +#endif /* !defined (JERRY_BUILTIN_ATOMICS) */ + #ifndef JERRY_BUILTIN_WEAKREF # define JERRY_BUILTIN_WEAKREF JERRY_ESNEXT #endif /* !defined (JERRY_BUILTIN_WEAKREF) */ @@ -588,6 +592,10 @@ || ((JERRY_BUILTIN_SHAREDARRAYBUFFER != 0) && (JERRY_BUILTIN_SHAREDARRAYBUFFER != 1)) # error "Invalid value for JERRY_BUILTIN_SHAREDARRAYBUFFER macro." #endif +#if !defined (JERRY_BUILTIN_ATOMICS) \ +|| ((JERRY_BUILTIN_ATOMICS != 0) && (JERRY_BUILTIN_ATOMICS != 1)) +# error "Invalid value for JERRY_BUILTIN_ATOMICS macro." +#endif #if !defined (JERRY_BUILTIN_BIGINT) \ || ((JERRY_BUILTIN_BIGINT != 0) && (JERRY_BUILTIN_BIGINT != 1)) # error "Invalid value for JERRY_BUILTIN_BIGINT macro." @@ -611,6 +619,9 @@ #if (JERRY_BUILTIN_TYPEDARRAY == 0) && (JERRY_BUILTIN_SHAREDARRAYBUFFER == 1) # error "JERRY_BUILTIN_TYPEDARRAY should be enabled too to enable JERRY_BUILTIN_SHAREDARRAYBUFFER macro." #endif +#if (JERRY_BUILTIN_SHAREDARRAYBUFFER == 0) && (JERRY_BUILTIN_ATOMICS == 1) +# error "JERRY_BUILTIN_SHAREDARRAYBUFFER should be enabled too to enable JERRY_BUILTIN_ATOMICS macro." +#endif /** * Internal options. diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-atomics.c b/jerry-core/ecma/builtin-objects/ecma-builtin-atomics.c new file mode 100644 index 000000000..a73850b1e --- /dev/null +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-atomics.c @@ -0,0 +1,259 @@ +/* Copyright JS Foundation and other contributors, http://js.foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ecma-atomics-object.h" +#include "ecma-builtins.h" +#include "ecma-globals.h" +#include "ecma-helpers.h" +#include "jrt.h" + +#if JERRY_BUILTIN_ATOMICS + +#define ECMA_BUILTINS_INTERNAL + +#include "ecma-builtins-internal.h" + +/** + * This object has a custom dispatch function. + */ +#define BUILTIN_CUSTOM_DISPATCH + +/** + * List of built-in routine identifiers. + */ +enum +{ + ECMA_ATOMICS_ROUTINE_START = 0, /**< Special value, should be ignored */ + ECMA_ATOMICS_ROUTINE_ADD, /**< Atomics add routine */ + ECMA_ATOMICS_ROUTINE_AND, /**< Atomics and routine */ + ECMA_ATOMICS_ROUTINE_COMPAREEXCHANGE, /**< Atomics compare exchange routine */ + ECMA_ATOMICS_ROUTINE_EXCHANGE, /**< Atomics exchange routine */ + ECMA_ATOMICS_ROUTINE_ISLOCKFREE, /**< Atomics is lock free routine */ + ECMA_ATOMICS_ROUTINE_LOAD, /**< Atomics load routine */ + ECMA_ATOMICS_ROUTINE_OR, /**< Atomics or routine */ + ECMA_ATOMICS_ROUTINE_STORE, /**< Atomics store routine */ + ECMA_ATOMICS_ROUTINE_SUB, /**< Atomics sub routine */ + ECMA_ATOMICS_ROUTINE_WAIT, /**< Atomics wait routine */ + ECMA_ATOMICS_ROUTINE_NOTIFY, /**< Atomics notify routine */ + ECMA_ATOMICS_ROUTINE_XOR, /**< Atomics xor routine */ +}; + +#define BUILTIN_INC_HEADER_NAME "ecma-builtin-atomics.inc.h" +#define BUILTIN_UNDERSCORED_ID atomics + +#include "ecma-builtin-internal-routines-template.inc.h" + +/** \addtogroup ecma ECMA + * @{ + * + * \addtogroup ecmabuiltins + * @{ + * + * \addtogroup atomics ECMA Atomics object built-in + * @{ + */ + +/** + * The Atomics object's 'compareExchange' routine + * + * See also: ES11 24.4.4 + * + * @return ecma value + * Returned value must be freed with ecma_free_value. + */ +static ecma_value_t +ecma_builtin_atomics_compare_exchange (ecma_value_t typedarray, /**< typedArray argument */ + ecma_value_t index, /**< index argument */ + ecma_value_t expected_value, /**< expectedValue argument */ + ecma_value_t replacement_value) /**< replacementValue argument*/ +{ + JERRY_UNUSED (typedarray); + JERRY_UNUSED (index); + JERRY_UNUSED (expected_value); + JERRY_UNUSED (replacement_value); + + return ecma_make_uint32_value (0); +} /* ecma_builtin_atomics_compare_exchange */ + +/** + * The Atomics object's 'isLockFree' routine + * + * See also: ES11 24.4.6 + * + * @return ecma value + * Returned value must be freed with ecma_free_value. + */ +static ecma_value_t +ecma_builtin_atomics_is_lock_free (ecma_value_t size) /**< size argument */ +{ + JERRY_UNUSED (size); + + return ECMA_VALUE_FALSE; +} /* ecma_builtin_atomics_is_lock_free */ + +/** + * The Atomics object's 'store' routine + * + * See also: ES11 24.4.9 + * + * @return ecma value + * Returned value must be freed with ecma_free_value. + */ +static ecma_value_t +ecma_builtin_atomics_store (ecma_value_t typedarray, /**< typedArray argument */ + ecma_value_t index, /**< index argument */ + ecma_value_t value) /**< value argument */ +{ + JERRY_UNUSED (typedarray); + JERRY_UNUSED (index); + JERRY_UNUSED (value); + + return ecma_make_uint32_value (0); +} /* ecma_builtin_atomics_store */ + +/** + * The Atomics object's 'wait' routine + * + * See also: ES11 24.4.11 + * + * @return ecma value + * Returned value must be freed with ecma_free_value. + */ +static ecma_value_t +ecma_builtin_atomics_wait (ecma_value_t typedarray, /**< typedArray argument */ + ecma_value_t index, /**< index argument */ + ecma_value_t value, /**< value argument */ + ecma_value_t timeout) /**< timeout argument */ +{ + JERRY_UNUSED (typedarray); + JERRY_UNUSED (index); + JERRY_UNUSED (value); + JERRY_UNUSED (timeout); + + return ecma_make_uint32_value (0); +} /* ecma_builtin_atomics_wait */ + +/** + * The Atomics object's 'notify' routine + * + * See also: ES11 24.4.12 + * + * @return ecma value + * Returned value must be freed with ecma_free_value. + */ +static ecma_value_t +ecma_builtin_atomics_notify (ecma_value_t typedarray, /**< typedArray argument */ + ecma_value_t index, /**< index argument */ + ecma_value_t count) /**< count argument */ +{ + JERRY_UNUSED (typedarray); + JERRY_UNUSED (index); + JERRY_UNUSED (count); + + return ecma_make_uint32_value (0); +} /* ecma_builtin_atomics_notify */ + +/** + * Dispatcher of the built-in's routines + * + * @return ecma value + * Returned value must be freed with ecma_free_value. + */ +ecma_value_t +ecma_builtin_atomics_dispatch_routine (uint8_t builtin_routine_id, /**< built-in wide routine identifier */ + ecma_value_t this_arg, /**< 'this' argument value */ + const ecma_value_t arguments_list_p[], /**< list of arguments + * passed to routine */ + uint32_t arguments_number) /**< length of arguments' list */ +{ + JERRY_UNUSED (this_arg); + ecma_value_t arg1 = arguments_list_p[0]; + ecma_value_t arg2 = arguments_list_p[1]; + ecma_value_t arg3 = arguments_list_p[2]; + ecma_value_t arg4 = (arguments_number > 3) ? arguments_list_p[3] : ECMA_VALUE_UNDEFINED; + + ecma_atomics_op_t type; + + switch (builtin_routine_id) + { + case ECMA_ATOMICS_ROUTINE_ADD: + { + type = ECMA_ATOMICS_ADD; + break; + } + case ECMA_ATOMICS_ROUTINE_AND: + { + type = ECMA_ATOMICS_AND; + break; + } + case ECMA_ATOMICS_ROUTINE_COMPAREEXCHANGE: + { + return ecma_builtin_atomics_compare_exchange (arg1, arg2, arg3, arg4); + } + case ECMA_ATOMICS_ROUTINE_EXCHANGE: + { + type = ECMA_ATOMICS_EXCHANGE; + break; + } + case ECMA_ATOMICS_ROUTINE_ISLOCKFREE: + { + return ecma_builtin_atomics_is_lock_free (arg1); + } + case ECMA_ATOMICS_ROUTINE_LOAD: + { + return ecma_atomic_load (arg1, arg2); + } + case ECMA_ATOMICS_ROUTINE_OR: + { + type = ECMA_ATOMICS_OR; + break; + } + case ECMA_ATOMICS_ROUTINE_STORE: + { + return ecma_builtin_atomics_store (arg1, arg2, arg3); + } + case ECMA_ATOMICS_ROUTINE_SUB: + { + type = ECMA_ATOMICS_SUBTRACT; + break; + } + case ECMA_ATOMICS_ROUTINE_WAIT: + { + return ecma_builtin_atomics_wait (arg1, arg2, arg3, arg4); + } + case ECMA_ATOMICS_ROUTINE_NOTIFY: + { + return ecma_builtin_atomics_notify (arg1, arg2, arg3); + } + case ECMA_ATOMICS_ROUTINE_XOR: + { + type = ECMA_ATOMICS_XOR; + break; + } + default: + { + JERRY_UNREACHABLE (); + } + } + return ecma_atomic_read_modify_write (arg1, arg2, arg3, type); +} /* ecma_builtin_atomics_dispatch_routine */ + +/** + * @} + * @} + * @} + */ + +#endif /* JERRY_BUILTIN_ATOMICS */ diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-atomics.inc.h b/jerry-core/ecma/builtin-objects/ecma-builtin-atomics.inc.h new file mode 100644 index 000000000..7eab23725 --- /dev/null +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-atomics.inc.h @@ -0,0 +1,46 @@ +/* Copyright JS Foundation and other contributors, http://js.foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * Atomics built-in description + */ + +#include "ecma-builtin-helpers-macro-defines.inc.h" + +#if JERRY_BUILTIN_ATOMICS + +/* ECMA-262 v11, 24.4.14 */ +STRING_VALUE (LIT_GLOBAL_SYMBOL_TO_STRING_TAG, + LIT_MAGIC_STRING_ATOMICS_U, + ECMA_PROPERTY_FLAG_CONFIGURABLE) + +/* Routine properties: + * (property name, C routine name, arguments number or NON_FIXED, value of the routine's length property) */ +ROUTINE (LIT_MAGIC_STRING_ADD, ECMA_ATOMICS_ROUTINE_ADD, 3, 3) +ROUTINE (LIT_MAGIC_STRING_ATOMICS_AND, ECMA_ATOMICS_ROUTINE_AND, 3, 3) +ROUTINE (LIT_MAGIC_STRING_ATOMICS_COMPAREEXCHANGE, ECMA_ATOMICS_ROUTINE_COMPAREEXCHANGE, 4, 4) +ROUTINE (LIT_MAGIC_STRING_ATOMICS_EXCHANGE, ECMA_ATOMICS_ROUTINE_EXCHANGE, 3, 3) +ROUTINE (LIT_MAGIC_STRING_ATOMICS_ISLOCKFREE, ECMA_ATOMICS_ROUTINE_ISLOCKFREE, 1, 1) +ROUTINE (LIT_MAGIC_STRING_ATOMICS_LOAD, ECMA_ATOMICS_ROUTINE_LOAD, 2, 2) +ROUTINE (LIT_MAGIC_STRING_ATOMICS_OR, ECMA_ATOMICS_ROUTINE_OR, 3, 3) +ROUTINE (LIT_MAGIC_STRING_ATOMICS_STORE, ECMA_ATOMICS_ROUTINE_STORE, 3, 3) +ROUTINE (LIT_MAGIC_STRING_ATOMICS_SUB, ECMA_ATOMICS_ROUTINE_SUB, 3, 3) +ROUTINE (LIT_MAGIC_STRING_ATOMICS_WAIT, ECMA_ATOMICS_ROUTINE_WAIT, 4, 4) +ROUTINE (LIT_MAGIC_STRING_ATOMICS_NOTIFY, ECMA_ATOMICS_ROUTINE_NOTIFY, 3, 3) +ROUTINE (LIT_MAGIC_STRING_ATOMICS_XOR, ECMA_ATOMICS_ROUTINE_XOR, 3, 3) + +#endif /* JERRY_BUILTIN_ATOMICS */ + +#include "ecma-builtin-helpers-macro-undefs.inc.h" diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-global.inc.h b/jerry-core/ecma/builtin-objects/ecma-builtin-global.inc.h index 28b7b685b..88007be2f 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-global.inc.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-global.inc.h @@ -153,6 +153,13 @@ OBJECT_VALUE (LIT_MAGIC_STRING_JSON_U, ECMA_PROPERTY_CONFIGURABLE_WRITABLE) #endif /* JERRY_BUILTIN_JSON */ +#if JERRY_BUILTIN_ATOMICS +/* ECMA-262 v5, 15.1.5.2 */ +OBJECT_VALUE (LIT_MAGIC_STRING_ATOMICS_U, + ECMA_BUILTIN_ID_ATOMICS, + ECMA_PROPERTY_CONFIGURABLE_WRITABLE) +#endif /* JERRY_BUILTIN_ATOMICS */ + #if JERRY_BUILTIN_TYPEDARRAY OBJECT_VALUE (LIT_MAGIC_STRING_ARRAY_BUFFER_UL, ECMA_BUILTIN_ID_ARRAYBUFFER, diff --git a/jerry-core/ecma/builtin-objects/ecma-builtins.inc.h b/jerry-core/ecma/builtin-objects/ecma-builtins.inc.h index f74cd2534..66d0e23e5 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtins.inc.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtins.inc.h @@ -174,6 +174,15 @@ BUILTIN (ECMA_BUILTIN_ID_JSON, json) #endif /* JERRY_BUILTIN_JSON */ +#if JERRY_BUILTIN_ATOMICS +/* The Atomics object (24.4) */ +BUILTIN (ECMA_BUILTIN_ID_ATOMICS, + ECMA_OBJECT_TYPE_BUILT_IN_GENERAL, + ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, + true, + atomics) +#endif /* JERRY_BUILTIN_ATOMICS */ + #if JERRY_BUILTIN_DATE /* The Date object (15.9.3) */ BUILTIN_ROUTINE (ECMA_BUILTIN_ID_DATE, diff --git a/jerry-core/ecma/operations/ecma-atomics-object.c b/jerry-core/ecma/operations/ecma-atomics-object.c new file mode 100644 index 000000000..e598b3d14 --- /dev/null +++ b/jerry-core/ecma/operations/ecma-atomics-object.c @@ -0,0 +1,259 @@ +/* Copyright JS Foundation and other contributors, http://js.foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ecma-atomics-object.h" +#include "ecma-arraybuffer-object.h" +#include "ecma-shared-arraybuffer-object.h" +#include "ecma-bigint.h" +#include "ecma-typedarray-object.h" +#include "ecma-objects.h" +#include "ecma-builtins.h" +#include "ecma-exceptions.h" +#include "ecma-gc.h" +#include "ecma-globals.h" +#include "ecma-helpers.h" +#include "jmem.h" +#include "jcontext.h" +#include "ecma-function-object.h" + +#if JERRY_BUILTIN_ATOMICS + +/** \addtogroup ecma ECMA + * @{ + * + * \addtogroup ecmaatomicsobject ECMA builtin Atomics helper functions + * @{ + */ + +/** + * Atomics validate Shared integer typedArray + * + * See also: ES11 24.4.1.1 + * + * @return ecma value + */ +ecma_value_t +ecma_validate_shared_integer_typedarray (ecma_value_t typedarray, /**< typedArray argument */ + bool waitable) /**< waitable argument */ +{ + /* 2. */ + if (!ecma_is_value_object (typedarray)) + { + return ecma_raise_type_error (ECMA_ERR_MSG ("Argument 'this' is not an object")); + } + + /* 3-4. */ + ecma_object_t *typedarray_p = ecma_get_object_from_value (typedarray); + ecma_typedarray_info_t target_info = ecma_typedarray_get_info (typedarray_p); + + /* 5-6. */ + if (waitable) + { + if (!(target_info.id == ECMA_BIGINT64_ARRAY || target_info.id == ECMA_INT32_ARRAY)) + { + return ecma_raise_type_error (ECMA_ERR_MSG ("Argument is not supported")); + } + } + else + { + if (target_info.id == ECMA_UINT8_CLAMPED_ARRAY || target_info.id == ECMA_FLOAT32_ARRAY + || target_info.id == ECMA_FLOAT64_ARRAY) + { + return ecma_raise_type_error (ECMA_ERR_MSG ("Argument is not supported")); + } + } + + /* 7. */ + JERRY_ASSERT (target_info.array_buffer_p != NULL); + + /* 8-10. */ + ecma_object_t *buffer = ecma_typedarray_get_arraybuffer (typedarray_p); + + if (!ecma_object_class_is (buffer, ECMA_OBJECT_CLASS_SHARED_ARRAY_BUFFER)) + { + return ecma_raise_type_error (ECMA_ERR_MSG ("Argument is not SharedArrayBuffer")); + } + + return ecma_make_object_value (buffer); +} /* ecma_validate_shared_integer_typedarray */ + +/** + * Atomics validate Atomic Access + * + * See also: ES11 24.4.1.2 + * + * @return ecma value + */ +ecma_value_t +ecma_validate_atomic_access (ecma_value_t typedarray, /**< typedArray argument */ + ecma_value_t request_index) /**< request_index argument */ +{ + /* 1. */ + JERRY_ASSERT (ecma_is_value_object (typedarray) + && ecma_typedarray_get_arraybuffer (ecma_get_object_from_value (typedarray)) != NULL); + + ecma_object_t *typedarray_p = ecma_get_object_from_value (typedarray); + + /* 2. */ + ecma_number_t access_index; + if (ECMA_IS_VALUE_ERROR (ecma_op_to_index (request_index, &access_index))) + { + return ECMA_VALUE_ERROR; + } + + /* 3. */ + ecma_typedarray_info_t target_info = ecma_typedarray_get_info (typedarray_p); + + /* 4. */ + JERRY_ASSERT (access_index >= 0); + + /* 5-6. */ + if (JERRY_UNLIKELY (access_index >= target_info.length)) + { + return ecma_raise_range_error (ECMA_ERR_MSG ("Invalid length")); + } + + return ecma_make_number_value (access_index); +} /* ecma_validate_atomic_access */ + +/** + * Atomics read, modify, write + * + * See also: ES11 24.4.1.11 + * + * @return ecma value + */ +ecma_value_t +ecma_atomic_read_modify_write (ecma_value_t typedarray, /**< typedArray argument */ + ecma_value_t index, /**< index argument */ + ecma_value_t value, /**< value argument */ + ecma_atomics_op_t op) /**< operation argument */ +{ + /* 1. */ + ecma_value_t buffer = ecma_validate_shared_integer_typedarray (typedarray, false); + + if (ECMA_IS_VALUE_ERROR (buffer)) + { + return buffer; + } + + /* 2. */ + ecma_value_t idx = ecma_validate_atomic_access (typedarray, index); + + if (ECMA_IS_VALUE_ERROR (idx)) + { + return idx; + } + + /* 3. */ + ecma_object_t *typedarray_p = ecma_get_object_from_value (typedarray); + ecma_typedarray_info_t target_info = ecma_typedarray_get_info (typedarray_p); + + /* 4-5. */ + ecma_value_t val = ECMA_VALUE_ERROR; + ecma_number_t tmp; + if (target_info.id == ECMA_BIGINT64_ARRAY || target_info.id == ECMA_BIGUINT64_ARRAY) + { + val = ecma_bigint_to_bigint (value, true); + } + else if (!ECMA_IS_VALUE_ERROR (ecma_op_to_integer (value, &tmp))) + { + val = ecma_make_number_value (tmp); + } + + if (ECMA_IS_VALUE_ERROR (val)) + { + return val; + } + + /* 6. */ + uint8_t element_size = target_info.element_size; + + /* 7. */ + ecma_typedarray_type_t element_type = target_info.id; + + /* 8. */ + uint32_t offset = target_info.offset; + + /* 9. */ + uint32_t indexed_position = ecma_number_to_uint32 (idx) * element_size + offset; + + JERRY_UNUSED (indexed_position); + JERRY_UNUSED (element_type); + JERRY_UNUSED (val); + JERRY_UNUSED (buffer); + JERRY_UNUSED (op); + + ecma_free_value (val); + + /* 10. */ + return ecma_make_uint32_value (0); +} /* ecma_atomic_read_modify_write */ + +/** + * Atomics load + * + * See also: ES11 24.4.1.12 + * + * @return ecma value + */ +ecma_value_t +ecma_atomic_load (ecma_value_t typedarray, /**< typedArray argument */ + ecma_value_t index) /**< index argument */ +{ + ecma_value_t buffer = ecma_validate_shared_integer_typedarray (typedarray, false); + + if (ECMA_IS_VALUE_ERROR (buffer)) + { + return buffer; + } + + /* 2. */ + ecma_value_t idx = ecma_validate_atomic_access (typedarray, index); + + if (ECMA_IS_VALUE_ERROR (idx)) + { + return idx; + } + + /* 3. */ + ecma_object_t *typedarray_p = ecma_get_object_from_value (typedarray); + ecma_typedarray_info_t target_info = ecma_typedarray_get_info (typedarray_p); + + /* 4. */ + uint8_t element_size = target_info.element_size; + + /* 5. */ + ecma_typedarray_type_t element_type = target_info.id; + + /* 6. */ + uint32_t offset = target_info.offset; + + /* 7. */ + uint32_t indexed_position = ecma_number_to_uint32 (idx) * element_size + offset; + + JERRY_UNUSED (indexed_position); + JERRY_UNUSED (element_type); + JERRY_UNUSED (buffer); + + /* 8. */ + return ecma_make_uint32_value (0); +} /* ecma_atomic_load */ + +/** + * @} + * @} + */ +#endif /* JERRY_BUILTIN_ATOMICS */ diff --git a/jerry-core/ecma/operations/ecma-atomics-object.h b/jerry-core/ecma/operations/ecma-atomics-object.h new file mode 100644 index 000000000..624347789 --- /dev/null +++ b/jerry-core/ecma/operations/ecma-atomics-object.h @@ -0,0 +1,65 @@ +/* Copyright JS Foundation and other contributors, http://js.foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ECMA_ATOMICS_OBJECT_H +#define ECMA_ATOMICS_OBJECT_H + +#include "ecma-globals.h" + +#if JERRY_BUILTIN_ATOMICS + +/** \addtogroup ecma ECMA + * @{ + * + * \addtogroup ecmaatomicsobject ECMA builtin Atomics helper functions + * @{ + */ + +/** + * Atomics flags. + */ +typedef enum +{ + ECMA_ATOMICS_ADD, /**< Atomics add operation */ + ECMA_ATOMICS_SUBTRACT, /**< Atomics subtract operation */ + ECMA_ATOMICS_AND, /**< Atomics and operation */ + ECMA_ATOMICS_OR, /**< Atomics or operation */ + ECMA_ATOMICS_XOR, /**< Atomics xor operation */ + ECMA_ATOMICS_EXCHANGE, /**< Atomics exchange operation */ + ECMA_ATOMICS_COMPARE_EXCHANGE /**< Atomics compare exchange operation */ +} ecma_atomics_op_t; + +ecma_value_t +ecma_validate_shared_integer_typedarray (ecma_value_t typedarray, + bool waitable); +ecma_value_t +ecma_validate_atomic_access (ecma_value_t typedarray, + ecma_value_t request_index); +ecma_value_t +ecma_atomic_read_modify_write (ecma_value_t typedarray, + ecma_value_t index, + ecma_value_t value, + ecma_atomics_op_t op); +ecma_value_t +ecma_atomic_load (ecma_value_t typedarray, + ecma_value_t index); +/** + * @} + * @} + */ + +#endif /* JERRY_BUILTIN_ATOMICS */ + +#endif /* ECMA_ATOMICS_OBJECT_H */ diff --git a/jerry-core/lit/lit-magic-strings.inc.h b/jerry-core/lit/lit-magic-strings.inc.h index 47a005ae4..0cc6c7699 100644 --- a/jerry-core/lit/lit-magic-strings.inc.h +++ b/jerry-core/lit/lit-magic-strings.inc.h @@ -50,6 +50,9 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_IS, "is") || JERRY_BUILTIN_TYPEDARRAY LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_OF, "of") #endif +#if JERRY_BUILTIN_ATOMICS +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ATOMICS_OR, "or") +#endif #if JERRY_BUILTIN_MATH LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_LN2_U, "LN2") #endif @@ -68,11 +71,17 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_UTC_U, "UTC") #if JERRY_BUILTIN_MATH LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ABS, "abs") #endif -#if JERRY_BUILTIN_CONTAINER +#if JERRY_BUILTIN_ATOMICS \ +|| JERRY_BUILTIN_CONTAINER LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ADD, "add") #endif #if JERRY_ESNEXT LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ALL, "all") +#endif +#if JERRY_BUILTIN_ATOMICS +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ATOMICS_AND, "and") +#endif +#if JERRY_ESNEXT LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ANY, "any") #endif #if JERRY_BUILTIN_MATH @@ -114,8 +123,16 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_RAW, "raw") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SET, "set") #if JERRY_BUILTIN_MATH LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SIN, "sin") +#endif +#if JERRY_BUILTIN_ATOMICS +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ATOMICS_SUB, "sub") +#endif +#if JERRY_BUILTIN_MATH LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_TAN, "tan") #endif +#if JERRY_BUILTIN_ATOMICS +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ATOMICS_XOR, "xor") +#endif #if JERRY_BUILTIN_REGEXP LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_EMPTY_NON_CAPTURE_GROUP, "(?:)") #endif @@ -171,6 +188,9 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_IMUL, "imul") #endif LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_JOIN, "join") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_KEYS, "keys") +#if JERRY_BUILTIN_ATOMICS +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ATOMICS_LOAD, "load") +#endif #if JERRY_BUILTIN_MATH && JERRY_ESNEXT LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_LOG2, "log2") #endif @@ -215,6 +235,9 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_THEN, "then") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_TRIM, "trim") #endif LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_TRUE, "true") +#if JERRY_BUILTIN_ATOMICS +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ATOMICS_WAIT, "wait") +#endif LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ARRAY_UL, "Array") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ERROR_UL, "Error") #if JERRY_BUILTIN_MATH @@ -307,6 +330,9 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SPLIT, "split") #if JERRY_LINE_INFO LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_STACK, "stack") #endif +#if JERRY_BUILTIN_ATOMICS +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ATOMICS_STORE, "store") +#endif #if JERRY_ESNEXT LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_THROW, "throw") #endif @@ -390,6 +416,9 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_IS_VIEW_UL, "isView") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_KEY_FOR, "keyFor") #endif LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_LENGTH, "length") +#if JERRY_BUILTIN_ATOMICS +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ATOMICS_NOTIFY, "notify") +#endif LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_NUMBER, "number") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_OBJECT, "object") #if JERRY_BUILTIN_STRING && JERRY_ESNEXT @@ -449,6 +478,9 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_TO_JSON_UL, "toJSON") || JERRY_ESNEXT LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_VALUES, "values") #endif +#if JERRY_BUILTIN_ATOMICS +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ATOMICS_U, "Atomics") +#endif LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_BOOLEAN_UL, "Boolean") #if JERRY_BUILTIN_NUMBER && JERRY_ESNEXT LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_EPSILON_U, "EPSILON") @@ -572,6 +604,9 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_OBJECT_TO_STRING_UL, "[object ") #if JERRY_BUILTIN_STRING && JERRY_ESNEXT LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ENDS_WITH, "endsWith") #endif +#if JERRY_BUILTIN_ATOMICS +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ATOMICS_EXCHANGE, "exchange") +#endif LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_FUNCTION, "function") #if JERRY_BUILTIN_DATE LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_GET_HOURS_UL, "getHours") @@ -748,6 +783,9 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_GLOBAL_THIS_UL, "globalThis") #if JERRY_BUILTIN_REGEXP LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_IGNORECASE_UL, "ignoreCase") #endif +#if JERRY_BUILTIN_ATOMICS +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ATOMICS_ISLOCKFREE, "isLockFree") +#endif LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_PARSE_FLOAT, "parseFloat") #if JERRY_BUILTIN_REGEXP && JERRY_BUILTIN_STRING && JERRY_ESNEXT LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_REPLACE_ALL, "replaceAll") @@ -932,6 +970,9 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_TO_LOCALE_STRING_UL, "toLocaleString") #if JERRY_ESNEXT LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_STRING_ITERATOR_UL, "String Iterator") #endif +#if JERRY_BUILTIN_ATOMICS +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ATOMICS_COMPAREEXCHANGE, "compareExchange") +#endif #if JERRY_BUILTIN_DATE LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_GET_MILLISECONDS_UL, "getMilliseconds") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SET_MILLISECONDS_UL, "setMilliseconds") @@ -1037,6 +1078,8 @@ LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (1, LIT_MAGIC_STRING_IS) #elif JERRY_BUILTIN_ARRAY && JERRY_ESNEXT \ || JERRY_BUILTIN_TYPEDARRAY LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (1, LIT_MAGIC_STRING_OF) +#elif JERRY_BUILTIN_ATOMICS +LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (1, LIT_MAGIC_STRING_ATOMICS_OR) #elif JERRY_BUILTIN_MATH LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (1, LIT_MAGIC_STRING_LN2_U) #elif JERRY_BUILTIN_CONTAINER \ @@ -1057,6 +1100,8 @@ LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (2, LIT_MAGIC_STRING_IS) #elif JERRY_BUILTIN_ARRAY && JERRY_ESNEXT \ || JERRY_BUILTIN_TYPEDARRAY LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (2, LIT_MAGIC_STRING_OF) +#elif JERRY_BUILTIN_ATOMICS +LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (2, LIT_MAGIC_STRING_ATOMICS_OR) #elif JERRY_BUILTIN_MATH LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (2, LIT_MAGIC_STRING_LN2_U) #elif JERRY_BUILTIN_CONTAINER \ @@ -1097,7 +1142,11 @@ LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (6, LIT_MAGIC_STRING_MODULE_UL) #else LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (6, LIT_MAGIC_STRING_NUMBER_UL) #endif +#if JERRY_BUILTIN_ATOMICS +LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (7, LIT_MAGIC_STRING_ATOMICS_U) +#else LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (7, LIT_MAGIC_STRING_BOOLEAN_UL) +#endif #if JERRY_BUILTIN_DATAVIEW LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (8, LIT_MAGIC_STRING_DATAVIEW_UL) #else @@ -1165,6 +1214,8 @@ LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (14, LIT_MAGIC_STRING_DEFINE_PROPERTY_UL #endif #if JERRY_ESNEXT LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (15, LIT_MAGIC_STRING_STRING_ITERATOR_UL) +#elif JERRY_BUILTIN_ATOMICS +LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (15, LIT_MAGIC_STRING_ATOMICS_COMPAREEXCHANGE) #elif JERRY_BUILTIN_DATE LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (15, LIT_MAGIC_STRING_GET_MILLISECONDS_UL) #elif JERRY_BUILTIN_NUMBER && JERRY_ESNEXT diff --git a/jerry-core/lit/lit-magic-strings.ini b/jerry-core/lit/lit-magic-strings.ini index 8f311d104..c3f6ed570 100644 --- a/jerry-core/lit/lit-magic-strings.ini +++ b/jerry-core/lit/lit-magic-strings.ini @@ -33,6 +33,7 @@ LIT_MAGIC_STRING_PI_U = "PI" LIT_MAGIC_STRING_AT = "at" LIT_MAGIC_STRING_IS = "is" LIT_MAGIC_STRING_OF = "of" +LIT_MAGIC_STRING_ATOMICS_OR = "or" LIT_MAGIC_STRING_LN2_U = "LN2" LIT_MAGIC_STRING_MAP_UL = "Map" LIT_MAGIC_STRING_NAN = "NaN" @@ -40,6 +41,8 @@ LIT_MAGIC_STRING_SET_UL = "Set" LIT_MAGIC_STRING_UTC_U = "UTC" LIT_MAGIC_STRING_ABS = "abs" LIT_MAGIC_STRING_ADD = "add" +LIT_MAGIC_STRING_ATOMICS_AND = "and" +LIT_MAGIC_STRING_ATOMICS_SUB = "sub" LIT_MAGIC_STRING_ALL = "all" LIT_MAGIC_STRING_ANY = "any" LIT_MAGIC_STRING_COS = "cos" @@ -58,10 +61,12 @@ LIT_MAGIC_STRING_RAW = "raw" LIT_MAGIC_STRING_SET = "set" LIT_MAGIC_STRING_SIN = "sin" LIT_MAGIC_STRING_TAN = "tan" +LIT_MAGIC_STRING_ATOMICS_XOR = "xor" LIT_MAGIC_STRING_EMPTY_NON_CAPTURE_GROUP = "(?:)" LIT_MAGIC_STRING_DATE_UL = "Date" LIT_MAGIC_STRING_JSON_U = "JSON" LIT_MAGIC_STRING_LN10_U = "LN10" +LIT_MAGIC_STRING_ATOMICS_LOAD = "load" LIT_MAGIC_STRING_MATH_UL = "Math" LIT_MAGIC_STRING_NULL_UL = "Null" LIT_MAGIC_STRING_ACOS = "acos" @@ -100,6 +105,7 @@ LIT_MAGIC_STRING_TEST = "test" LIT_MAGIC_STRING_THEN = "then" LIT_MAGIC_STRING_TRIM = "trim" LIT_MAGIC_STRING_TRUE = "true" +LIT_MAGIC_STRING_ATOMICS_WAIT = "wait" LIT_MAGIC_STRING_ARRAY_UL = "Array" LIT_MAGIC_STRING_ERROR_UL = "Error" LIT_MAGIC_STRING_PROXY_UL = "Proxy" @@ -133,6 +139,7 @@ LIT_MAGIC_STRING_SHIFT = "shift" LIT_MAGIC_STRING_SLICE = "slice" LIT_MAGIC_STRING_SPLIT = "split" LIT_MAGIC_STRING_STACK = "stack" +LIT_MAGIC_STRING_ATOMICS_STORE = "store" LIT_MAGIC_STRING_THROW = "throw" LIT_MAGIC_STRING_TRUNC = "trunc" LIT_MAGIC_STRING_VALUE = "value" @@ -165,6 +172,7 @@ LIT_MAGIC_STRING_GLOBAL = "global" LIT_MAGIC_STRING_IS_VIEW_UL = "isView" LIT_MAGIC_STRING_KEY_FOR = "keyFor" LIT_MAGIC_STRING_LENGTH = "length" +LIT_MAGIC_STRING_ATOMICS_NOTIFY = "notify" LIT_MAGIC_STRING_NUMBER = "number" LIT_MAGIC_STRING_OBJECT = "object" LIT_MAGIC_STRING_PAD_END = "padEnd" @@ -185,6 +193,7 @@ LIT_MAGIC_STRING_SUBSTR = "substr" LIT_MAGIC_STRING_ENTRIES = "entries" LIT_MAGIC_STRING_TO_JSON_UL = "toJSON" LIT_MAGIC_STRING_VALUES = "values" +LIT_MAGIC_STRING_ATOMICS_U = "Atomics" LIT_MAGIC_STRING_BOOLEAN_UL = "Boolean" LIT_MAGIC_STRING_FINALLY = "finally" LIT_MAGIC_STRING_PROMISE_UL = "Promise" @@ -230,6 +239,7 @@ LIT_MAGIC_STRING_INFINITY_UL = "Infinity" LIT_MAGIC_STRING_MATCH_ALL = "matchAll" LIT_MAGIC_STRING_URI_ERROR_UL = "URIError" LIT_MAGIC_STRING_ENDS_WITH = "endsWith" +LIT_MAGIC_STRING_ATOMICS_EXCHANGE = "exchange" LIT_MAGIC_STRING_FUNCTION = "function" LIT_MAGIC_STRING_GET_HOURS_UL = "getHours" LIT_MAGIC_STRING_GET_INT16_UL = "getInt16" @@ -276,6 +286,7 @@ LIT_MAGIC_STRING_GENERATOR_UL = "Generator" LIT_MAGIC_STRING_GET_UTC_DAY_UL = "getUTCDay" LIT_MAGIC_STRING_GET_UINT16_UL = "getUint16" LIT_MAGIC_STRING_GET_UINT32_UL = "getUint32" +LIT_MAGIC_STRING_ATOMICS_ISLOCKFREE = "isLockFree" LIT_MAGIC_STRING_LASTINDEX_UL = "lastIndex" LIT_MAGIC_STRING_MULTILINE = "multiline" LIT_MAGIC_STRING_PROTOTYPE = "prototype" @@ -379,6 +390,7 @@ LIT_MAGIC_STRING_SET_PROTOTYPE_OF_UL = "setPrototypeOf" LIT_MAGIC_STRING_SET_UTC_FULL_YEAR_UL = "setUTCFullYear" LIT_MAGIC_STRING_TO_LOCALE_STRING_UL = "toLocaleString" LIT_MAGIC_STRING_STRING_ITERATOR_UL = "String Iterator" +LIT_MAGIC_STRING_ATOMICS_COMPAREEXCHANGE = "compareExchange" LIT_MAGIC_STRING_GET_MILLISECONDS_UL = "getMilliseconds" LIT_MAGIC_STRING_SET_MILLISECONDS_UL = "setMilliseconds" LIT_MAGIC_STRING_DEFINE_PROPERTIES_UL = "defineProperties" diff --git a/tests/jerry/es.next/atomics.js b/tests/jerry/es.next/atomics.js new file mode 100644 index 000000000..943d6f455 --- /dev/null +++ b/tests/jerry/es.next/atomics.js @@ -0,0 +1,65 @@ +// Copyright JS Foundation and other contributors, http://js.foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +const buffer = new SharedArrayBuffer (16); +const uint8 = new Uint8Array (buffer); +uint8[0] = 7; + +Atomics.add (uint8, 0, 2); +Atomics.and (uint8, 0, 2); +Atomics.compareExchange (uint8, 0, 5, 2); +Atomics.exchange (uint8, 0, 2); +Atomics.or (uint8, 0, 2); +Atomics.sub (uint8, 0, 2); +Atomics.xor (uint8, 0, 2) +Atomics.isLockFree (3); +Atomics.load (uint8, 0); +Atomics.store (uint8, 0, 2); + +const sab = new SharedArrayBuffer (1024); +const int32 = new Int32Array (sab); + +Atomics.wait (int32, 0, 0); +Atomics.notify (int32, 0, 1); + +try { + let a; + Atomics.add (a, 0, 0); +} catch (ex) { + assert (ex instanceof TypeError); +} + +try { + Atomics.add (new Float32Array(10), 0, 2); +} catch (ex) { + assert (ex instanceof TypeError); +} +try{ + const uint16 = new Uint16Array (new ArrayBuffer (16)); + Atomics.add(uint16, 0, 0); +} catch (ex) { + assert (ex instanceof TypeError); +} + +try { + Atomics.add (uint8, 100, 0); +} catch (ex) { + assert (ex instanceof RangeError); +} + +try { + Atomics.add (uint8, -1, 0); +} catch (ex) { + assert (ex instanceof RangeError); +} diff --git a/tests/test262-esnext-excludelist.xml b/tests/test262-esnext-excludelist.xml index 3fc338e3f..7dc14865c 100644 --- a/tests/test262-esnext-excludelist.xml +++ b/tests/test262-esnext-excludelist.xml @@ -5190,109 +5190,55 @@ features: [Atomics] https://github.com/tc39/ecmascript_sharedmem --> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -5314,51 +5260,23 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -5386,12 +5304,9 @@ - - - @@ -5435,63 +5350,38 @@ - - - - - - - - - - - - - - - - - - - - - - - - - @@ -5512,25 +5402,17 @@ - - - - - - - - @@ -5678,12 +5560,9 @@ - - - @@ -7991,4 +7870,18 @@ + + + + + + + + + + + + + +