diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-dataview-prototype.c b/jerry-core/ecma/builtin-objects/ecma-builtin-dataview-prototype.c index 79d9717d7..f8a78770b 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-dataview-prototype.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-dataview-prototype.c @@ -52,6 +52,10 @@ enum #if ENABLED (JERRY_NUMBER_TYPE_FLOAT64) ECMA_DATAVIEW_PROTOTYPE_GET_FLOAT64, #endif /* ENABLED (JERRY_NUMBER_TYPE_FLOAT64) */ +#if ENABLED (JERRY_BUILTIN_BIGINT) + ECMA_DATAVIEW_PROTOTYPE_GET_BIGINT64, + ECMA_DATAVIEW_PROTOTYPE_GET_BIGUINT64, +#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */ ECMA_DATAVIEW_PROTOTYPE_SET_INT8, ECMA_DATAVIEW_PROTOTYPE_SET_UINT8, ECMA_DATAVIEW_PROTOTYPE_SET_UINT8_CLAMPED, /* unused value */ @@ -63,6 +67,10 @@ enum #if ENABLED (JERRY_NUMBER_TYPE_FLOAT64) ECMA_DATAVIEW_PROTOTYPE_SET_FLOAT64, #endif /* ENABLED (JERRY_NUMBER_TYPE_FLOAT64) */ +#if ENABLED (JERRY_BUILTIN_BIGINT) + ECMA_DATAVIEW_PROTOTYPE_SET_BIGINT64, + ECMA_DATAVIEW_PROTOTYPE_SET_BIGUINT64, +#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */ }; #define BUILTIN_INC_HEADER_NAME "ecma-builtin-dataview-prototype.inc.h" @@ -162,6 +170,10 @@ ecma_builtin_dataview_prototype_dispatch_routine (uint16_t builtin_routine_id, / case ECMA_DATAVIEW_PROTOTYPE_GET_INT32: case ECMA_DATAVIEW_PROTOTYPE_GET_UINT16: case ECMA_DATAVIEW_PROTOTYPE_GET_UINT32: +#if ENABLED (JERRY_BUILTIN_BIGINT) + case ECMA_DATAVIEW_PROTOTYPE_GET_BIGINT64: + case ECMA_DATAVIEW_PROTOTYPE_GET_BIGUINT64: +#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */ { ecma_value_t little_endian = arguments_number > 1 ? arguments_list_p[1] : ECMA_VALUE_FALSE; ecma_typedarray_type_t id = (ecma_typedarray_type_t) (builtin_routine_id - ECMA_DATAVIEW_PROTOTYPE_GET_INT8); @@ -176,6 +188,10 @@ ecma_builtin_dataview_prototype_dispatch_routine (uint16_t builtin_routine_id, / case ECMA_DATAVIEW_PROTOTYPE_SET_INT32: case ECMA_DATAVIEW_PROTOTYPE_SET_UINT16: case ECMA_DATAVIEW_PROTOTYPE_SET_UINT32: +#if ENABLED (JERRY_BUILTIN_BIGINT) + case ECMA_DATAVIEW_PROTOTYPE_SET_BIGINT64: + case ECMA_DATAVIEW_PROTOTYPE_SET_BIGUINT64: +#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */ { ecma_value_t value_to_set = arguments_number > 1 ? arguments_list_p[1] : ECMA_VALUE_UNDEFINED; ecma_value_t little_endian = arguments_number > 2 ? arguments_list_p[2] : ECMA_VALUE_FALSE; diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-dataview-prototype.inc.h b/jerry-core/ecma/builtin-objects/ecma-builtin-dataview-prototype.inc.h index 8f5042d0e..4facc4744 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-dataview-prototype.inc.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-dataview-prototype.inc.h @@ -56,6 +56,12 @@ ROUTINE (LIT_MAGIC_STRING_SET_INT32_UL, ECMA_DATAVIEW_PROTOTYPE_SET_INT32, 2, 2) ROUTINE (LIT_MAGIC_STRING_SET_UINT8_UL, ECMA_DATAVIEW_PROTOTYPE_SET_UINT8, 2, 2) ROUTINE (LIT_MAGIC_STRING_SET_UINT16_UL, ECMA_DATAVIEW_PROTOTYPE_SET_UINT16, 2, 2) ROUTINE (LIT_MAGIC_STRING_SET_UINT32_UL, ECMA_DATAVIEW_PROTOTYPE_SET_UINT32, 2, 2) +#if ENABLED (JERRY_BUILTIN_BIGINT) +ROUTINE (LIT_MAGIC_STRING_GET_BIGINT64, ECMA_DATAVIEW_PROTOTYPE_GET_BIGINT64, 2, 1) +ROUTINE (LIT_MAGIC_STRING_GET_BIGUINT64, ECMA_DATAVIEW_PROTOTYPE_GET_BIGUINT64, 2, 1) +ROUTINE (LIT_MAGIC_STRING_SET_BIGINT64, ECMA_DATAVIEW_PROTOTYPE_SET_BIGINT64, 2, 2) +ROUTINE (LIT_MAGIC_STRING_SET_BIGUINT64, ECMA_DATAVIEW_PROTOTYPE_SET_BIGUINT64, 2, 2) +#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */ /* ECMA-262 v6, 24.2.4.1 */ ACCESSOR_READ_ONLY (LIT_MAGIC_STRING_BUFFER, diff --git a/jerry-core/ecma/operations/ecma-dataview-object.c b/jerry-core/ecma/operations/ecma-dataview-object.c index df6c03604..9d2588cc6 100644 --- a/jerry-core/ecma/operations/ecma-dataview-object.c +++ b/jerry-core/ecma/operations/ecma-dataview-object.c @@ -16,6 +16,7 @@ #include "jcontext.h" #include "ecma-function-object.h" #include "ecma-arraybuffer-object.h" +#include "ecma-bigint.h" #include "ecma-builtins.h" #include "ecma-exceptions.h" #include "ecma-gc.h" @@ -264,18 +265,31 @@ ecma_op_dataview_get_set_view_value (ecma_value_t view, /**< the operation's 'vi return number_index_value; } - /* TODO: Add BigInt support for SetViewValue 4 - 5. */ - - /* SetViewValue 5. */ - ecma_number_t value_to_set_number = 0; + /* SetViewValue 4 - 5. */ if (!ecma_is_value_empty (value_to_set)) { - ecma_value_t value; - value = ecma_op_to_number (value_to_set, &value_to_set_number); - - if (ECMA_IS_VALUE_ERROR (value)) +#if ENABLED (JERRY_BUILTIN_BIGINT) + if (ECMA_TYPEDARRAY_IS_BIGINT_TYPE (id)) { - return value; + value_to_set = ecma_bigint_to_bigint (value_to_set, true); + + if (ECMA_IS_VALUE_ERROR (value_to_set)) + { + return value_to_set; + } + } + else +#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */ + { + ecma_number_t value_to_set_number; + ecma_value_t value = ecma_op_to_number (value_to_set, &value_to_set_number); + + if (ECMA_IS_VALUE_ERROR (value)) + { + return value; + } + + value_to_set = ecma_make_number_value (value_to_set_number); } } @@ -285,6 +299,7 @@ ecma_op_dataview_get_set_view_value (ecma_value_t view, /**< the operation's 'vi /* GetViewValue 5 - 6., SetViewValue 7 - 8. */ if (ecma_arraybuffer_is_detached (buffer_p)) { + ecma_free_value (value_to_set); return ecma_raise_type_error (ECMA_ERR_MSG ("ArrayBuffer has been detached.")); } @@ -300,6 +315,7 @@ ecma_op_dataview_get_set_view_value (ecma_value_t view, /**< the operation's 'vi /* GetViewValue 10., SetViewValue 12. */ if (get_index + element_size > (ecma_number_t) view_size) { + ecma_free_value (value_to_set); return ecma_raise_range_error (ECMA_ERR_MSG ("Start offset is outside the bounds of the buffer.")); } @@ -319,7 +335,6 @@ ecma_op_dataview_get_set_view_value (ecma_value_t view, /**< the operation's 'vi } /* SetViewValue 14. */ - value_to_set = ecma_make_number_value (value_to_set_number); ecma_value_t set_element = ecma_set_typedarray_element (block_p, value_to_set, id); ecma_free_value (value_to_set); diff --git a/jerry-core/lit/lit-magic-strings.inc.h b/jerry-core/lit/lit-magic-strings.inc.h index 54cde1d6f..4c9ac2703 100644 --- a/jerry-core/lit/lit-magic-strings.inc.h +++ b/jerry-core/lit/lit-magic-strings.inc.h @@ -768,6 +768,9 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_CONSTRUCTOR, "constructor") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_DESCRIPTION, "description") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_OBJECT_FROM_ENTRIES, "fromEntries") #endif +#if ENABLED (JERRY_BUILTIN_BIGINT) && ENABLED (JERRY_BUILTIN_DATAVIEW) +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_GET_BIGINT64, "getBigInt64") +#endif #if ENABLED (JERRY_BUILTIN_DATE) LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_GET_FULL_YEAR_UL, "getFullYear") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_GET_UTC_HOURS_UL, "getUTCHours") @@ -785,6 +788,9 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_LAST_INDEX_OF_UL, "lastIndexOf") || ENABLED (JERRY_BUILTIN_TYPEDARRAY) LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_REDUCE_RIGHT_UL, "reduceRight") #endif +#if ENABLED (JERRY_BUILTIN_BIGINT) && ENABLED (JERRY_BUILTIN_DATAVIEW) +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SET_BIGINT64, "setBigInt64") +#endif #if ENABLED (JERRY_BUILTIN_DATE) LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SET_FULL_YEAR_UL, "setFullYear") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SET_UTC_HOURS_UL, "setUTCHours") @@ -839,7 +845,13 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_CONFIGURABLE, "configurable") #if ENABLED (JERRY_BUILTIN_STRING) LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_FROM_CHAR_CODE_UL, "fromCharCode") #endif +#if ENABLED (JERRY_BUILTIN_BIGINT) && ENABLED (JERRY_BUILTIN_DATAVIEW) +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_GET_BIGUINT64, "getBigUint64") +#endif LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_IS_EXTENSIBLE, "isExtensible") +#if ENABLED (JERRY_BUILTIN_BIGINT) && ENABLED (JERRY_BUILTIN_DATAVIEW) +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SET_BIGUINT64, "setBigUint64") +#endif #if ENABLED (JERRY_BUILTIN_DATE) LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_TO_DATE_STRING_UL, "toDateString") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_TO_TIME_STRING_UL, "toTimeString") diff --git a/jerry-core/lit/lit-magic-strings.ini b/jerry-core/lit/lit-magic-strings.ini index 3d95fd278..66d80b432 100644 --- a/jerry-core/lit/lit-magic-strings.ini +++ b/jerry-core/lit/lit-magic-strings.ini @@ -307,12 +307,14 @@ LIT_MAGIC_STRING_UINT32_ARRAY_UL = "Uint32Array" LIT_MAGIC_STRING_CONSTRUCTOR = "constructor" LIT_MAGIC_STRING_CODE_POINT_AT = "codePointAt" LIT_MAGIC_STRING_OBJECT_FROM_ENTRIES = "fromEntries" +LIT_MAGIC_STRING_GET_BIGINT64 = "getBigInt64" LIT_MAGIC_STRING_GET_FULL_YEAR_UL = "getFullYear" LIT_MAGIC_STRING_GET_UTC_HOURS_UL = "getUTCHours" LIT_MAGIC_STRING_GET_UTC_MONTH_UL = "getUTCMonth" LIT_MAGIC_STRING_HAS_INSTANCE = "hasInstance" LIT_MAGIC_STRING_LAST_INDEX_OF_UL = "lastIndexOf" LIT_MAGIC_STRING_REDUCE_RIGHT_UL = "reduceRight" +LIT_MAGIC_STRING_SET_BIGINT64 = "setBigInt64" LIT_MAGIC_STRING_SET_FULL_YEAR_UL = "setFullYear" LIT_MAGIC_STRING_SET_UTC_HOURS_UL = "setUTCHours" LIT_MAGIC_STRING_SET_UTC_MONTH_UL = "setUTCMonth" @@ -333,7 +335,9 @@ LIT_MAGIC_STRING_MAP_ITERATOR_UL = "Map Iterator" LIT_MAGIC_STRING_CONFIGURABLE = "configurable" LIT_MAGIC_STRING_FROM_CHAR_CODE_UL = "fromCharCode" LIT_MAGIC_STRING_FROM_CODE_POINT_UL = "fromCodePoint" +LIT_MAGIC_STRING_GET_BIGUINT64 = "getBigUint64" LIT_MAGIC_STRING_IS_EXTENSIBLE = "isExtensible" +LIT_MAGIC_STRING_SET_BIGUINT64 = "setBigUint64" LIT_MAGIC_STRING_TO_DATE_STRING_UL = "toDateString" LIT_MAGIC_STRING_TO_TIME_STRING_UL = "toTimeString" LIT_MAGIC_STRING_ASYNC_FUNCTION_UL = "AsyncFunction" diff --git a/tests/jerry/es.next/dataview.js b/tests/jerry/es.next/dataview.js index 5c6c2aa0c..28401ba6e 100644 --- a/tests/jerry/es.next/dataview.js +++ b/tests/jerry/es.next/dataview.js @@ -194,6 +194,8 @@ buffer = new ArrayBuffer (24); view1 = new DataView (buffer); view2 = new DataView (buffer, 4, 12); view3 = new DataView (buffer, 6, 18); +view4 = new DataView (buffer); +view5 = new DataView (buffer); view1.setUint8 (0, 255); validateResult(view1, 0, false, [-1, 255, -256, 65280, -16777216, 4278190080, -1.7014118346046924e+38, -5.486124068793689e+303]); @@ -219,6 +221,18 @@ validateResult(view3, 4, true, [65, 65, 2113, 2113, 2113, 2113, 2.96094365511833 validateResult(view2, 4, false, [-48, 208, -12110, 53426, -793624312, 3501342984, -23924850688, -5.411000515087672e+80]); validateResult(view2, 4, true, [-48, 208, -19760, 45776, 138523344, 138523344, 5.828901796903399e-34, 6.84396254e-316]); +view4.setBigInt64 (0, 2n); +assert(view4.getBigInt64(0) === 2n); +view4.setBigInt64 (1, -2n); +assert(view4.getBigInt64(1) === -2n); +assert(view4.getBigUint64(1) === 18446744073709551614n); + +view5.setBigUint64 (0, 2n); +assert(view5.getBigUint64(0) === 2n); +view5.setBigUint64 (1, -2n); +assert(view5.getBigUint64(1) === 18446744073709551614n); +assert(view5.getBigInt64(1) === -2n); + /* Second and third arguments can be "undefined" and there should be no error. */ var arrayBufferOk = new ArrayBuffer (12); diff --git a/tests/test262-esnext-excludelist.xml b/tests/test262-esnext-excludelist.xml index ebf903426..33fb30f21 100644 --- a/tests/test262-esnext-excludelist.xml +++ b/tests/test262-esnext-excludelist.xml @@ -34,44 +34,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -