mirror of
https://github.com/jerryscript-project/jerryscript.git
synced 2025-12-15 16:29:21 +00:00
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:
parent
2007188373
commit
3115d4dc16
@ -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;
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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")
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user