Support BigInt64/BigUint64 typedarray creation from API (#4170)

JerryScript-DCO-1.0-Signed-off-by: Robert Fancsik frobert@inf.u-szeged.hu
This commit is contained in:
Robert Fancsik
2020-08-28 13:14:40 +02:00
committed by GitHub
parent 9589771f7a
commit cd1c06510e
4 changed files with 92 additions and 13 deletions
+2
View File
@@ -700,6 +700,8 @@ Possible values:
- JERRY_TYPEDARRAY_INT32 - represents the Int32Array TypedArray
- JERRY_TYPEDARRAY_FLOAT32 - represents the Float32Array TypedArray
- JERRY_TYPEDARRAY_FLOAT64 - represents the Float64Array TypedArray
- JERRY_TYPEDARRAY_BIGINT64 - represents the BigInt64Array TypedArray
- JERRY_TYPEDARRAY_BIGUINT64 - represents the BigUint64Array TypedArray
- JERRY_TYPEDARRAY_INVALID - represents an invalid TypedArray
API functions can return the `JERRY_TYPEDARRAY_INVALID` value if the
+4 -1
View File
@@ -4551,7 +4551,10 @@ static jerry_typedarray_mapping_t jerry_typedarray_mappings[] =
#if ENABLED (JERRY_NUMBER_TYPE_FLOAT64)
TYPEDARRAY_ENTRY (FLOAT64, FLOAT64, 3),
#endif /* ENABLED (JERRY_NUMBER_TYPE_FLOAT64) */
#if ENABLED (JERRY_BUILTIN_BIGINT)
TYPEDARRAY_ENTRY (BIGINT64, BIGINT64, 3),
TYPEDARRAY_ENTRY (BIGUINT64, BIGUINT64, 3),
#endif /* ENABLED (JERRY_BUILTIN_BIGINT) */
#undef TYPEDARRAY_ENTRY
};
+2
View File
@@ -739,6 +739,8 @@ typedef enum
JERRY_TYPEDARRAY_INT32,
JERRY_TYPEDARRAY_FLOAT32,
JERRY_TYPEDARRAY_FLOAT64,
JERRY_TYPEDARRAY_BIGINT64,
JERRY_TYPEDARRAY_BIGUINT64,
} jerry_typedarray_type_t;
/**
+84 -12
View File
@@ -166,14 +166,16 @@ void test_buffer_value (uint64_t value, /**< value to test for */
switch (typedarray_type)
{
case JERRY_TYPEDARRAY_UINT8: TEST_VALUE_AT (uint8_t, buffer, offset, value); break;
case JERRY_TYPEDARRAY_INT8: TEST_VALUE_AT (int8_t, buffer, offset, value); break;
case JERRY_TYPEDARRAY_UINT16: TEST_VALUE_AT (uint16_t, buffer, offset, value); break;
case JERRY_TYPEDARRAY_INT16: TEST_VALUE_AT (int16_t, buffer, offset, value); break;
case JERRY_TYPEDARRAY_UINT32: TEST_VALUE_AT (uint32_t, buffer, offset, value); break;
case JERRY_TYPEDARRAY_INT32: TEST_VALUE_AT (int32_t, buffer, offset, value); break;
case JERRY_TYPEDARRAY_FLOAT32: TEST_VALUE_AT (float, buffer, offset, value); break;
case JERRY_TYPEDARRAY_FLOAT64: TEST_VALUE_AT (double, buffer, offset, value); break;
case JERRY_TYPEDARRAY_UINT8: TEST_VALUE_AT (uint8_t, buffer, offset, value); break;
case JERRY_TYPEDARRAY_INT8: TEST_VALUE_AT (int8_t, buffer, offset, value); break;
case JERRY_TYPEDARRAY_UINT16: TEST_VALUE_AT (uint16_t, buffer, offset, value); break;
case JERRY_TYPEDARRAY_INT16: TEST_VALUE_AT (int16_t, buffer, offset, value); break;
case JERRY_TYPEDARRAY_UINT32: TEST_VALUE_AT (uint32_t, buffer, offset, value); break;
case JERRY_TYPEDARRAY_INT32: TEST_VALUE_AT (int32_t, buffer, offset, value); break;
case JERRY_TYPEDARRAY_FLOAT32: TEST_VALUE_AT (float, buffer, offset, value); break;
case JERRY_TYPEDARRAY_FLOAT64: TEST_VALUE_AT (double, buffer, offset, value); break;
case JERRY_TYPEDARRAY_BIGINT64: TEST_VALUE_AT (int64_t, buffer, offset, value); break;
case JERRY_TYPEDARRAY_BIGUINT64: TEST_VALUE_AT (uint64_t, buffer, offset, value); break;
case JERRY_TYPEDARRAY_UINT8CLAMPED:
{
@@ -246,18 +248,34 @@ test_typedarray_complex_creation (test_entry_t test_entries[], /**< test cases *
register_js_value ("array", typedarray);
const jerry_char_t eval_src[] = TEST_STRING_LITERAL (
const jerry_char_t test_exptected_src[] = TEST_STRING_LITERAL (
"assert (array.length == expected_length,"
" 'expected length: ' + expected_length + ' got: ' + array.length);"
"assert (array.byteOffset == expected_offset);"
"array[0] = 0x11223344;"
);
jerry_value_t result = jerry_eval (eval_src,
sizeof (eval_src) - 1,
jerry_value_t result = jerry_eval (test_exptected_src,
sizeof (test_exptected_src) - 1,
JERRY_PARSE_STRICT_MODE);
TEST_ASSERT (!jerry_value_is_error (result));
jerry_release_value (result);
const jerry_char_t set_element_src[] = TEST_STRING_LITERAL (
"array[0] = 0x11223344n"
);
/* crop the last 'n' character */
size_t src_length = sizeof (set_element_src) - 2;
if (test_entries[i].typedarray_type >= JERRY_TYPEDARRAY_BIGINT64)
{
/* use the last 'n' character */
src_length++;
}
result = jerry_eval (set_element_src, src_length, JERRY_PARSE_STRICT_MODE);
TEST_ASSERT (!jerry_value_is_error (result));
jerry_release_value (result);
{
jerry_length_t byte_length = 0;
jerry_length_t byte_offset = 0;
@@ -293,6 +311,8 @@ static void test_property_by_index (test_entry_t test_entries[])
int test_int_numbers[5] = {-5, -70, 13, 0, 56};
double test_double_numbers[5] = {-83.153, -35.15, 0, 13.1, 89.8975};
uint8_t test_uint_numbers[5] = {83, 15, 36, 0, 43};
uint64_t test_uint64_numbers[5] = {83, 0, 1, UINT32_MAX, UINT64_MAX};
int64_t test_int64_numbers[5] = {INT64_MAX, INT64_MIN, 0, INT32_MAX, INT32_MIN};
for (uint32_t i = 0; test_entries[i].constructor_name != NULL; i++)
{
@@ -367,6 +387,54 @@ static void test_property_by_index (test_entry_t test_entries[])
}
break;
}
case JERRY_TYPEDARRAY_BIGINT64:
{
for (uint8_t j = 0; j < test_numbers_length; j++)
{
test_number = jerry_create_bigint ((uint64_t *) &test_int64_numbers[j], 1, true);
TEST_ASSERT (!jerry_delete_property_by_index (typedarray, j));
set_result = jerry_set_property_by_index (typedarray, j, test_number);
get_result = jerry_get_property_by_index (typedarray, j);
TEST_ASSERT (jerry_value_is_boolean (set_result));
TEST_ASSERT (jerry_get_boolean_value (set_result));
TEST_ASSERT (!jerry_delete_property_by_index (typedarray, j));
int64_t get_number;
bool sign;
jerry_get_bigint_digits (get_result, (uint64_t *) &get_number, 1, &sign);
TEST_ASSERT (sign ? get_number : -get_number == test_int64_numbers[j]);
jerry_release_value (test_number);
jerry_release_value (set_result);
jerry_release_value (get_result);
}
break;
}
case JERRY_TYPEDARRAY_BIGUINT64:
{
for (uint8_t j = 0; j < test_numbers_length; j++)
{
test_number = jerry_create_bigint (&test_uint64_numbers[j], 1, false);
TEST_ASSERT (!jerry_delete_property_by_index (typedarray, j));
set_result = jerry_set_property_by_index (typedarray, j, test_number);
get_result = jerry_get_property_by_index (typedarray, j);
TEST_ASSERT (jerry_value_is_boolean (set_result));
TEST_ASSERT (jerry_get_boolean_value (set_result));
TEST_ASSERT (!jerry_delete_property_by_index (typedarray, j));
uint64_t get_number;
bool sign;
jerry_get_bigint_digits (get_result, &get_number, 1, &sign);
TEST_ASSERT (get_number == test_uint64_numbers[j]);
jerry_release_value (test_number);
jerry_release_value (set_result);
jerry_release_value (get_result);
}
break;
}
default:
{
for (uint8_t j = 0; j < test_numbers_length; j++)
@@ -414,6 +482,8 @@ test_detached_arraybuffer (void)
JERRY_TYPEDARRAY_INT32,
JERRY_TYPEDARRAY_FLOAT32,
JERRY_TYPEDARRAY_FLOAT64,
JERRY_TYPEDARRAY_BIGINT64,
JERRY_TYPEDARRAY_BIGUINT64,
};
/* Creating an TypedArray for a detached array buffer with a given length/offset is invalid */
@@ -507,6 +577,8 @@ main (void)
TEST_ENTRY (JERRY_TYPEDARRAY_FLOAT32, "Float32Array", 12, 4),
/* TODO: add check if the float64 is supported */
TEST_ENTRY (JERRY_TYPEDARRAY_FLOAT64, "Float64Array", 12, 8),
TEST_ENTRY (JERRY_TYPEDARRAY_BIGINT64, "BigInt64Array", 12, 8),
TEST_ENTRY (JERRY_TYPEDARRAY_BIGUINT64, "BigUint64Array", 12, 8),
TEST_ENTRY (JERRY_TYPEDARRAY_INVALID, NULL, 0, 0)
#undef TEST_ENTRY