From 5b6843cdb5e0a35b1587664910c1438356e4c8a1 Mon Sep 17 00:00:00 2001 From: Orkenyi Virag Date: Sun, 11 Apr 2021 11:11:48 +0200 Subject: [PATCH] Add custom dispatcher to Arraybuffer & Arraybuffer_prototype JerryScript-DCO-1.0-Signed-off-by: Orkenyi Virag orkvi@inf.u-szeged.hu --- .../ecma-builtin-arraybuffer-prototype.c | 72 ++++++++++++++----- .../ecma-builtin-arraybuffer-prototype.inc.h | 4 +- .../ecma-builtin-arraybuffer.c | 53 +++++++++++--- .../ecma-builtin-arraybuffer.inc.h | 4 +- 4 files changed, 102 insertions(+), 31 deletions(-) diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-arraybuffer-prototype.c b/jerry-core/ecma/builtin-objects/ecma-builtin-arraybuffer-prototype.c index d1aee322b9..d1a169333e 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-arraybuffer-prototype.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-arraybuffer-prototype.c @@ -32,6 +32,21 @@ #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_BUILTIN_ARRAYBUFFER_PROTOTYPE_ROUTINE_START = 0, + ECMA_BUILTIN_ARRAYBUFFER_PROTOTYPE_BYTELENGTH_GETTER, + ECMA_BUILTIN_ARRAYBUFFER_PROTOTYPE_OBJECT_SLICE, +}; + #define BUILTIN_INC_HEADER_NAME "ecma-builtin-arraybuffer-prototype.inc.h" #define BUILTIN_UNDERSCORED_ID arraybuffer_prototype #include "ecma-builtin-internal-routines-template.inc.h" @@ -56,25 +71,18 @@ * Returned value must be freed with ecma_free_value. */ static ecma_value_t -ecma_builtin_arraybuffer_prototype_bytelength_getter (ecma_value_t this_arg) /**< this argument */ +ecma_builtin_arraybuffer_prototype_bytelength_getter (ecma_value_t this_arg, /**< this argument */ + ecma_object_t *object_p) /**< object value*/ { - if (ecma_is_value_object (this_arg)) + JERRY_UNUSED (this_arg); + if (ecma_arraybuffer_is_detached (object_p)) { - ecma_object_t *object_p = ecma_get_object_from_value (this_arg); - - if (ecma_object_class_is (object_p, ECMA_OBJECT_CLASS_ARRAY_BUFFER)) - { - if (ecma_arraybuffer_is_detached (object_p)) - { - return ecma_raise_type_error (ECMA_ERR_MSG (ecma_error_arraybuffer_is_detached)); - } - uint32_t len = ecma_arraybuffer_get_length (object_p); - - return ecma_make_uint32_value (len); - } + return ecma_raise_type_error (ECMA_ERR_MSG (ecma_error_arraybuffer_is_detached)); } + uint32_t len = ecma_arraybuffer_get_length (object_p); + + return ecma_make_uint32_value (len); - return ecma_raise_type_error (ECMA_ERR_MSG ("Argument 'this' is not a ArrayBuffer object")); } /* ecma_builtin_arraybuffer_prototype_bytelength_getter */ /** @@ -90,6 +98,22 @@ static ecma_value_t ecma_builtin_arraybuffer_prototype_object_slice (ecma_value_t this_arg, /**< this argument */ const ecma_value_t *argument_list_p, /**< arguments list */ uint32_t arguments_number) /**< number of arguments */ +{ + return ecma_builtin_arraybuffer_slice (this_arg, argument_list_p, arguments_number); +} /* ecma_builtin_arraybuffer_prototype_object_slice */ + +/** + * Dispatcher of the built-in's routines + * + * @return ecma value + * Returned value must be freed with ecma_free_value. + */ +ecma_value_t +ecma_builtin_arraybuffer_prototype_dispatch_routine (uint8_t builtin_routine_id, /**< built-in 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 */ { if (!ecma_is_value_object (this_arg)) { @@ -104,8 +128,22 @@ ecma_builtin_arraybuffer_prototype_object_slice (ecma_value_t this_arg, /**< thi return ecma_raise_type_error (ECMA_ERR_MSG ("Argument 'this' is not an ArrayBuffer object")); } - return ecma_builtin_arraybuffer_slice (this_arg, argument_list_p, arguments_number); -} /* ecma_builtin_arraybuffer_prototype_object_slice */ + switch (builtin_routine_id) + { + case ECMA_BUILTIN_ARRAYBUFFER_PROTOTYPE_BYTELENGTH_GETTER: + { + return ecma_builtin_arraybuffer_prototype_bytelength_getter (this_arg, object_p); + } + case ECMA_BUILTIN_ARRAYBUFFER_PROTOTYPE_OBJECT_SLICE: + { + return ecma_builtin_arraybuffer_prototype_object_slice (this_arg, arguments_list_p, arguments_number); + } + default: + { + JERRY_UNREACHABLE (); + } + } +} /* ecma_builtin_arraybuffer_prototype_dispatch_routine */ /** * @} diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-arraybuffer-prototype.inc.h b/jerry-core/ecma/builtin-objects/ecma-builtin-arraybuffer-prototype.inc.h index 80463446f2..265a9bd89d 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-arraybuffer-prototype.inc.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-arraybuffer-prototype.inc.h @@ -28,7 +28,7 @@ OBJECT_VALUE (LIT_MAGIC_STRING_CONSTRUCTOR, ECMA_BUILTIN_ID_ARRAYBUFFER, ECMA_PR /* Readonly accessor properties */ ACCESSOR_READ_ONLY (LIT_MAGIC_STRING_BYTE_LENGTH_UL, - ecma_builtin_arraybuffer_prototype_bytelength_getter, + ECMA_BUILTIN_ARRAYBUFFER_PROTOTYPE_BYTELENGTH_GETTER, ECMA_PROPERTY_FLAG_CONFIGURABLE) /* ECMA-262 v6, 24.1.4.4 */ @@ -36,7 +36,7 @@ STRING_VALUE (LIT_GLOBAL_SYMBOL_TO_STRING_TAG, LIT_MAGIC_STRING_ARRAY_BUFFER_UL, /* Routine properties: * (property name, C routine name, arguments number or NON_FIXED, value of the routine's length property) */ -ROUTINE (LIT_MAGIC_STRING_SLICE, ecma_builtin_arraybuffer_prototype_object_slice, NON_FIXED, 2) +ROUTINE (LIT_MAGIC_STRING_SLICE, ECMA_BUILTIN_ARRAYBUFFER_PROTOTYPE_OBJECT_SLICE, NON_FIXED, 2) #endif /* JERRY_BUILTIN_TYPEDARRAY */ diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-arraybuffer.c b/jerry-core/ecma/builtin-objects/ecma-builtin-arraybuffer.c index 1ad9d9bfe4..e3886a07ac 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-arraybuffer.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-arraybuffer.c @@ -29,6 +29,21 @@ #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_BUILTIN_ARRAYBUFFER_ROUTINE_START = 0, + ECMA_BUILTIN_ARRAYBUFFER_OBJECT_IS_VIEW, + ECMA_BUILTIN_ARRAYBUFFER_SPECIES_GET, +}; + #define BUILTIN_INC_HEADER_NAME "ecma-builtin-arraybuffer.inc.h" #define BUILTIN_UNDERSCORED_ID arraybuffer #include "ecma-builtin-internal-routines-template.inc.h" @@ -53,11 +68,8 @@ * Returned value must be freed with ecma_free_value. */ static ecma_value_t -ecma_builtin_arraybuffer_object_is_view (ecma_value_t this_arg, /**< 'this' argument */ - ecma_value_t arg) /**< argument 1 */ +ecma_builtin_arraybuffer_object_is_view (ecma_value_t arg) /**< argument 1 */ { - JERRY_UNUSED (this_arg); - return ecma_make_boolean_value (ecma_is_typedarray (arg) || ecma_is_dataview (arg)); } /* ecma_builtin_arraybuffer_object_is_view */ @@ -94,16 +106,37 @@ ecma_builtin_arraybuffer_dispatch_construct (const ecma_value_t *arguments_list_ } /* ecma_builtin_arraybuffer_dispatch_construct */ /** - * 24.1.3.3 get ArrayBuffer [ @@species ] accessor + * Dispatcher of the built-in's routines * - * @return ecma_value - * returned value must be freed with ecma_free_value + * @return ecma value + * Returned value must be freed with ecma_free_value. */ ecma_value_t -ecma_builtin_arraybuffer_species_get (ecma_value_t this_value) /**< This Value */ +ecma_builtin_arraybuffer_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 */ { - return ecma_copy_value (this_value); -} /* ecma_builtin_arraybuffer_species_get */ + JERRY_UNUSED (arguments_number); + + switch (builtin_routine_id) + { + case ECMA_BUILTIN_ARRAYBUFFER_OBJECT_IS_VIEW: + { + ecma_value_t argument = arguments_number > 0 ? arguments_list_p[0] : ECMA_VALUE_UNDEFINED; + return ecma_builtin_arraybuffer_object_is_view (argument); + } + case ECMA_BUILTIN_ARRAYBUFFER_SPECIES_GET: + { + return ecma_copy_value (this_arg); + } + default: + { + JERRY_UNREACHABLE (); + } + } +} /* ecma_builtin_arraybuffer_dispatch_routine */ /** * @} diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-arraybuffer.inc.h b/jerry-core/ecma/builtin-objects/ecma-builtin-arraybuffer.inc.h index 6fe1a93681..97e6852c41 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-arraybuffer.inc.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-arraybuffer.inc.h @@ -37,10 +37,10 @@ STRING_VALUE (LIT_MAGIC_STRING_NAME, LIT_MAGIC_STRING_ARRAY_BUFFER_UL, ECMA_PROP * (property name, C routine name, arguments number or NON_FIXED, value of the routine's length property) */ /* ES2015 24.1.3.1 */ -ROUTINE (LIT_MAGIC_STRING_IS_VIEW_UL, ecma_builtin_arraybuffer_object_is_view, 1, 1) +ROUTINE (LIT_MAGIC_STRING_IS_VIEW_UL, ECMA_BUILTIN_ARRAYBUFFER_OBJECT_IS_VIEW, 1, 1) /* ES2015 24.1.3.3 */ -ACCESSOR_READ_ONLY (LIT_GLOBAL_SYMBOL_SPECIES, ecma_builtin_arraybuffer_species_get, ECMA_PROPERTY_FLAG_CONFIGURABLE) +ACCESSOR_READ_ONLY (LIT_GLOBAL_SYMBOL_SPECIES, ECMA_BUILTIN_ARRAYBUFFER_SPECIES_GET, ECMA_PROPERTY_FLAG_CONFIGURABLE) #endif /* JERRY_BUILTIN_TYPEDARRAY */