mirror of
https://github.com/jerryscript-project/jerryscript.git
synced 2025-12-15 16:29:21 +00:00
Implement ToIndex abstract operation (#4287)
https://www.ecma-international.org/ecma-262/11.0/#sec-toindex Made DataView constructor, DataView.prototype.setXXX/getXXX methods ES11 conform. JerryScript-DCO-1.0-Signed-off-by: Csaba Osztrogonác csaba.osztrogonac@h-lab.eu
This commit is contained in:
parent
d5d27afd39
commit
24a5489331
@ -46,16 +46,16 @@ ROUTINE (LIT_MAGIC_STRING_GET_INT32_UL, ECMA_DATAVIEW_PROTOTYPE_GET_INT32, 2, 1)
|
||||
ROUTINE (LIT_MAGIC_STRING_GET_UINT8_UL, ECMA_DATAVIEW_PROTOTYPE_GET_UINT8, 2, 1)
|
||||
ROUTINE (LIT_MAGIC_STRING_GET_UINT16_UL, ECMA_DATAVIEW_PROTOTYPE_GET_UINT16, 2, 1)
|
||||
ROUTINE (LIT_MAGIC_STRING_GET_UINT32_UL, ECMA_DATAVIEW_PROTOTYPE_GET_UINT32, 2, 1)
|
||||
ROUTINE (LIT_MAGIC_STRING_SET_FLOAT_32_UL, ECMA_DATAVIEW_PROTOTYPE_SET_FLOAT32, 2, 1)
|
||||
ROUTINE (LIT_MAGIC_STRING_SET_FLOAT_32_UL, ECMA_DATAVIEW_PROTOTYPE_SET_FLOAT32, 2, 2)
|
||||
#if ENABLED (JERRY_NUMBER_TYPE_FLOAT64)
|
||||
ROUTINE (LIT_MAGIC_STRING_SET_FLOAT_64_UL, ECMA_DATAVIEW_PROTOTYPE_SET_FLOAT64, 2, 1)
|
||||
ROUTINE (LIT_MAGIC_STRING_SET_FLOAT_64_UL, ECMA_DATAVIEW_PROTOTYPE_SET_FLOAT64, 2, 2)
|
||||
#endif /* ENABLED (JERRY_NUMBER_TYPE_FLOAT64) */
|
||||
ROUTINE (LIT_MAGIC_STRING_SET_INT8_UL, ECMA_DATAVIEW_PROTOTYPE_SET_INT8, 1, 1)
|
||||
ROUTINE (LIT_MAGIC_STRING_SET_INT16_UL, ECMA_DATAVIEW_PROTOTYPE_SET_INT16, 2, 1)
|
||||
ROUTINE (LIT_MAGIC_STRING_SET_INT32_UL, ECMA_DATAVIEW_PROTOTYPE_SET_INT32, 2, 1)
|
||||
ROUTINE (LIT_MAGIC_STRING_SET_UINT8_UL, ECMA_DATAVIEW_PROTOTYPE_SET_UINT8, 2, 1)
|
||||
ROUTINE (LIT_MAGIC_STRING_SET_UINT16_UL, ECMA_DATAVIEW_PROTOTYPE_SET_UINT16, 2, 1)
|
||||
ROUTINE (LIT_MAGIC_STRING_SET_UINT32_UL, ECMA_DATAVIEW_PROTOTYPE_SET_UINT32, 2, 1)
|
||||
ROUTINE (LIT_MAGIC_STRING_SET_INT8_UL, ECMA_DATAVIEW_PROTOTYPE_SET_INT8, 1, 2)
|
||||
ROUTINE (LIT_MAGIC_STRING_SET_INT16_UL, ECMA_DATAVIEW_PROTOTYPE_SET_INT16, 2, 2)
|
||||
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)
|
||||
|
||||
/* ECMA-262 v6, 24.2.4.1 */
|
||||
ACCESSOR_READ_ONLY (LIT_MAGIC_STRING_BUFFER,
|
||||
|
||||
@ -26,7 +26,7 @@
|
||||
|
||||
/* ECMA-262 v6, 23.1.2 */
|
||||
NUMBER_VALUE (LIT_MAGIC_STRING_LENGTH,
|
||||
3,
|
||||
1,
|
||||
ECMA_PROPERTY_FLAG_CONFIGURABLE)
|
||||
|
||||
/* ECMA-262 v6, 23.1 */
|
||||
|
||||
@ -1011,6 +1011,46 @@ ecma_op_to_length (ecma_value_t value, /**< ecma value */
|
||||
} /* ecma_op_to_length */
|
||||
|
||||
#if ENABLED (JERRY_ESNEXT)
|
||||
/**
|
||||
* ToIndex operation.
|
||||
*
|
||||
* See also:
|
||||
* ECMA-262 v11, 7.1.22
|
||||
*
|
||||
* @return ECMA_VALUE_EMPTY if successful
|
||||
* conversion error otherwise
|
||||
*/
|
||||
ecma_value_t
|
||||
ecma_op_to_index (ecma_value_t value, /**< ecma value */
|
||||
ecma_number_t *index) /**< [out] ecma number */
|
||||
{
|
||||
/* 1. */
|
||||
if (ecma_is_value_undefined (value))
|
||||
{
|
||||
*index = 0;
|
||||
return ECMA_VALUE_EMPTY;
|
||||
}
|
||||
|
||||
/* 2.a */
|
||||
ecma_number_t integer_index;
|
||||
ecma_value_t index_value = ecma_op_to_integer (value, &integer_index);
|
||||
|
||||
if (ECMA_IS_VALUE_ERROR (index_value))
|
||||
{
|
||||
return index_value;
|
||||
}
|
||||
|
||||
/* 2.b - 2.d */
|
||||
if (integer_index < 0.0f || integer_index > ECMA_NUMBER_MAX_SAFE_INTEGER)
|
||||
{
|
||||
return ecma_raise_range_error (ECMA_ERR_MSG ("Invalid or out-of-range index"));
|
||||
}
|
||||
|
||||
/* 3. */
|
||||
*index = integer_index;
|
||||
return ECMA_VALUE_EMPTY;
|
||||
} /* ecma_op_to_index */
|
||||
|
||||
/**
|
||||
* CreateListFromArrayLike operation.
|
||||
* Different types are not handled yet.
|
||||
|
||||
@ -62,6 +62,7 @@ bool ecma_op_is_integer (ecma_number_t value);
|
||||
ecma_value_t ecma_op_to_integer (ecma_value_t value, ecma_number_t *number_p);
|
||||
ecma_value_t ecma_op_to_length (ecma_value_t value, ecma_length_t *length);
|
||||
#if ENABLED (JERRY_ESNEXT)
|
||||
ecma_value_t ecma_op_to_index (ecma_value_t value, ecma_number_t *index);
|
||||
ecma_collection_t *ecma_op_create_list_from_array_like (ecma_value_t arr, bool prop_names_only);
|
||||
#endif /* ENABLED (JERRY_ESNEXT) */
|
||||
|
||||
|
||||
@ -37,7 +37,7 @@
|
||||
* Handle calling [[Construct]] of built-in DataView like objects
|
||||
*
|
||||
* See also:
|
||||
* ECMA-262 v6, 24.2.2.1
|
||||
* ECMA-262 v11, 24.3.2.1
|
||||
*
|
||||
* @return created DataView object as an ecma-value - if success
|
||||
* raised error - otherwise
|
||||
@ -59,81 +59,67 @@ ecma_op_dataview_create (const ecma_value_t *arguments_list_p, /**< arguments li
|
||||
|
||||
ecma_object_t *buffer_p = ecma_get_object_from_value (buffer);
|
||||
|
||||
/* 3. */
|
||||
if (!ecma_object_class_is (buffer_p, LIT_MAGIC_STRING_ARRAY_BUFFER_UL))
|
||||
{
|
||||
return ecma_raise_type_error (ECMA_ERR_MSG ("Argument buffer is not an arraybuffer."));
|
||||
}
|
||||
|
||||
/* 4 - 6. */
|
||||
uint32_t offset = 0;
|
||||
/* 3. */
|
||||
ecma_number_t offset = 0;
|
||||
|
||||
if (arguments_list_len > 1)
|
||||
{
|
||||
ecma_number_t number_offset, offset_num;
|
||||
if (ECMA_IS_VALUE_ERROR (ecma_op_to_number (arguments_list_p[1], &number_offset)))
|
||||
ecma_value_t offset_value = ecma_op_to_index (arguments_list_p[1], &offset);
|
||||
if (ECMA_IS_VALUE_ERROR (offset_value))
|
||||
{
|
||||
return ECMA_VALUE_ERROR;
|
||||
return offset_value;
|
||||
}
|
||||
if (ECMA_IS_VALUE_ERROR (ecma_op_to_integer (arguments_list_p[1], &offset_num)))
|
||||
{
|
||||
return ECMA_VALUE_ERROR;
|
||||
}
|
||||
|
||||
/* 7. */
|
||||
if (number_offset != offset_num || offset_num < 0)
|
||||
{
|
||||
return ecma_raise_range_error (ECMA_ERR_MSG ("Start offset is outside the bounds of the buffer."));
|
||||
}
|
||||
|
||||
offset = (uint32_t) offset_num;
|
||||
}
|
||||
|
||||
/* 8. */
|
||||
/* 4. */
|
||||
if (ecma_arraybuffer_is_detached (buffer_p))
|
||||
{
|
||||
return ecma_raise_type_error (ECMA_ERR_MSG ("ArrayBuffer has been detached."));
|
||||
}
|
||||
|
||||
/* 9. */
|
||||
uint32_t buffer_byte_length = ecma_arraybuffer_get_length (buffer_p);
|
||||
/* 5. */
|
||||
ecma_number_t buffer_byte_length = ecma_arraybuffer_get_length (buffer_p);
|
||||
|
||||
/* 10. */
|
||||
/* 6. */
|
||||
if (offset > buffer_byte_length)
|
||||
{
|
||||
return ecma_raise_range_error (ECMA_ERR_MSG ("Start offset is outside the bounds of the buffer."));
|
||||
}
|
||||
|
||||
/* 11 - 12. */
|
||||
/* 7. */
|
||||
uint32_t view_byte_length;
|
||||
if (arguments_list_len > 2 && !ecma_is_value_undefined (arguments_list_p[2]))
|
||||
{
|
||||
/* 12.a */
|
||||
ecma_length_t view_byte_to_length;
|
||||
ecma_value_t byte_length_value = ecma_op_to_length (arguments_list_p[2], &view_byte_to_length);
|
||||
/* 8.a */
|
||||
ecma_number_t byte_length_to_index;
|
||||
ecma_value_t byte_length_value = ecma_op_to_index (arguments_list_p[2], &byte_length_to_index);
|
||||
|
||||
/* 12.b */
|
||||
if (ECMA_IS_VALUE_ERROR (byte_length_value))
|
||||
{
|
||||
return byte_length_value;
|
||||
}
|
||||
|
||||
/* 12.c */
|
||||
if ((ecma_number_t) offset + (ecma_number_t) view_byte_to_length > buffer_byte_length)
|
||||
/* 8.b */
|
||||
if (offset + byte_length_to_index > buffer_byte_length)
|
||||
{
|
||||
return ecma_raise_range_error (ECMA_ERR_MSG ("Start offset is outside the bounds of the buffer."));
|
||||
}
|
||||
|
||||
JERRY_ASSERT (view_byte_to_length <= UINT32_MAX);
|
||||
view_byte_length = (uint32_t) view_byte_to_length;
|
||||
JERRY_ASSERT (byte_length_to_index <= UINT32_MAX);
|
||||
view_byte_length = (uint32_t) byte_length_to_index;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* 11.a */
|
||||
/* 7.a */
|
||||
view_byte_length = (uint32_t) (buffer_byte_length - offset);
|
||||
}
|
||||
|
||||
/* 13. */
|
||||
/* 9. */
|
||||
ecma_object_t *prototype_obj_p = ecma_op_get_prototype_from_constructor (JERRY_CONTEXT (current_new_target),
|
||||
ECMA_BUILTIN_ID_DATAVIEW_PROTOTYPE);
|
||||
if (JERRY_UNLIKELY (prototype_obj_p == NULL))
|
||||
@ -141,17 +127,28 @@ ecma_op_dataview_create (const ecma_value_t *arguments_list_p, /**< arguments li
|
||||
return ECMA_VALUE_ERROR;
|
||||
}
|
||||
|
||||
/* 10. */
|
||||
if (ecma_arraybuffer_is_detached (buffer_p))
|
||||
{
|
||||
ecma_deref_object (prototype_obj_p);
|
||||
return ecma_raise_type_error (ECMA_ERR_MSG ("ArrayBuffer has been detached."));
|
||||
}
|
||||
|
||||
/* 9. */
|
||||
/* It must happen after 10., because uninitialized object can't be destroyed properly. */
|
||||
ecma_object_t *object_p = ecma_create_object (prototype_obj_p,
|
||||
sizeof (ecma_dataview_object_t),
|
||||
ECMA_OBJECT_TYPE_CLASS);
|
||||
|
||||
ecma_deref_object (prototype_obj_p);
|
||||
|
||||
/* 11 - 14. */
|
||||
ecma_dataview_object_t *dataview_obj_p = (ecma_dataview_object_t *) object_p;
|
||||
dataview_obj_p->header.u.class_prop.class_id = LIT_MAGIC_STRING_DATAVIEW_UL;
|
||||
dataview_obj_p->header.u.class_prop.u.length = view_byte_length;
|
||||
dataview_obj_p->buffer_p = buffer_p;
|
||||
dataview_obj_p->byte_offset = (uint32_t) offset;
|
||||
|
||||
ecma_deref_object (prototype_obj_p);
|
||||
return ecma_make_object_value (object_p);
|
||||
} /* ecma_op_dataview_create */
|
||||
|
||||
@ -234,8 +231,8 @@ ecma_dataview_swap_order (bool system_is_little_endian, /**< true - if the syste
|
||||
* GetViewValue and SetViewValue abstact operation
|
||||
*
|
||||
* See also:
|
||||
* ECMA-262 v6, 24.2.1.1
|
||||
* ECMA-262 v6, 24.2.1.2
|
||||
* ECMA-262 v11, 24.3.1.1
|
||||
* ECMA-262 v11, 24.3.1.2
|
||||
*
|
||||
* @return ecma value
|
||||
*/
|
||||
@ -255,57 +252,64 @@ ecma_op_dataview_get_set_view_value (ecma_value_t view, /**< the operation's 'vi
|
||||
return ECMA_VALUE_ERROR;
|
||||
}
|
||||
|
||||
/* 3 - 5. */
|
||||
ecma_number_t number_index;
|
||||
ecma_value_t number_index_value = ecma_op_to_integer (request_index, &number_index);
|
||||
ecma_object_t *buffer_p = view_p->buffer_p;
|
||||
JERRY_ASSERT (ecma_object_class_is (buffer_p, LIT_MAGIC_STRING_ARRAY_BUFFER_UL));
|
||||
|
||||
/* 3. */
|
||||
ecma_number_t get_index;
|
||||
ecma_value_t number_index_value = ecma_op_to_index (request_index, &get_index);
|
||||
|
||||
if (ECMA_IS_VALUE_ERROR (number_index_value))
|
||||
{
|
||||
return number_index_value;
|
||||
}
|
||||
|
||||
int32_t get_index = ecma_number_to_int32 (number_index);
|
||||
/* TODO: Add BigInt support for SetViewValue 4 - 5. */
|
||||
|
||||
/* 6. */
|
||||
if (number_index != get_index || get_index < 0)
|
||||
/* SetViewValue 5. */
|
||||
ecma_number_t value_to_set_number = 0;
|
||||
if (!ecma_is_value_empty (value_to_set))
|
||||
{
|
||||
return ecma_raise_range_error (ECMA_ERR_MSG ("Start offset is outside the bounds of the buffer."));
|
||||
ecma_value_t value;
|
||||
value = ecma_op_to_number (value_to_set, &value_to_set_number);
|
||||
|
||||
if (ECMA_IS_VALUE_ERROR (value))
|
||||
{
|
||||
return value;
|
||||
}
|
||||
}
|
||||
|
||||
/* 7. */
|
||||
/* GetViewValue 4., SetViewValue 6. */
|
||||
bool is_little_endian = ecma_op_to_boolean (is_little_endian_value);
|
||||
|
||||
/* 8. TODO: Throw TypeError, when Detached ArrayBuffer will be supported. */
|
||||
|
||||
/* 9. */
|
||||
ecma_object_t *buffer_p = view_p->buffer_p;
|
||||
JERRY_ASSERT (ecma_object_class_is (buffer_p, LIT_MAGIC_STRING_ARRAY_BUFFER_UL));
|
||||
/* GetViewValue 5 - 6., SetViewValue 7 - 8. */
|
||||
if (ecma_arraybuffer_is_detached (buffer_p))
|
||||
{
|
||||
return ecma_raise_type_error (ECMA_ERR_MSG ("ArrayBuffer has been detached."));
|
||||
}
|
||||
|
||||
/* 10. */
|
||||
/* GetViewValue 7., SetViewValue 9. */
|
||||
uint32_t view_offset = view_p->byte_offset;
|
||||
|
||||
/* 11. */
|
||||
/* GetViewValue 8., SetViewValue 10. */
|
||||
uint32_t view_size = view_p->header.u.class_prop.u.length;
|
||||
|
||||
/* 12. */
|
||||
/* GetViewValue 9., SetViewValue 11. */
|
||||
uint8_t element_size = (uint8_t) (1 << (ecma_typedarray_helper_get_shift_size (id)));
|
||||
|
||||
/* 13. */
|
||||
if ((uint32_t) get_index + element_size > view_size)
|
||||
/* GetViewValue 10., SetViewValue 12. */
|
||||
if (get_index + element_size > (ecma_number_t) view_size)
|
||||
{
|
||||
return ecma_raise_range_error (ECMA_ERR_MSG ("Start offset is outside the bounds of the buffer."));
|
||||
}
|
||||
|
||||
/* 14. */
|
||||
/* GetViewValue 11., SetViewValue 13. */
|
||||
uint32_t buffer_index = (uint32_t) get_index + view_offset;
|
||||
lit_utf8_byte_t *block_p = ecma_arraybuffer_get_buffer (buffer_p) + buffer_index;
|
||||
|
||||
bool system_is_little_endian = ecma_dataview_check_little_endian ();
|
||||
|
||||
/* GetViewValue 12. */
|
||||
if (ecma_is_value_empty (value_to_set))
|
||||
{
|
||||
JERRY_VLA (lit_utf8_byte_t, swap_block_p, element_size);
|
||||
@ -314,18 +318,18 @@ ecma_op_dataview_get_set_view_value (ecma_value_t view, /**< the operation's 'vi
|
||||
return ecma_get_typedarray_element (swap_block_p, id);
|
||||
}
|
||||
|
||||
if (ecma_is_value_number (value_to_set))
|
||||
/* 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);
|
||||
|
||||
if (ECMA_IS_VALUE_ERROR (set_element))
|
||||
{
|
||||
ecma_value_t set_element = ecma_set_typedarray_element (block_p, value_to_set, id);
|
||||
|
||||
if (ECMA_IS_VALUE_ERROR (set_element))
|
||||
{
|
||||
return set_element;
|
||||
}
|
||||
|
||||
ecma_dataview_swap_order (system_is_little_endian, is_little_endian, element_size, block_p);
|
||||
return set_element;
|
||||
}
|
||||
|
||||
ecma_dataview_swap_order (system_is_little_endian, is_little_endian, element_size, block_p);
|
||||
|
||||
return ECMA_VALUE_UNDEFINED;
|
||||
} /* ecma_op_dataview_get_set_view_value */
|
||||
|
||||
|
||||
@ -13,7 +13,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/* ES2015 24.2.2.1.1 */
|
||||
/* ES11 24.3.2.1.1 */
|
||||
try {
|
||||
DataView ();
|
||||
assert (false);
|
||||
@ -21,7 +21,7 @@ try {
|
||||
assert (e instanceof TypeError);
|
||||
}
|
||||
|
||||
/* ES2015 24.2.2.1.2 */
|
||||
/* ES11 24.3.2.1.2 (not object) */
|
||||
try {
|
||||
new DataView (5);
|
||||
assert (false);
|
||||
@ -29,7 +29,7 @@ try {
|
||||
assert (e instanceof TypeError);
|
||||
}
|
||||
|
||||
/* ES2015 24.2.2.1.3 */
|
||||
/* ES11 24.3.2.1.2 (no [[ArrayBufferData]] internal slot) */
|
||||
try {
|
||||
new DataView ({});
|
||||
assert (false);
|
||||
@ -39,7 +39,23 @@ try {
|
||||
|
||||
var buffer = new ArrayBuffer (16);
|
||||
|
||||
/* ES2015 24.2.2.1.6 */
|
||||
/* ES11 24.3.2.1.3 (offset < 0)*/
|
||||
try {
|
||||
new DataView (buffer, -1);
|
||||
assert (false);
|
||||
} catch (e) {
|
||||
assert (e instanceof RangeError);
|
||||
}
|
||||
|
||||
/* ES11 24.3.2.1.3 (offset > 2^53) */
|
||||
try {
|
||||
new DataView (buffer, Number.MAX_SAFE_INTEGER + 1);
|
||||
assert (false);
|
||||
} catch (e) {
|
||||
assert (e instanceof RangeError);
|
||||
}
|
||||
|
||||
/* ES11 24.3.2.1.3 (ToInteger throws ReferenceError) */
|
||||
try {
|
||||
new DataView (buffer, { toString: function () { throw new ReferenceError ('foo') } });
|
||||
assert (false);
|
||||
@ -48,24 +64,8 @@ try {
|
||||
assert (e.message === 'foo');
|
||||
}
|
||||
|
||||
/* ES2015 24.2.2.1.7 (numberOffset != offset)*/
|
||||
try {
|
||||
new DataView (buffer, 1.5);
|
||||
assert (false);
|
||||
} catch (e) {
|
||||
assert (e instanceof RangeError);
|
||||
}
|
||||
|
||||
|
||||
/* ES2015 24.2.2.1.7 (offset < 0) */
|
||||
try {
|
||||
new DataView (buffer, -1);
|
||||
assert (false);
|
||||
} catch (e) {
|
||||
assert (e instanceof RangeError);
|
||||
}
|
||||
|
||||
/* ES2015 24.2.2.1.10 */
|
||||
/* ES11 24.3.2.1.6 */
|
||||
try {
|
||||
new DataView (buffer, 17);
|
||||
assert (false);
|
||||
@ -73,7 +73,7 @@ try {
|
||||
assert (e instanceof RangeError);
|
||||
}
|
||||
|
||||
/* ES2015 24.2.2.1.12.b */
|
||||
/* ES11 24.3.2.1.8.a */
|
||||
try {
|
||||
new DataView (buffer, 0, { toString: function () { throw new ReferenceError ('bar') } });
|
||||
assert (false);
|
||||
@ -82,7 +82,7 @@ try {
|
||||
assert (e.message === 'bar');
|
||||
}
|
||||
|
||||
/* ES2015 24.2.2.1.12.b */
|
||||
/* ES11 24.3.2.1.8.a */
|
||||
try {
|
||||
new DataView (buffer, 0, Infinity);
|
||||
assert (false);
|
||||
@ -90,7 +90,7 @@ try {
|
||||
assert (e instanceof RangeError);
|
||||
}
|
||||
|
||||
/* ES2015 24.2.2.1.12.c */
|
||||
/* ES11 24.3.2.1.8.b */
|
||||
try {
|
||||
new DataView (buffer, 4, 13);
|
||||
assert (false);
|
||||
@ -98,11 +98,10 @@ try {
|
||||
assert (e instanceof RangeError);
|
||||
}
|
||||
|
||||
/* Tests accessors: ES2015 24.2.2.1 - 24.2.2.3 */
|
||||
var accessorList = ['buffer', 'byteOffset', 'byteLength'];
|
||||
/* Tests accessors: ES11 24.3.4.{1, 2, 3}.2 */
|
||||
var accessorList = ['buffer', 'byteLength', 'byteOffset'];
|
||||
|
||||
accessorList.forEach (function (prop) {
|
||||
/* ES2015 24.2.4.{1, 2, 3}.{2, 3} */
|
||||
try {
|
||||
var obj = {};
|
||||
Object.setPrototypeOf (obj, DataView.prototype);
|
||||
@ -136,7 +135,7 @@ var setters = ['setInt8', 'setUint8', 'setInt16', 'setUint16', 'setInt32', 'setU
|
||||
var gettersSetters = getters.concat (setters);
|
||||
|
||||
gettersSetters.forEach (function (propName) {
|
||||
/* ES2015 24.2.1.{1, 2}.1 */
|
||||
/* ES11 24.3.1.{1, 2}.1 */
|
||||
var routine = DataView.prototype[propName];
|
||||
try {
|
||||
DataView.prototype[propName].call (5);
|
||||
@ -145,7 +144,7 @@ gettersSetters.forEach (function (propName) {
|
||||
assert (e instanceof TypeError);
|
||||
}
|
||||
|
||||
/* ES2015 24.2.1.{1, 2}.2 */
|
||||
/* ES11 24.3.1.{1, 2}.1 */
|
||||
try {
|
||||
DataView.prototype[propName].call ({});
|
||||
assert (false);
|
||||
@ -153,7 +152,7 @@ gettersSetters.forEach (function (propName) {
|
||||
assert (e instanceof TypeError);
|
||||
}
|
||||
|
||||
/* ES2015 24.2.1.{1, 2}.5 */
|
||||
/* ES11 24.3.1.{1, 2}.3 (ToInteger throws ReferenceError) */
|
||||
try {
|
||||
var buffer = new ArrayBuffer (16);
|
||||
var view = new DataView (buffer)
|
||||
@ -167,14 +166,7 @@ gettersSetters.forEach (function (propName) {
|
||||
var buffer = new ArrayBuffer (16);
|
||||
var view = new DataView (buffer)
|
||||
|
||||
/* ES2015 24.2.1.{1, 2}.6 (numberIndex != getIndex) */
|
||||
if (propName.indexOf("get") !== -1) {
|
||||
assert(view[propName] (1.5) === 0);
|
||||
} else {
|
||||
assert(view[propName] (1.5) === undefined);
|
||||
}
|
||||
|
||||
/* ES2015 24.2.1.{1, 2}.6 (getIndex < 0) */
|
||||
/* ES11 24.3.1.{1, 2}.3 (getIndex < 0) */
|
||||
try {
|
||||
view[propName] (-1);
|
||||
assert (false);
|
||||
@ -182,7 +174,7 @@ gettersSetters.forEach (function (propName) {
|
||||
assert (e instanceof RangeError);
|
||||
}
|
||||
|
||||
/* ES2015 24.2.1.{1, 2}.13 */
|
||||
/* ES11 24.3.1.1.10, 24.3.1.2.12 */
|
||||
try {
|
||||
view[propName] (20);
|
||||
assert (false);
|
||||
@ -254,26 +246,6 @@ var dtviewF = new DataView (arrayBufferOk, null, 1);
|
||||
assert (dtviewF.byteLength === 1);
|
||||
assert (dtviewF.byteOffset === 0);
|
||||
|
||||
/* In ES6 the second argument is processed with ToNumber and ToInteger calls.
|
||||
* A RangeError is reported if the values returned by the operations are different.
|
||||
* The "undefined" value converted with ToNumber will return "NaN" and the ToInteger
|
||||
* operation will return "0". Thus creating a RangeError.
|
||||
*
|
||||
* After ES6 the second argument should be converted via ToIndex.
|
||||
* Providing "undefined" value for the ToIndex operation will return "0".
|
||||
* Thus there is no error generated.
|
||||
*/
|
||||
try {
|
||||
var dtviewF = new DataView (arrayBufferOk, undefined, 1);
|
||||
|
||||
/* TODO: enable these tests after the DataView is updated for newer standard and
|
||||
* remove the try-catch.
|
||||
*/
|
||||
/*
|
||||
* assert(dtviewF.byteLength === 1);
|
||||
* assert(dtviewF.byteOffset === 0);
|
||||
*/
|
||||
assert (false);
|
||||
} catch (ex) {
|
||||
assert (ex instanceof RangeError);
|
||||
}
|
||||
var dtviewF = new DataView (arrayBufferOk, undefined, 1);
|
||||
assert(dtviewF.byteLength === 1);
|
||||
assert(dtviewF.byteOffset === 0);
|
||||
|
||||
@ -34,9 +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/excessive-byteoffset-throws.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/length.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/negative-bytelength-throws.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>
|
||||
@ -75,57 +72,6 @@
|
||||
<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/DataView/prototype/setFloat32/length.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setFloat32/no-value-arg.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setFloat32/range-check-after-value-conversion.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setFloat32/return-abrupt-from-tonumber-value-symbol.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setFloat32/return-abrupt-from-tonumber-value.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setFloat32/set-values-return-undefined.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setFloat32/toindex-byteoffset.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setFloat64/length.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setFloat64/no-value-arg.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setFloat64/range-check-after-value-conversion.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setFloat64/return-abrupt-from-tonumber-value-symbol.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setFloat64/return-abrupt-from-tonumber-value.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setFloat64/set-values-return-undefined.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setFloat64/toindex-byteoffset.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setInt16/length.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setInt16/no-value-arg.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setInt16/range-check-after-value-conversion.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setInt16/return-abrupt-from-tonumber-value-symbol.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setInt16/return-abrupt-from-tonumber-value.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setInt16/toindex-byteoffset.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setInt32/length.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setInt32/no-value-arg.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setInt32/range-check-after-value-conversion.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setInt32/return-abrupt-from-tonumber-value-symbol.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setInt32/return-abrupt-from-tonumber-value.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setInt32/toindex-byteoffset.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setInt8/length.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setInt8/no-value-arg.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setInt8/range-check-after-value-conversion.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setInt8/return-abrupt-from-tonumber-value-symbol.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setInt8/return-abrupt-from-tonumber-value.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setInt8/toindex-byteoffset.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setUint16/length.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setUint16/no-value-arg.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setUint16/range-check-after-value-conversion.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setUint16/return-abrupt-from-tonumber-value-symbol.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setUint16/return-abrupt-from-tonumber-value.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setUint16/toindex-byteoffset.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setUint32/length.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setUint32/no-value-arg.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setUint32/range-check-after-value-conversion.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setUint32/return-abrupt-from-tonumber-value-symbol.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setUint32/return-abrupt-from-tonumber-value.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setUint32/toindex-byteoffset.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setUint8/length.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setUint8/no-value-arg.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setUint8/range-check-after-value-conversion.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setUint8/return-abrupt-from-tonumber-value-symbol.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setUint8/return-abrupt-from-tonumber-value.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/prototype/setUint8/toindex-byteoffset.js"><reason></reason></test>
|
||||
<test id="built-ins/DataView/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