From b7dead7b059dc606f511c071882a11f356eb1ad2 Mon Sep 17 00:00:00 2001 From: Gergo Csizi Date: Tue, 10 Aug 2021 17:21:06 +0200 Subject: [PATCH] Add guards for SharedArrayBuffer (#4723) JerryScript-DCO-1.0-Signed-off-by: Gergo Csizi csgergo92@gmail.com --- jerry-core/api/jerry.c | 23 ++++++-------- jerry-core/config.h | 11 +++++++ jerry-core/ecma/base/ecma-errors.c | 7 +++++ jerry-core/ecma/base/ecma-errors.h | 4 +++ jerry-core/ecma/base/ecma-gc.c | 2 ++ jerry-core/ecma/base/ecma-globals.h | 4 ++- .../builtin-objects/ecma-builtin-global.inc.h | 2 ++ ...cma-builtin-shared-arraybuffer-prototype.c | 4 +-- ...builtin-shared-arraybuffer-prototype.inc.h | 4 +-- .../ecma-builtin-shared-arraybuffer.c | 4 +-- .../ecma-builtin-shared-arraybuffer.inc.h | 4 +-- .../ecma/builtin-objects/ecma-builtins.inc.h | 3 ++ .../ecma/operations/ecma-arraybuffer-object.c | 19 ++++++------ .../ecma/operations/ecma-dataview-object.c | 4 +-- jerry-core/ecma/operations/ecma-objects.c | 6 +++- .../ecma-shared-arraybuffer-object.c | 31 ++++++++++++++++--- .../ecma-shared-arraybuffer-object.h | 6 ++-- .../ecma/operations/ecma-typedarray-object.c | 2 +- jerry-core/lit/lit-magic-strings.inc.h | 17 ++++++++-- 19 files changed, 113 insertions(+), 44 deletions(-) diff --git a/jerry-core/api/jerry.c b/jerry-core/api/jerry.c index 9797f9042..a0f059714 100644 --- a/jerry-core/api/jerry.c +++ b/jerry-core/api/jerry.c @@ -1573,7 +1573,9 @@ static const uint8_t jerry_class_object_type[] = #endif /* JERRY_ESNEXT */ #if JERRY_BUILTIN_TYPEDARRAY JERRY_OBJECT_TYPE_ARRAYBUFFER, /**< type of ECMA_OBJECT_CLASS_ARRAY_BUFFER */ +#if JERRY_BUILTIN_SHAREDARRAYBUFFER JERRY_OBJECT_TYPE_SHARED_ARRAY_BUFFER, /**< type of ECMA_OBJECT_CLASS_SHARED_ARRAY_BUFFER */ +#endif /* JERRY_BUILTIN_SHAREDARRAYBUFFER */ #endif /* JERRY_BUILTIN_TYPEDARRAY */ #if JERRY_BUILTIN_BIGINT JERRY_OBJECT_TYPE_BIGINT, /**< type of ECMA_OBJECT_CLASS_BIGINT */ @@ -5678,12 +5680,7 @@ jerry_value_is_shared_arraybuffer (const jerry_value_t value) /**< value to chec { jerry_assert_api_available (); -#if JERRY_BUILTIN_TYPEDARRAY return ecma_is_shared_arraybuffer (value); -#else /* !JERRY_BUILTIN_TYPEDARRAY */ - JERRY_UNUSED (value); - return false; -#endif /* JERRY_BUILTIN_TYPEDARRAY */ } /* jerry_value_is_shared_arraybuffer */ /** @@ -5701,12 +5698,12 @@ jerry_create_shared_arraybuffer (const jerry_length_t size) /**< size of the Sha { jerry_assert_api_available (); -#if JERRY_BUILTIN_TYPEDARRAY +#if JERRY_BUILTIN_SHAREDARRAYBUFFER return jerry_return (ecma_make_object_value (ecma_shared_arraybuffer_new_object (size))); -#else /* !JERRY_BUILTIN_TYPEDARRAY */ +#else /* !JERRY_BUILTIN_SHAREDARRAYBUFFER */ JERRY_UNUSED (size); - return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (ecma_error_typed_array_not_supported_p))); -#endif /* JERRY_BUILTIN_TYPEDARRAY */ + return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (ecma_error_shared_arraybuffer_not_supported_p))); +#endif /* JERRY_BUILTIN_SHAREDARRAYBUFFER */ } /* jerry_create_shared_arraybuffer */ /** @@ -5727,7 +5724,7 @@ jerry_create_shared_arraybuffer_external (const jerry_length_t size, /**< size o { jerry_assert_api_available (); -#if JERRY_BUILTIN_TYPEDARRAY +#if JERRY_BUILTIN_SHAREDARRAYBUFFER ecma_object_t *shared_arraybuffer; if (JERRY_UNLIKELY (size == 0 || buffer_p == NULL)) @@ -5740,12 +5737,12 @@ jerry_create_shared_arraybuffer_external (const jerry_length_t size, /**< size o } return jerry_return (ecma_make_object_value (shared_arraybuffer)); -#else /* !JERRY_BUILTIN_TYPEDARRAY */ +#else /* !JERRY_BUILTIN_SHAREDARRAYBUFFER */ JERRY_UNUSED (size); JERRY_UNUSED (buffer_p); JERRY_UNUSED (free_cb); - return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (ecma_error_typed_array_not_supported_p))); -#endif /* JERRY_BUILTIN_TYPEDARRAY */ + return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (ecma_error_shared_arraybuffer_not_supported_p))); +#endif /* JERRY_BUILTIN_SHAREDARRAYBUFFER */ } /* jerry_create_shared_arraybuffer_external */ /** diff --git a/jerry-core/config.h b/jerry-core/config.h index 72592f3c5..67c3de9d4 100644 --- a/jerry-core/config.h +++ b/jerry-core/config.h @@ -111,6 +111,10 @@ # define JERRY_BUILTIN_TYPEDARRAY JERRY_ESNEXT #endif /* !defined (JERRY_BUILTIN_TYPEDARRAY) */ +#ifndef JERRY_BUILTIN_SHAREDARRAYBUFFER +# define JERRY_BUILTIN_SHAREDARRAYBUFFER JERRY_ESNEXT +#endif /* !defined (JERRY_BUILTIN_SHAREDARRAYBUFFER) */ + #ifndef JERRY_BUILTIN_WEAKREF # define JERRY_BUILTIN_WEAKREF JERRY_ESNEXT #endif /* !defined (JERRY_BUILTIN_WEAKREF) */ @@ -567,6 +571,10 @@ || ((JERRY_BUILTIN_TYPEDARRAY != 0) && (JERRY_BUILTIN_TYPEDARRAY != 1)) # error "Invalid value for JERRY_BUILTIN_TYPEDARRAY macro." #endif +#if !defined (JERRY_BUILTIN_SHAREDARRAYBUFFER) \ +|| ((JERRY_BUILTIN_SHAREDARRAYBUFFER != 0) && (JERRY_BUILTIN_SHAREDARRAYBUFFER != 1)) +# error "Invalid value for JERRY_BUILTIN_SHAREDARRAYBUFFER macro." +#endif #if !defined (JERRY_BUILTIN_BIGINT) \ || ((JERRY_BUILTIN_BIGINT != 0) && (JERRY_BUILTIN_BIGINT != 1)) # error "Invalid value for JERRY_BUILTIN_BIGINT macro." @@ -587,6 +595,9 @@ #if (JERRY_ESNEXT == 0) && (JERRY_MODULE_SYSTEM == 1) # error "JERRY_ESNEXT should be enabled too to enable JERRY_MODULE_SYSTEM macro." #endif +#if (JERRY_BUILTIN_TYPEDARRAY == 0) && (JERRY_BUILTIN_SHAREDARRAYBUFFER == 1) +# error "JERRY_BUILTIN_TYPEDARRAY should be enabled too to enable JERRY_BUILTIN_SHAREDARRAYBUFFER macro." +#endif /** * Internal options. diff --git a/jerry-core/ecma/base/ecma-errors.c b/jerry-core/ecma/base/ecma-errors.c index 70bfbeb52..23cd88f09 100644 --- a/jerry-core/ecma/base/ecma-errors.c +++ b/jerry-core/ecma/base/ecma-errors.c @@ -59,6 +59,13 @@ const char * const ecma_error_promise_not_supported_p = "Promise support is disa const char * const ecma_error_typed_array_not_supported_p = "TypedArray support is disabled"; #endif /* !JERRY_BUILTIN_TYPEDARRAY */ +#if !JERRY_BUILTIN_SHAREDARRAYBUFFER +/** + * Error message, if SharedArrayBuffer support is disabled + */ +const char * const ecma_error_shared_arraybuffer_not_supported_p = "SharedArrayBuffer support is disabled"; +#endif /* !JERRY_BUILTIN_SHAREDARRAYBUFFER */ + #if !JERRY_BUILTIN_DATAVIEW /** * Error message, if DataView support is disabled diff --git a/jerry-core/ecma/base/ecma-errors.h b/jerry-core/ecma/base/ecma-errors.h index cdb9d88fc..21133d7d1 100644 --- a/jerry-core/ecma/base/ecma-errors.h +++ b/jerry-core/ecma/base/ecma-errors.h @@ -41,6 +41,10 @@ extern const char * const ecma_error_promise_not_supported_p; extern const char * const ecma_error_typed_array_not_supported_p; #endif /* !JERRY_BUILTIN_TYPEDARRAY */ +#if !JERRY_BUILTIN_SHAREDARRAYBUFFER +extern const char * const ecma_error_shared_arraybuffer_not_supported_p; +#endif /* !JERRY_BUILTIN_SHAREDARRAYBUFFER */ + #if !JERRY_BUILTIN_DATAVIEW extern const char * const ecma_error_data_view_not_supported_p; #endif /* !JERRY_BUILTIN_DATAVIEW */ diff --git a/jerry-core/ecma/base/ecma-gc.c b/jerry-core/ecma/base/ecma-gc.c index df33d1e5a..4ca9692b3 100644 --- a/jerry-core/ecma/base/ecma-gc.c +++ b/jerry-core/ecma/base/ecma-gc.c @@ -1897,7 +1897,9 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */ #endif /* JERRY_ESNEXT */ #if JERRY_BUILTIN_TYPEDARRAY case ECMA_OBJECT_CLASS_ARRAY_BUFFER: +#if JERRY_BUILTIN_SHAREDARRAYBUFFER case ECMA_OBJECT_CLASS_SHARED_ARRAY_BUFFER: +#endif /* JERRY_BUILTIN_SHAREDARRAYBUFFER */ { uint32_t arraybuffer_length = ext_object_p->u.cls.u3.length; diff --git a/jerry-core/ecma/base/ecma-globals.h b/jerry-core/ecma/base/ecma-globals.h index 134b173b5..813566421 100644 --- a/jerry-core/ecma/base/ecma-globals.h +++ b/jerry-core/ecma/base/ecma-globals.h @@ -732,8 +732,10 @@ typedef enum #endif /* JERRY_ESNEXT */ #if JERRY_BUILTIN_TYPEDARRAY ECMA_OBJECT_CLASS_ARRAY_BUFFER, /**< Array Buffer (ECMAScript v6, 24.1) */ - ECMA_OBJECT_CLASS_SHARED_ARRAY_BUFFER, /**< Shared Array Buffer (ECMAScript v11 24.2) */ #endif /* JERRY_BUILTIN_TYPEDARRAY */ +#if JERRY_BUILTIN_SHAREDARRAYBUFFER + ECMA_OBJECT_CLASS_SHARED_ARRAY_BUFFER, /**< Shared Array Buffer (ECMAScript v11 24.2) */ +#endif /* JERRY_BUILTIN_SHAREDARRAYBUFFER */ #if JERRY_BUILTIN_BIGINT ECMA_OBJECT_CLASS_BIGINT, /**< Bigint (ECMAScript v11, 4.3.27) */ #endif /* JERRY_BUILTIN_BIGINT */ 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 634c16312..28b7b685b 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-global.inc.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-global.inc.h @@ -158,9 +158,11 @@ OBJECT_VALUE (LIT_MAGIC_STRING_ARRAY_BUFFER_UL, ECMA_BUILTIN_ID_ARRAYBUFFER, ECMA_PROPERTY_CONFIGURABLE_WRITABLE) +#if JERRY_BUILTIN_SHAREDARRAYBUFFER OBJECT_VALUE (LIT_MAGIC_STRING_SHARED_ARRAY_BUFFER_UL, ECMA_BUILTIN_ID_SHARED_ARRAYBUFFER, ECMA_PROPERTY_CONFIGURABLE_WRITABLE) +#endif /* JERRY_BUILTIN_SHAREDARRAYBUFFER */ OBJECT_VALUE (LIT_MAGIC_STRING_INT8_ARRAY_UL, ECMA_BUILTIN_ID_INT8ARRAY, diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-shared-arraybuffer-prototype.c b/jerry-core/ecma/builtin-objects/ecma-builtin-shared-arraybuffer-prototype.c index c8b063288..aea79461b 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-shared-arraybuffer-prototype.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-shared-arraybuffer-prototype.c @@ -27,7 +27,7 @@ #include "jrt.h" #include "jrt-libc-includes.h" -#if JERRY_BUILTIN_TYPEDARRAY +#if JERRY_BUILTIN_SHAREDARRAYBUFFER #define ECMA_BUILTINS_INTERNAL #include "ecma-builtins-internal.h" @@ -109,4 +109,4 @@ ecma_builtin_shared_arraybuffer_prototype_object_slice (ecma_value_t this_arg, / * @} */ -#endif /* JERRY_BUILTIN_TYPEDARRAY */ +#endif /* JERRY_BUILTIN_SHAREDARRAYBUFFER */ diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-shared-arraybuffer-prototype.inc.h b/jerry-core/ecma/builtin-objects/ecma-builtin-shared-arraybuffer-prototype.inc.h index 3f2b0bb1b..4008dee7b 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-shared-arraybuffer-prototype.inc.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-shared-arraybuffer-prototype.inc.h @@ -19,7 +19,7 @@ #include "ecma-builtin-helpers-macro-defines.inc.h" -#if JERRY_BUILTIN_TYPEDARRAY +#if JERRY_BUILTIN_SHAREDARRAYBUFFER /* Object properties: * (property name, object pointer getter) */ @@ -42,6 +42,6 @@ STRING_VALUE (LIT_GLOBAL_SYMBOL_TO_STRING_TAG, * (property name, C routine name, arguments number or NON_FIXED, value of the routine's length property) */ ROUTINE (LIT_MAGIC_STRING_SLICE, ecma_builtin_shared_arraybuffer_prototype_object_slice, NON_FIXED, 2) -#endif /* JERRY_BUILTIN_TYPEDARRAY */ +#endif /* JERRY_BUILTIN_SHAREDARRAYBUFFER */ #include "ecma-builtin-helpers-macro-undefs.inc.h" diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-shared-arraybuffer.c b/jerry-core/ecma/builtin-objects/ecma-builtin-shared-arraybuffer.c index d1c354506..e5b7ba007 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-shared-arraybuffer.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-shared-arraybuffer.c @@ -23,7 +23,7 @@ #include "ecma-typedarray-object.h" #include "jrt.h" -#if JERRY_BUILTIN_TYPEDARRAY +#if JERRY_BUILTIN_SHAREDARRAYBUFFER #define ECMA_BUILTINS_INTERNAL #include "ecma-builtins-internal.h" @@ -92,4 +92,4 @@ ecma_builtin_shared_arraybuffer_species_get (ecma_value_t this_value) /**< This * @} */ -#endif /* JERRY_BUILTIN_TYPEDARRAY */ +#endif /* JERRY_BUILTIN_SHAREDARRAYBUFFER */ diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-shared-arraybuffer.inc.h b/jerry-core/ecma/builtin-objects/ecma-builtin-shared-arraybuffer.inc.h index 41b609f26..35eafcf2c 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-shared-arraybuffer.inc.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-shared-arraybuffer.inc.h @@ -19,7 +19,7 @@ #include "ecma-builtin-helpers-macro-defines.inc.h" -#if JERRY_BUILTIN_TYPEDARRAY +#if JERRY_BUILTIN_SHAREDARRAYBUFFER /* Number properties: * (property name, number value, writable, enumerable, configurable) */ @@ -47,6 +47,6 @@ ACCESSOR_READ_ONLY (LIT_GLOBAL_SYMBOL_SPECIES, ecma_builtin_shared_arraybuffer_species_get, ECMA_PROPERTY_FLAG_CONFIGURABLE) -#endif /* JERRY_BUILTIN_TYPEDARRAY */ +#endif /* JERRY_BUILTIN_SHAREDARRAYBUFFER */ #include "ecma-builtin-helpers-macro-undefs.inc.h" diff --git a/jerry-core/ecma/builtin-objects/ecma-builtins.inc.h b/jerry-core/ecma/builtin-objects/ecma-builtins.inc.h index 1a19cef12..590895039 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtins.inc.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtins.inc.h @@ -337,6 +337,8 @@ BUILTIN_ROUTINE (ECMA_BUILTIN_ID_ARRAYBUFFER, true, arraybuffer) +#if JERRY_BUILTIN_SHAREDARRAYBUFFER + /* The SharedArrayBuffer.prototype object (ES2015 24.2.4) */ BUILTIN (ECMA_BUILTIN_ID_SHARED_ARRAYBUFFER_PROTOTYPE, ECMA_OBJECT_TYPE_GENERAL, @@ -350,6 +352,7 @@ BUILTIN_ROUTINE (ECMA_BUILTIN_ID_SHARED_ARRAYBUFFER, ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE, true, shared_arraybuffer) +#endif /* JERRY_BUILTIN_SHAREDARRAYBUFFER */ /* The %TypedArrayPrototype% object (ES2015 24.2.3) */ BUILTIN (ECMA_BUILTIN_ID_TYPEDARRAY_PROTOTYPE, diff --git a/jerry-core/ecma/operations/ecma-arraybuffer-object.c b/jerry-core/ecma/operations/ecma-arraybuffer-object.c index 7b1486512..cf8ae006b 100644 --- a/jerry-core/ecma/operations/ecma-arraybuffer-object.c +++ b/jerry-core/ecma/operations/ecma-arraybuffer-object.c @@ -187,7 +187,7 @@ uint32_t JERRY_ATTR_PURE ecma_arraybuffer_get_length (ecma_object_t *object_p) /**< pointer to the ArrayBuffer object */ { JERRY_ASSERT (ecma_object_class_is (object_p, ECMA_OBJECT_CLASS_ARRAY_BUFFER) - || ecma_object_class_is (object_p, ECMA_OBJECT_CLASS_SHARED_ARRAY_BUFFER)); + || ecma_object_is_shared_arraybuffer (object_p)); ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p; return ecma_arraybuffer_is_detached (object_p) ? 0 : ext_object_p->u.cls.u3.length; @@ -202,7 +202,7 @@ extern inline lit_utf8_byte_t * JERRY_ATTR_PURE JERRY_ATTR_ALWAYS_INLINE ecma_arraybuffer_get_buffer (ecma_object_t *object_p) /**< pointer to the ArrayBuffer object */ { JERRY_ASSERT (ecma_object_class_is (object_p, ECMA_OBJECT_CLASS_ARRAY_BUFFER) - || ecma_object_class_is (object_p, ECMA_OBJECT_CLASS_SHARED_ARRAY_BUFFER)); + || ecma_object_is_shared_arraybuffer (object_p)); ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p; @@ -230,7 +230,7 @@ extern inline bool JERRY_ATTR_PURE JERRY_ATTR_ALWAYS_INLINE ecma_arraybuffer_is_detached (ecma_object_t *object_p) /**< pointer to the ArrayBuffer object */ { JERRY_ASSERT (ecma_object_class_is (object_p, ECMA_OBJECT_CLASS_ARRAY_BUFFER) - || ecma_object_class_is (object_p, ECMA_OBJECT_CLASS_SHARED_ARRAY_BUFFER)); + || ecma_object_is_shared_arraybuffer (object_p)); return (((ecma_extended_object_t *) object_p)->u.cls.u1.array_buffer_flags & ECMA_ARRAYBUFFER_DETACHED) != 0; } /* ecma_arraybuffer_is_detached */ @@ -318,16 +318,15 @@ ecma_builtin_arraybuffer_slice (ecma_value_t this_arg, uint32_t new_len = (end >= start) ? (end - start) : 0; /* 11. */ - ecma_value_t ctor; + ecma_builtin_id_t buffer_builtin_id = ECMA_BUILTIN_ID_ARRAYBUFFER; + if (ecma_is_shared_arraybuffer (this_arg)) { - ctor = ecma_op_species_constructor (object_p, ECMA_BUILTIN_ID_SHARED_ARRAYBUFFER); - } - else - { - ctor = ecma_op_species_constructor (object_p, ECMA_BUILTIN_ID_ARRAYBUFFER); + buffer_builtin_id = ECMA_BUILTIN_ID_SHARED_ARRAYBUFFER; } + ecma_value_t ctor = ecma_op_species_constructor (object_p, buffer_builtin_id); + if (ECMA_IS_VALUE_ERROR (ctor)) { return ctor; @@ -352,7 +351,7 @@ ecma_builtin_arraybuffer_slice (ecma_value_t this_arg, /* 13. */ if (!(ecma_object_class_is (new_arraybuffer_p, ECMA_OBJECT_CLASS_ARRAY_BUFFER) - || ecma_object_class_is (new_arraybuffer_p, ECMA_OBJECT_CLASS_SHARED_ARRAY_BUFFER))) + || ecma_object_is_shared_arraybuffer (new_arraybuffer_p))) { ret_value = ecma_raise_type_error (ECMA_ERR_MSG ("Return value is not an ArrayBuffer object")); goto free_new_arraybuffer; diff --git a/jerry-core/ecma/operations/ecma-dataview-object.c b/jerry-core/ecma/operations/ecma-dataview-object.c index 45db1e004..75b9bc035 100644 --- a/jerry-core/ecma/operations/ecma-dataview-object.c +++ b/jerry-core/ecma/operations/ecma-dataview-object.c @@ -62,7 +62,7 @@ ecma_op_dataview_create (const ecma_value_t *arguments_list_p, /**< arguments li ecma_object_t *buffer_p = ecma_get_object_from_value (buffer); if (!(ecma_object_class_is (buffer_p, ECMA_OBJECT_CLASS_ARRAY_BUFFER) - || ecma_object_class_is (buffer_p, ECMA_OBJECT_CLASS_SHARED_ARRAY_BUFFER))) + || ecma_object_is_shared_arraybuffer (buffer_p))) { return ecma_raise_type_error (ECMA_ERR_MSG ("Argument 'buffer' is not an ArrayBuffer or SharedArrayBuffer")); } @@ -256,7 +256,7 @@ ecma_op_dataview_get_set_view_value (ecma_value_t view, /**< the operation's 'vi ecma_object_t *buffer_p = view_p->buffer_p; JERRY_ASSERT (ecma_object_class_is (buffer_p, ECMA_OBJECT_CLASS_ARRAY_BUFFER) - || ecma_object_class_is (buffer_p, ECMA_OBJECT_CLASS_SHARED_ARRAY_BUFFER)); + || ecma_object_is_shared_arraybuffer (buffer_p)); /* 3. */ ecma_number_t get_index; diff --git a/jerry-core/ecma/operations/ecma-objects.c b/jerry-core/ecma/operations/ecma-objects.c index d3606cb8f..81ae13568 100644 --- a/jerry-core/ecma/operations/ecma-objects.c +++ b/jerry-core/ecma/operations/ecma-objects.c @@ -2756,7 +2756,9 @@ ecma_object_check_class_name_is_object (ecma_object_t *obj_p) /**< object */ return (ecma_builtin_is_global (obj_p) #if JERRY_BUILTIN_TYPEDARRAY || ecma_builtin_is (obj_p, ECMA_BUILTIN_ID_ARRAYBUFFER_PROTOTYPE) +#if JERRY_BUILTIN_SHAREDARRAYBUFFER || ecma_builtin_is (obj_p, ECMA_BUILTIN_ID_SHARED_ARRAYBUFFER_PROTOTYPE) +#endif /* JERRY_BUILTIN_SHAREDARRAYBUFFER */ || ecma_builtin_is (obj_p, ECMA_BUILTIN_ID_TYPEDARRAY_PROTOTYPE) || ecma_builtin_is (obj_p, ECMA_BUILTIN_ID_INT8ARRAY_PROTOTYPE) || ecma_builtin_is (obj_p, ECMA_BUILTIN_ID_UINT8ARRAY_PROTOTYPE) @@ -2878,8 +2880,10 @@ static const uint16_t ecma_class_object_magic_string_id[] = #endif /* JERRY_ESNEXT */ #if JERRY_BUILTIN_TYPEDARRAY LIT_MAGIC_STRING_ARRAY_BUFFER_UL, /**< magic string id of ECMA_OBJECT_CLASS_ARRAY_BUFFER */ - LIT_MAGIC_STRING_SHARED_ARRAY_BUFFER_UL, /**< magic string id of ECMA_OBJECT_CLASS_SHAREDARRAY_BUFFER */ #endif /* JERRY_BUILTIN_TYPEDARRAY */ +#if JERRY_BUILTIN_SHAREDARRAYBUFFER + LIT_MAGIC_STRING_SHARED_ARRAY_BUFFER_UL, /**< magic string id of ECMA_OBJECT_CLASS_SHAREDARRAY_BUFFER */ +#endif /* JERRY_BUILTIN_SHAREDARRAYBUFFER */ #if JERRY_BUILTIN_BIGINT LIT_MAGIC_STRING_BIGINT_UL, /**< magic string id of ECMA_OBJECT_CLASS_BIGINT */ #endif /* JERRY_BUILTIN_BIGINT */ diff --git a/jerry-core/ecma/operations/ecma-shared-arraybuffer-object.c b/jerry-core/ecma/operations/ecma-shared-arraybuffer-object.c index cc7c64969..22ddc3be8 100644 --- a/jerry-core/ecma/operations/ecma-shared-arraybuffer-object.c +++ b/jerry-core/ecma/operations/ecma-shared-arraybuffer-object.c @@ -25,8 +25,6 @@ #include "jcontext.h" #include "ecma-function-object.h" -#if JERRY_BUILTIN_TYPEDARRAY - /** \addtogroup ecma ECMA * @{ * @@ -34,6 +32,8 @@ * @{ */ +#if JERRY_BUILTIN_SHAREDARRAYBUFFER + /** * Helper function: create SharedArrayBuffer object based on the array length * @@ -158,6 +158,8 @@ ecma_op_create_shared_arraybuffer_object (const ecma_value_t *arguments_list_p, return ecma_make_object_value (shared_array_buffer); } /* ecma_op_create_shared_arraybuffer_object */ +#endif /* JERRY_BUILTIN_SHAREDARRAYBUFFER */ + /** * Helper function: check if the target is SharedArrayBuffer * @@ -166,15 +168,36 @@ ecma_op_create_shared_arraybuffer_object (const ecma_value_t *arguments_list_p, * @return true - if value is a SharedArrayBuffer object * false - otherwise */ -bool +extern inline bool JERRY_ATTR_ALWAYS_INLINE ecma_is_shared_arraybuffer (ecma_value_t target) /**< the target value */ { +#if JERRY_BUILTIN_SHAREDARRAYBUFFER return (ecma_is_value_object (target) && ecma_object_class_is (ecma_get_object_from_value (target), ECMA_OBJECT_CLASS_SHARED_ARRAY_BUFFER)); +#else /* !JERRY_BUILTIN_SHAREDARRAYBUFFER */ + JERRY_UNUSED (target); + return false; +#endif /* JERRY_BUILTIN_SHAREDARRAYBUFFER */ } /* ecma_is_shared_arraybuffer */ +/** + * Helper function: check if the target is SharedArrayBuffer Object + * + * @return true - if value is a SharedArrayBuffer object + * false - otherwise + */ +extern inline bool JERRY_ATTR_ALWAYS_INLINE +ecma_object_is_shared_arraybuffer (ecma_object_t *object_p) /**< the target object */ +{ +#if JERRY_BUILTIN_SHAREDARRAYBUFFER + return ecma_object_class_is (object_p, ECMA_OBJECT_CLASS_SHARED_ARRAY_BUFFER); +#else /* !JERRY_BUILTIN_SHAREDARRAYBUFFER */ + JERRY_UNUSED (object_p); + return false; +#endif /* JERRY_BUILTIN_SHAREDARRAYBUFFER */ +} /* ecma_object_is_shared_arraybuffer */ + /** * @} * @} */ -#endif /* JERRY_BUILTIN_TYPEDARRAY */ diff --git a/jerry-core/ecma/operations/ecma-shared-arraybuffer-object.h b/jerry-core/ecma/operations/ecma-shared-arraybuffer-object.h index 2cd04995b..0bcfd0186 100644 --- a/jerry-core/ecma/operations/ecma-shared-arraybuffer-object.h +++ b/jerry-core/ecma/operations/ecma-shared-arraybuffer-object.h @@ -18,7 +18,7 @@ #include "ecma-globals.h" -#if JERRY_BUILTIN_TYPEDARRAY +#if JERRY_BUILTIN_SHAREDARRAYBUFFER /** \addtogroup ecma ECMA * @{ @@ -39,13 +39,15 @@ ecma_object_t * ecma_shared_arraybuffer_new_object_external (uint32_t length, void *buffer_p, jerry_value_free_callback_t free_cb); +#endif /* JERRY_BUILTIN_SHAREDARRAYBUFFER */ bool ecma_is_shared_arraybuffer (ecma_value_t val); +bool +ecma_object_is_shared_arraybuffer (ecma_object_t *val); /** * @} * @} */ -#endif /* JERRY_BUILTIN_TYPEDARRAY */ #endif /* !ECMA_SHARED_ARRAYBUFFER_OBJECT_H */ diff --git a/jerry-core/ecma/operations/ecma-typedarray-object.c b/jerry-core/ecma/operations/ecma-typedarray-object.c index 82b8f3440..f6724a41c 100644 --- a/jerry-core/ecma/operations/ecma-typedarray-object.c +++ b/jerry-core/ecma/operations/ecma-typedarray-object.c @@ -1648,7 +1648,7 @@ ecma_op_create_typedarray (const ecma_value_t *arguments_list_p, /**< the arg li typedarray_id); } else if (ecma_object_class_is (obj_p, ECMA_OBJECT_CLASS_ARRAY_BUFFER) - || ecma_object_class_is (obj_p, ECMA_OBJECT_CLASS_SHARED_ARRAY_BUFFER)) + || ecma_object_is_shared_arraybuffer (obj_p)) { /* 22.2.1.5 */ ecma_object_t *arraybuffer_p = obj_p; diff --git a/jerry-core/lit/lit-magic-strings.inc.h b/jerry-core/lit/lit-magic-strings.inc.h index 2f5590eb4..ecd8acb0b 100644 --- a/jerry-core/lit/lit-magic-strings.inc.h +++ b/jerry-core/lit/lit-magic-strings.inc.h @@ -295,6 +295,7 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ROUND, "round") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SHIFT, "shift") #endif #if JERRY_BUILTIN_ARRAY \ +|| JERRY_BUILTIN_SHAREDARRAYBUFFER \ || JERRY_BUILTIN_STRING \ || JERRY_BUILTIN_TYPEDARRAY LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SLICE, "slice") @@ -724,8 +725,12 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_UINT8_ARRAY_UL, "Uint8Array") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_ALLSETTLED, "allSettled") #endif #if JERRY_BUILTIN_DATAVIEW \ +|| JERRY_BUILTIN_SHAREDARRAYBUFFER \ || JERRY_BUILTIN_TYPEDARRAY LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_BYTE_LENGTH_UL, "byteLength") +#endif +#if JERRY_BUILTIN_DATAVIEW \ +|| JERRY_BUILTIN_TYPEDARRAY LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_BYTE_OFFSET_UL, "byteOffset") #endif #if JERRY_BUILTIN_STRING @@ -968,8 +973,10 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_GENERATOR_FUNCTION_UL, "GeneratorFunction LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_NEGATIVE_INFINITY_U, "NEGATIVE_INFINITY") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_POSITIVE_INFINITY_U, "POSITIVE_INFINITY") #endif -#if JERRY_BUILTIN_TYPEDARRAY +#if JERRY_BUILTIN_SHAREDARRAYBUFFER LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SHARED_ARRAY_BUFFER_UL, "SharedArrayBuffer") +#endif +#if JERRY_BUILTIN_TYPEDARRAY LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_UINT8_CLAMPED_ARRAY_UL, "Uint8ClampedArray") #endif #if JERRY_BUILTIN_DATE @@ -1106,8 +1113,12 @@ LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (10, LIT_MAGIC_STRING_TYPED_ARRAY_UL) #elif JERRY_ESNEXT LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (10, LIT_MAGIC_STRING_ALLSETTLED) #elif JERRY_BUILTIN_DATAVIEW \ +|| JERRY_BUILTIN_SHAREDARRAYBUFFER \ || JERRY_BUILTIN_TYPEDARRAY LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (10, LIT_MAGIC_STRING_BYTE_LENGTH_UL) +#elif JERRY_BUILTIN_DATAVIEW \ +|| JERRY_BUILTIN_TYPEDARRAY +LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (10, LIT_MAGIC_STRING_BYTE_OFFSET_UL) #elif JERRY_BUILTIN_STRING LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (10, LIT_MAGIC_STRING_CHAR_CODE_AT_UL) #elif JERRY_BUILTIN_TYPEDARRAY \ @@ -1176,8 +1187,10 @@ LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (17, LIT_MAGIC_STRING_BYTES_PER_ELEMENT_ LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (17, LIT_MAGIC_STRING_GENERATOR_FUNCTION_UL) #elif JERRY_BUILTIN_NUMBER LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (17, LIT_MAGIC_STRING_NEGATIVE_INFINITY_U) -#elif JERRY_BUILTIN_TYPEDARRAY +#elif JERRY_BUILTIN_SHAREDARRAYBUFFER LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (17, LIT_MAGIC_STRING_SHARED_ARRAY_BUFFER_UL) +#elif JERRY_BUILTIN_TYPEDARRAY +LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (17, LIT_MAGIC_STRING_UINT8_CLAMPED_ARRAY_UL) #elif JERRY_BUILTIN_DATE LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (17, LIT_MAGIC_STRING_GET_TIMEZONE_OFFSET_UL) #else