Implement DataView.prototype.{set, get}Big{U}int64 methods (#4315)

Co-authored by Adam Szilagyi aszilagy@inf.u-szeged.hu

JerryScript-DCO-1.0-Signed-off-by: Csaba Osztrogonác csaba.osztrogonac@h-lab.eu
This commit is contained in:
Csaba Osztrogonác 2020-10-28 11:46:52 +01:00 committed by GitHub
parent 2007188373
commit 3115d4dc16
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 77 additions and 48 deletions

View File

@ -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;

View File

@ -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,

View File

@ -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);

View File

@ -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")

View File

@ -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"

View File

@ -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);

View File

@ -34,44 +34,6 @@
<test id="built-ins/BigInt/asUintN/length.js"><reason></reason></test>
<test id="built-ins/BigInt/asUintN/name.js"><reason></reason></test>
<test id="built-ins/BigInt/asUintN/order-of-steps.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigInt64/index-is-out-of-range.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigInt64/length.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigInt64/name.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigInt64/negative-byteoffset-throws.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigInt64/return-abrupt-from-tonumber-byteoffset.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigInt64/return-value-clean-arraybuffer.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigInt64/return-values-custom-offset.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigInt64/return-values.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigInt64/to-boolean-littleendian.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigInt64/toindex-byteoffset-errors.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigInt64/toindex-byteoffset-toprimitive.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigInt64/toindex-byteoffset-wrapped-values.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigInt64/toindex-byteoffset.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigUint64/index-is-out-of-range.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigUint64/length.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigUint64/name.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigUint64/negative-byteoffset-throws.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigUint64/return-abrupt-from-tonumber-byteoffset.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigUint64/return-value-clean-arraybuffer.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigUint64/return-values-custom-offset.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigUint64/return-values.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigUint64/to-boolean-littleendian.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigUint64/toindex-byteoffset-errors.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigUint64/toindex-byteoffset-toprimitive.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigUint64/toindex-byteoffset-wrapped-values.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/getBigUint64/toindex-byteoffset.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setBigInt64/index-check-before-value-conversion.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setBigInt64/index-is-out-of-range.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setBigInt64/length.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setBigInt64/name.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setBigInt64/negative-byteoffset-throws.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setBigInt64/range-check-after-value-conversion.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setBigInt64/return-abrupt-from-tobigint-value.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setBigInt64/return-abrupt-from-tonumber-byteoffset.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setBigInt64/set-values-little-endian-order.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setBigInt64/set-values-return-undefined.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setBigInt64/to-boolean-littleendian.js"><reason></reason></test>
<test id="built-ins/DataView/prototype/setBigInt64/toindex-byteoffset.js"><reason></reason></test>
<test id="built-ins/Date/prototype/setTime/new-value-time-clip.js"><reason></reason></test>
<test id="built-ins/Date/prototype/toDateString/format.js"><reason></reason></test>
<test id="built-ins/Date/prototype/toDateString/negative-year.js"><reason></reason></test>