1425bb815Sopenharmony_ci/* Copyright JS Foundation and other contributors, http://js.foundation 2425bb815Sopenharmony_ci * 3425bb815Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4425bb815Sopenharmony_ci * you may not use this file except in compliance with the License. 5425bb815Sopenharmony_ci * You may obtain a copy of the License at 6425bb815Sopenharmony_ci * 7425bb815Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8425bb815Sopenharmony_ci * 9425bb815Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10425bb815Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS 11425bb815Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12425bb815Sopenharmony_ci * See the License for the specific language governing permissions and 13425bb815Sopenharmony_ci * limitations under the License. 14425bb815Sopenharmony_ci */ 15425bb815Sopenharmony_ci 16425bb815Sopenharmony_ci#include "ecma-arraybuffer-object.h" 17425bb815Sopenharmony_ci#include "ecma-builtins.h" 18425bb815Sopenharmony_ci#include "ecma-exceptions.h" 19425bb815Sopenharmony_ci#include "ecma-gc.h" 20425bb815Sopenharmony_ci#include "ecma-helpers.h" 21425bb815Sopenharmony_ci#include "ecma-dataview-object.h" 22425bb815Sopenharmony_ci#include "ecma-typedarray-object.h" 23425bb815Sopenharmony_ci#include "ecma-objects.h" 24425bb815Sopenharmony_ci#if defined(JERRY_FOR_IAR_CONFIG) 25425bb815Sopenharmony_ci#include "jerryscript-core.h" 26425bb815Sopenharmony_ci#endif 27425bb815Sopenharmony_ci 28425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015_BUILTIN_DATAVIEW) 29425bb815Sopenharmony_ci 30425bb815Sopenharmony_ci/** \addtogroup ecma ECMA 31425bb815Sopenharmony_ci * @{ 32425bb815Sopenharmony_ci * 33425bb815Sopenharmony_ci * \addtogroup ecmadataviewobject ECMA builtin DataView helper functions 34425bb815Sopenharmony_ci * @{ 35425bb815Sopenharmony_ci */ 36425bb815Sopenharmony_ci 37425bb815Sopenharmony_ci/** 38425bb815Sopenharmony_ci * Handle calling [[Construct]] of built-in DataView like objects 39425bb815Sopenharmony_ci * 40425bb815Sopenharmony_ci * See also: 41425bb815Sopenharmony_ci * ECMA-262 v6, 24.2.2.1 42425bb815Sopenharmony_ci * 43425bb815Sopenharmony_ci * @return created DataView object as an ecma-value - if success 44425bb815Sopenharmony_ci * raised error - otherwise 45425bb815Sopenharmony_ci */ 46425bb815Sopenharmony_ciecma_value_t 47425bb815Sopenharmony_ciecma_op_dataview_create (const ecma_value_t *arguments_list_p, /**< arguments list */ 48425bb815Sopenharmony_ci ecma_length_t arguments_list_len) /**< number of arguments */ 49425bb815Sopenharmony_ci{ 50425bb815Sopenharmony_ci JERRY_ASSERT (arguments_list_len == 0 || arguments_list_p != NULL); 51425bb815Sopenharmony_ci 52425bb815Sopenharmony_ci ecma_value_t buffer = arguments_list_len > 0 ? arguments_list_p[0] : ECMA_VALUE_UNDEFINED; 53425bb815Sopenharmony_ci 54425bb815Sopenharmony_ci /* 2. */ 55425bb815Sopenharmony_ci if (!ecma_is_value_object (buffer)) 56425bb815Sopenharmony_ci { 57425bb815Sopenharmony_ci return ecma_raise_type_error (ECMA_ERR_MSG ("Argument buffer is not an object.")); 58425bb815Sopenharmony_ci } 59425bb815Sopenharmony_ci 60425bb815Sopenharmony_ci ecma_object_t *buffer_p = ecma_get_object_from_value (buffer); 61425bb815Sopenharmony_ci 62425bb815Sopenharmony_ci /* 3. */ 63425bb815Sopenharmony_ci if (!ecma_object_class_is (buffer_p, LIT_MAGIC_STRING_ARRAY_BUFFER_UL)) 64425bb815Sopenharmony_ci { 65425bb815Sopenharmony_ci return ecma_raise_type_error (ECMA_ERR_MSG ("Argument buffer is not an arraybuffer.")); 66425bb815Sopenharmony_ci } 67425bb815Sopenharmony_ci 68425bb815Sopenharmony_ci /* 4 - 6. */ 69425bb815Sopenharmony_ci uint32_t offset = 0; 70425bb815Sopenharmony_ci 71425bb815Sopenharmony_ci if (arguments_list_len > 1) 72425bb815Sopenharmony_ci { 73425bb815Sopenharmony_ci ecma_number_t number_offset, offset_num; 74425bb815Sopenharmony_ci if (ECMA_IS_VALUE_ERROR (ecma_get_number (arguments_list_p[1], &number_offset))) 75425bb815Sopenharmony_ci { 76425bb815Sopenharmony_ci return ECMA_VALUE_ERROR; 77425bb815Sopenharmony_ci } 78425bb815Sopenharmony_ci if (ECMA_IS_VALUE_ERROR (ecma_op_to_integer (arguments_list_p[1], &offset_num))) 79425bb815Sopenharmony_ci { 80425bb815Sopenharmony_ci return ECMA_VALUE_ERROR; 81425bb815Sopenharmony_ci } 82425bb815Sopenharmony_ci 83425bb815Sopenharmony_ci /* 7. */ 84425bb815Sopenharmony_ci if (number_offset != offset_num || offset_num < 0) 85425bb815Sopenharmony_ci { 86425bb815Sopenharmony_ci return ecma_raise_range_error (ECMA_ERR_MSG ("Start offset is outside the bounds of the buffer.")); 87425bb815Sopenharmony_ci } 88425bb815Sopenharmony_ci 89425bb815Sopenharmony_ci offset = (uint32_t) offset_num; 90425bb815Sopenharmony_ci } 91425bb815Sopenharmony_ci 92425bb815Sopenharmony_ci /* 8. */ 93425bb815Sopenharmony_ci if (ecma_arraybuffer_is_detached (buffer_p)) 94425bb815Sopenharmony_ci { 95425bb815Sopenharmony_ci return ecma_raise_type_error (ECMA_ERR_MSG ("ArrayBuffer has been detached.")); 96425bb815Sopenharmony_ci } 97425bb815Sopenharmony_ci 98425bb815Sopenharmony_ci /* 9. */ 99425bb815Sopenharmony_ci ecma_length_t buffer_byte_length = ecma_arraybuffer_get_length (buffer_p); 100425bb815Sopenharmony_ci 101425bb815Sopenharmony_ci /* 10. */ 102425bb815Sopenharmony_ci if ((ecma_length_t) offset > buffer_byte_length) 103425bb815Sopenharmony_ci { 104425bb815Sopenharmony_ci return ecma_raise_range_error (ECMA_ERR_MSG ("Start offset is outside the bounds of the buffer.")); 105425bb815Sopenharmony_ci } 106425bb815Sopenharmony_ci 107425bb815Sopenharmony_ci /* 11 - 12. */ 108425bb815Sopenharmony_ci uint32_t viewByteLength; 109425bb815Sopenharmony_ci if (arguments_list_len > 2) 110425bb815Sopenharmony_ci { 111425bb815Sopenharmony_ci /* 12.a */ 112425bb815Sopenharmony_ci ecma_value_t byte_length_value = ecma_op_to_length (arguments_list_p[2], &viewByteLength); 113425bb815Sopenharmony_ci 114425bb815Sopenharmony_ci /* 12.b */ 115425bb815Sopenharmony_ci if (ECMA_IS_VALUE_ERROR (byte_length_value)) 116425bb815Sopenharmony_ci { 117425bb815Sopenharmony_ci return byte_length_value; 118425bb815Sopenharmony_ci } 119425bb815Sopenharmony_ci 120425bb815Sopenharmony_ci /* 12.c */ 121425bb815Sopenharmony_ci if ((ecma_number_t) offset + viewByteLength > buffer_byte_length) 122425bb815Sopenharmony_ci { 123425bb815Sopenharmony_ci return ecma_raise_range_error (ECMA_ERR_MSG ("Start offset is outside the bounds of the buffer.")); 124425bb815Sopenharmony_ci } 125425bb815Sopenharmony_ci } 126425bb815Sopenharmony_ci else 127425bb815Sopenharmony_ci { 128425bb815Sopenharmony_ci /* 11.a */ 129425bb815Sopenharmony_ci viewByteLength = (uint32_t) (buffer_byte_length - (ecma_length_t) offset); 130425bb815Sopenharmony_ci } 131425bb815Sopenharmony_ci 132425bb815Sopenharmony_ci /* 13. */ 133425bb815Sopenharmony_ci ecma_object_t *object_p = ecma_create_object (ecma_builtin_get (ECMA_BUILTIN_ID_DATAVIEW_PROTOTYPE), 134425bb815Sopenharmony_ci sizeof (ecma_dataview_object_t), 135425bb815Sopenharmony_ci ECMA_OBJECT_TYPE_CLASS); 136425bb815Sopenharmony_ci 137425bb815Sopenharmony_ci ecma_dataview_object_t *dataview_obj_p = (ecma_dataview_object_t *) object_p; 138425bb815Sopenharmony_ci dataview_obj_p->header.u.class_prop.class_id = LIT_MAGIC_STRING_DATAVIEW_UL; 139425bb815Sopenharmony_ci dataview_obj_p->header.u.class_prop.u.length = viewByteLength; 140425bb815Sopenharmony_ci dataview_obj_p->buffer_p = buffer_p; 141425bb815Sopenharmony_ci dataview_obj_p->byte_offset = (uint32_t) offset; 142425bb815Sopenharmony_ci 143425bb815Sopenharmony_ci return ecma_make_object_value (object_p); 144425bb815Sopenharmony_ci} /* ecma_op_dataview_create */ 145425bb815Sopenharmony_ci 146425bb815Sopenharmony_ci/** 147425bb815Sopenharmony_ci * Get the DataView object pointer 148425bb815Sopenharmony_ci * 149425bb815Sopenharmony_ci * Note: 150425bb815Sopenharmony_ci * If the function returns with NULL, the error object has 151425bb815Sopenharmony_ci * already set, and the caller must return with ECMA_VALUE_ERROR 152425bb815Sopenharmony_ci * 153425bb815Sopenharmony_ci * @return pointer to the dataView if this_arg is a valid dataView object 154425bb815Sopenharmony_ci * NULL otherwise 155425bb815Sopenharmony_ci */ 156425bb815Sopenharmony_ciecma_dataview_object_t * 157425bb815Sopenharmony_ciecma_op_dataview_get_object (ecma_value_t this_arg) /**< this argument */ 158425bb815Sopenharmony_ci{ 159425bb815Sopenharmony_ci if (ecma_is_value_object (this_arg)) 160425bb815Sopenharmony_ci { 161425bb815Sopenharmony_ci ecma_dataview_object_t *dataview_object_p = (ecma_dataview_object_t *) ecma_get_object_from_value (this_arg); 162425bb815Sopenharmony_ci 163425bb815Sopenharmony_ci if (ecma_get_object_type (&dataview_object_p->header.object) == ECMA_OBJECT_TYPE_CLASS 164425bb815Sopenharmony_ci && dataview_object_p->header.u.class_prop.class_id == LIT_MAGIC_STRING_DATAVIEW_UL) 165425bb815Sopenharmony_ci { 166425bb815Sopenharmony_ci return dataview_object_p; 167425bb815Sopenharmony_ci } 168425bb815Sopenharmony_ci } 169425bb815Sopenharmony_ci 170425bb815Sopenharmony_ci ecma_raise_type_error (ECMA_ERR_MSG ("Expected a DataView object.")); 171425bb815Sopenharmony_ci return NULL; 172425bb815Sopenharmony_ci} /* ecma_op_dataview_get_object */ 173425bb815Sopenharmony_ci 174425bb815Sopenharmony_ci/** 175425bb815Sopenharmony_ci * Helper union to specify the system's endiannes 176425bb815Sopenharmony_ci */ 177425bb815Sopenharmony_citypedef union 178425bb815Sopenharmony_ci{ 179425bb815Sopenharmony_ci uint32_t number; /**< for write numeric data */ 180425bb815Sopenharmony_ci char data[sizeof (uint32_t)]; /**< for read numeric data */ 181425bb815Sopenharmony_ci} ecma_dataview_endiannes_check_t; 182425bb815Sopenharmony_ci 183425bb815Sopenharmony_ci/** 184425bb815Sopenharmony_ci * Helper function to check the current system endiannes 185425bb815Sopenharmony_ci * 186425bb815Sopenharmony_ci * @return true - if the current system has little endian byteorder 187425bb815Sopenharmony_ci * false - otherwise 188425bb815Sopenharmony_ci */ 189425bb815Sopenharmony_cistatic bool 190425bb815Sopenharmony_ciecma_dataview_check_little_endian (void) 191425bb815Sopenharmony_ci{ 192425bb815Sopenharmony_ci ecma_dataview_endiannes_check_t checker; 193425bb815Sopenharmony_ci checker.number = 0x01; 194425bb815Sopenharmony_ci 195425bb815Sopenharmony_ci return checker.data[0] == 0x01; 196425bb815Sopenharmony_ci} /* ecma_dataview_check_little_endian */ 197425bb815Sopenharmony_ci 198425bb815Sopenharmony_ci/** 199425bb815Sopenharmony_ci * Helper function for swap bytes if the system's endiannes 200425bb815Sopenharmony_ci * does not match with the requested endiannes. 201425bb815Sopenharmony_ci */ 202425bb815Sopenharmony_cistatic void 203425bb815Sopenharmony_ciecma_dataview_swap_order (bool system_is_little_endian, /**< true - if the system has little endian byteorder 204425bb815Sopenharmony_ci * false - otherwise */ 205425bb815Sopenharmony_ci bool is_little_endian, /**< true - if little endian byteorder is requested 206425bb815Sopenharmony_ci * false - otherwise */ 207425bb815Sopenharmony_ci uint32_t element_size, /**< element size byte according to the Table 49.*/ 208425bb815Sopenharmony_ci lit_utf8_byte_t *block_p) /**< data block */ 209425bb815Sopenharmony_ci{ 210425bb815Sopenharmony_ci if (system_is_little_endian ^ is_little_endian) 211425bb815Sopenharmony_ci { 212425bb815Sopenharmony_ci for (uint32_t i = 0; i < element_size / 2; i++) 213425bb815Sopenharmony_ci { 214425bb815Sopenharmony_ci lit_utf8_byte_t tmp = block_p[i]; 215425bb815Sopenharmony_ci block_p[i] = block_p[element_size - i - 1]; 216425bb815Sopenharmony_ci block_p[element_size - i - 1] = tmp; 217425bb815Sopenharmony_ci } 218425bb815Sopenharmony_ci } 219425bb815Sopenharmony_ci} /* ecma_dataview_swap_order */ 220425bb815Sopenharmony_ci 221425bb815Sopenharmony_ci/** 222425bb815Sopenharmony_ci * GetViewValue and SetViewValue abstact operation 223425bb815Sopenharmony_ci * 224425bb815Sopenharmony_ci * See also: 225425bb815Sopenharmony_ci * ECMA-262 v6, 24.2.1.1 226425bb815Sopenharmony_ci * ECMA-262 v6, 24.2.1.2 227425bb815Sopenharmony_ci * 228425bb815Sopenharmony_ci * @return ecma value 229425bb815Sopenharmony_ci */ 230425bb815Sopenharmony_ciecma_value_t 231425bb815Sopenharmony_ciecma_op_dataview_get_set_view_value (ecma_value_t view, /**< the operation's 'view' argument */ 232425bb815Sopenharmony_ci ecma_value_t request_index, /**< the operation's 'requestIndex' argument */ 233425bb815Sopenharmony_ci ecma_value_t is_little_endian_value, /**< the operation's 234425bb815Sopenharmony_ci * 'isLittleEndian' argument */ 235425bb815Sopenharmony_ci ecma_value_t value_to_set, /**< the operation's 'value' argument */ 236425bb815Sopenharmony_ci ecma_typedarray_type_t id) /**< the operation's 'type' argument */ 237425bb815Sopenharmony_ci{ 238425bb815Sopenharmony_ci /* 1 - 2. */ 239425bb815Sopenharmony_ci ecma_dataview_object_t *view_p = ecma_op_dataview_get_object (view); 240425bb815Sopenharmony_ci#if defined(JERRY_FOR_IAR_CONFIG) 241425bb815Sopenharmony_ci lit_utf8_byte_t* swap_block_p; 242425bb815Sopenharmony_ci ecma_value_t ret; 243425bb815Sopenharmony_ci#endif 244425bb815Sopenharmony_ci 245425bb815Sopenharmony_ci if (JERRY_UNLIKELY (view_p == NULL)) 246425bb815Sopenharmony_ci { 247425bb815Sopenharmony_ci return ECMA_VALUE_ERROR; 248425bb815Sopenharmony_ci } 249425bb815Sopenharmony_ci 250425bb815Sopenharmony_ci /* 3 - 5. */ 251425bb815Sopenharmony_ci ecma_number_t number_index; 252425bb815Sopenharmony_ci ecma_value_t number_index_value = ecma_op_to_integer (request_index, &number_index); 253425bb815Sopenharmony_ci 254425bb815Sopenharmony_ci if (ECMA_IS_VALUE_ERROR (number_index_value)) 255425bb815Sopenharmony_ci { 256425bb815Sopenharmony_ci return number_index_value; 257425bb815Sopenharmony_ci } 258425bb815Sopenharmony_ci 259425bb815Sopenharmony_ci int32_t get_index = ecma_number_to_int32 (number_index); 260425bb815Sopenharmony_ci 261425bb815Sopenharmony_ci /* 6. */ 262425bb815Sopenharmony_ci if (number_index != get_index || get_index < 0) 263425bb815Sopenharmony_ci { 264425bb815Sopenharmony_ci return ecma_raise_range_error (ECMA_ERR_MSG ("Start offset is outside the bounds of the buffer.")); 265425bb815Sopenharmony_ci } 266425bb815Sopenharmony_ci 267425bb815Sopenharmony_ci /* 7. */ 268425bb815Sopenharmony_ci bool is_little_endian = ecma_op_to_boolean (is_little_endian_value); 269425bb815Sopenharmony_ci 270425bb815Sopenharmony_ci /* 8. TODO: Throw TypeError, when Detached ArrayBuffer will be supported. */ 271425bb815Sopenharmony_ci 272425bb815Sopenharmony_ci /* 9. */ 273425bb815Sopenharmony_ci ecma_object_t *buffer_p = view_p->buffer_p; 274425bb815Sopenharmony_ci JERRY_ASSERT (ecma_object_class_is (buffer_p, LIT_MAGIC_STRING_ARRAY_BUFFER_UL)); 275425bb815Sopenharmony_ci if (ecma_arraybuffer_is_detached (buffer_p)) 276425bb815Sopenharmony_ci { 277425bb815Sopenharmony_ci return ecma_raise_type_error (ECMA_ERR_MSG ("ArrayBuffer has been detached.")); 278425bb815Sopenharmony_ci } 279425bb815Sopenharmony_ci 280425bb815Sopenharmony_ci /* 10. */ 281425bb815Sopenharmony_ci uint32_t view_offset = view_p->byte_offset; 282425bb815Sopenharmony_ci 283425bb815Sopenharmony_ci /* 11. */ 284425bb815Sopenharmony_ci uint32_t view_size = view_p->header.u.class_prop.u.length; 285425bb815Sopenharmony_ci 286425bb815Sopenharmony_ci /* 12. */ 287425bb815Sopenharmony_ci uint8_t element_size = (uint8_t) (1 << (ecma_typedarray_helper_get_shift_size (id))); 288425bb815Sopenharmony_ci 289425bb815Sopenharmony_ci /* 13. */ 290425bb815Sopenharmony_ci if ((uint32_t) get_index + element_size > view_size) 291425bb815Sopenharmony_ci { 292425bb815Sopenharmony_ci return ecma_raise_range_error (ECMA_ERR_MSG ("Start offset is outside the bounds of the buffer.")); 293425bb815Sopenharmony_ci } 294425bb815Sopenharmony_ci 295425bb815Sopenharmony_ci /* 14. */ 296425bb815Sopenharmony_ci uint32_t buffer_index = (uint32_t) get_index + view_offset; 297425bb815Sopenharmony_ci lit_utf8_byte_t *block_p = ecma_arraybuffer_get_buffer (buffer_p) + buffer_index; 298425bb815Sopenharmony_ci 299425bb815Sopenharmony_ci bool system_is_little_endian = ecma_dataview_check_little_endian (); 300425bb815Sopenharmony_ci 301425bb815Sopenharmony_ci if (ecma_is_value_empty (value_to_set)) 302425bb815Sopenharmony_ci { 303425bb815Sopenharmony_ci#if defined(JERRY_FOR_IAR_CONFIG) 304425bb815Sopenharmony_ci swap_block_p = jerry_vla_malloc (sizeof(lit_utf8_byte_t) * element_size); 305425bb815Sopenharmony_ci if (!swap_block_p) 306425bb815Sopenharmony_ci { 307425bb815Sopenharmony_ci return ecma_raise_common_error (ECMA_ERR_MSG ("malloc swap_block_p failed.")); 308425bb815Sopenharmony_ci } 309425bb815Sopenharmony_ci#else 310425bb815Sopenharmony_ci JERRY_VLA (lit_utf8_byte_t, swap_block_p, element_size); 311425bb815Sopenharmony_ci#endif 312425bb815Sopenharmony_ci memcpy (swap_block_p, block_p, element_size * sizeof (lit_utf8_byte_t)); 313425bb815Sopenharmony_ci ecma_dataview_swap_order (system_is_little_endian, is_little_endian, element_size, swap_block_p); 314425bb815Sopenharmony_ci#if defined(JERRY_FOR_IAR_CONFIG) 315425bb815Sopenharmony_ci ret = ecma_make_number_value (ecma_get_typedarray_element (swap_block_p, id)); 316425bb815Sopenharmony_ci jerry_vla_free (swap_block_p); 317425bb815Sopenharmony_ci return ret; 318425bb815Sopenharmony_ci#else 319425bb815Sopenharmony_ci return ecma_make_number_value (ecma_get_typedarray_element (swap_block_p, id)); 320425bb815Sopenharmony_ci#endif 321425bb815Sopenharmony_ci } 322425bb815Sopenharmony_ci 323425bb815Sopenharmony_ci if (ecma_is_value_number (value_to_set)) 324425bb815Sopenharmony_ci { 325425bb815Sopenharmony_ci ecma_set_typedarray_element (block_p, ecma_get_number_from_value (value_to_set), id); 326425bb815Sopenharmony_ci ecma_dataview_swap_order (system_is_little_endian, is_little_endian, element_size, block_p); 327425bb815Sopenharmony_ci } 328425bb815Sopenharmony_ci 329425bb815Sopenharmony_ci return ECMA_VALUE_UNDEFINED; 330425bb815Sopenharmony_ci} /* ecma_op_dataview_get_set_view_value */ 331425bb815Sopenharmony_ci 332425bb815Sopenharmony_ci/** 333425bb815Sopenharmony_ci * Check if the value is dataview 334425bb815Sopenharmony_ci * 335425bb815Sopenharmony_ci * @return true - if value is a DataView object 336425bb815Sopenharmony_ci * false - otherwise 337425bb815Sopenharmony_ci */ 338425bb815Sopenharmony_cibool 339425bb815Sopenharmony_ciecma_is_dataview (ecma_value_t value) /**< the target need to be checked */ 340425bb815Sopenharmony_ci{ 341425bb815Sopenharmony_ci if (!ecma_is_value_object (value)) 342425bb815Sopenharmony_ci { 343425bb815Sopenharmony_ci return false; 344425bb815Sopenharmony_ci } 345425bb815Sopenharmony_ci 346425bb815Sopenharmony_ci ecma_dataview_object_t *dataview_object_p = (ecma_dataview_object_t *) ecma_get_object_from_value (value); 347425bb815Sopenharmony_ci 348425bb815Sopenharmony_ci return (ecma_get_object_type (&dataview_object_p->header.object) == ECMA_OBJECT_TYPE_CLASS 349425bb815Sopenharmony_ci && dataview_object_p->header.u.class_prop.class_id == LIT_MAGIC_STRING_DATAVIEW_UL); 350425bb815Sopenharmony_ci} /* ecma_is_dataview */ 351425bb815Sopenharmony_ci 352425bb815Sopenharmony_ci/** 353425bb815Sopenharmony_ci * @} 354425bb815Sopenharmony_ci * @} 355425bb815Sopenharmony_ci */ 356425bb815Sopenharmony_ci 357425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015_BUILTIN_DATAVIEW */ 358