Fix error type when creating TypedArray with detached ArrayBuffer (#3230)
Based on the ES2015 standard TypeError should be returned when a TypedArray is created for a detached ArrayBuffer. JerryScript-DCO-1.0-Signed-off-by: Dániel Vince vinced@inf.u-szeged.hu
This commit is contained in:
committed by
Dániel Bátyai
parent
48f34adea5
commit
9e83032ada
@@ -968,7 +968,7 @@ ecma_op_create_typedarray (const ecma_value_t *arguments_list_p, /**< the arg li
|
|||||||
}
|
}
|
||||||
else if (ecma_arraybuffer_is_detached (arraybuffer_p))
|
else if (ecma_arraybuffer_is_detached (arraybuffer_p))
|
||||||
{
|
{
|
||||||
ret = ecma_raise_range_error (ECMA_ERR_MSG ("Invalid detached ArrayBuffer."));
|
ret = ecma_raise_type_error (ECMA_ERR_MSG ("Invalid detached ArrayBuffer."));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -400,6 +400,81 @@ static void test_property_by_index (test_entry_t test_entries[])
|
|||||||
}
|
}
|
||||||
} /* test_property_by_index */
|
} /* test_property_by_index */
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_detached_arraybuffer (void)
|
||||||
|
{
|
||||||
|
static jerry_typedarray_type_t types[] =
|
||||||
|
{
|
||||||
|
JERRY_TYPEDARRAY_UINT8,
|
||||||
|
JERRY_TYPEDARRAY_UINT8CLAMPED,
|
||||||
|
JERRY_TYPEDARRAY_INT8,
|
||||||
|
JERRY_TYPEDARRAY_UINT16,
|
||||||
|
JERRY_TYPEDARRAY_INT16,
|
||||||
|
JERRY_TYPEDARRAY_UINT32,
|
||||||
|
JERRY_TYPEDARRAY_INT32,
|
||||||
|
JERRY_TYPEDARRAY_FLOAT32,
|
||||||
|
JERRY_TYPEDARRAY_FLOAT64,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Creating an TypedArray for a detached array buffer with a given length/offset is invalid */
|
||||||
|
{
|
||||||
|
uint8_t buf[1];
|
||||||
|
const uint32_t length = 1;
|
||||||
|
jerry_value_t arraybuffer = jerry_create_arraybuffer_external (length, buf, NULL);
|
||||||
|
TEST_ASSERT (!jerry_value_is_error (arraybuffer));
|
||||||
|
TEST_ASSERT (jerry_value_is_arraybuffer (arraybuffer));
|
||||||
|
TEST_ASSERT (jerry_get_arraybuffer_byte_length (arraybuffer) == length);
|
||||||
|
|
||||||
|
jerry_value_t is_detachable = jerry_is_arraybuffer_detachable (arraybuffer);
|
||||||
|
TEST_ASSERT (!jerry_value_is_error (is_detachable));
|
||||||
|
TEST_ASSERT (jerry_get_boolean_value (is_detachable));
|
||||||
|
jerry_release_value (is_detachable);
|
||||||
|
|
||||||
|
jerry_value_t res = jerry_detach_arraybuffer (arraybuffer);
|
||||||
|
TEST_ASSERT (!jerry_value_is_error (res));
|
||||||
|
jerry_release_value (res);
|
||||||
|
|
||||||
|
for (size_t idx = 0; idx < (sizeof (types) / sizeof (types[0])); idx++)
|
||||||
|
{
|
||||||
|
jerry_value_t typedarray = jerry_create_typedarray_for_arraybuffer_sz (types[idx], arraybuffer, 0, 4);
|
||||||
|
TEST_ASSERT (jerry_value_is_error (typedarray));
|
||||||
|
TEST_ASSERT (jerry_get_error_type (typedarray) == JERRY_ERROR_TYPE);
|
||||||
|
jerry_release_value (typedarray);
|
||||||
|
}
|
||||||
|
|
||||||
|
jerry_release_value (arraybuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Creating an TypedArray for a detached array buffer without length/offset is valid */
|
||||||
|
{
|
||||||
|
uint8_t buf[1];
|
||||||
|
const uint32_t length = 1;
|
||||||
|
jerry_value_t arraybuffer = jerry_create_arraybuffer_external (length, buf, NULL);
|
||||||
|
TEST_ASSERT (!jerry_value_is_error (arraybuffer));
|
||||||
|
TEST_ASSERT (jerry_value_is_arraybuffer (arraybuffer));
|
||||||
|
TEST_ASSERT (jerry_get_arraybuffer_byte_length (arraybuffer) == length);
|
||||||
|
|
||||||
|
jerry_value_t is_detachable = jerry_is_arraybuffer_detachable (arraybuffer);
|
||||||
|
TEST_ASSERT (!jerry_value_is_error (is_detachable));
|
||||||
|
TEST_ASSERT (jerry_get_boolean_value (is_detachable));
|
||||||
|
jerry_release_value (is_detachable);
|
||||||
|
|
||||||
|
jerry_value_t res = jerry_detach_arraybuffer (arraybuffer);
|
||||||
|
TEST_ASSERT (!jerry_value_is_error (res));
|
||||||
|
jerry_release_value (res);
|
||||||
|
|
||||||
|
for (size_t idx = 0; idx < (sizeof (types) / sizeof (types[0])); idx++)
|
||||||
|
{
|
||||||
|
jerry_value_t typedarray = jerry_create_typedarray_for_arraybuffer (types[idx], arraybuffer);
|
||||||
|
TEST_ASSERT (jerry_value_is_error (typedarray));
|
||||||
|
TEST_ASSERT (jerry_get_error_type (typedarray) == JERRY_ERROR_TYPE);
|
||||||
|
jerry_release_value (typedarray);
|
||||||
|
}
|
||||||
|
|
||||||
|
jerry_release_value (arraybuffer);
|
||||||
|
}
|
||||||
|
} /* test_detached_arraybuffer */
|
||||||
|
|
||||||
int
|
int
|
||||||
main (void)
|
main (void)
|
||||||
{
|
{
|
||||||
@@ -571,6 +646,8 @@ main (void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test_detached_arraybuffer ();
|
||||||
|
|
||||||
jerry_cleanup ();
|
jerry_cleanup ();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user