Add container related API function (#4666)

The new function returns with an array, containing the
elements of the given Container or Container iterator.

JerryScript-DCO-1.0-Signed-off-by: Bela Toth tbela@inf.u-szeged.hu
This commit is contained in:
Tóth Béla
2021-06-16 07:41:13 +02:00
committed by GitHub
parent 5729dd8cec
commit 9471515dae
6 changed files with 321 additions and 1 deletions
+125
View File
@@ -34,6 +34,41 @@ static const jerry_object_native_info_t native_info =
.offset_of_references = 0,
};
static jerry_value_t
create_array_from_container_handler (const jerry_call_info_t *call_info_p,
const jerry_value_t args_p[],
const jerry_length_t args_count)
{
JERRY_UNUSED (call_info_p);
if (args_count < 2)
{
return jerry_create_undefined ();
}
bool is_key_value_pairs = false;
jerry_value_t result = jerry_get_array_from_container (args_p[0], &is_key_value_pairs);
TEST_ASSERT (is_key_value_pairs == jerry_get_boolean_value (args_p[1]));
return result;
} /* create_array_from_container_handler */
static void
run_eval (const char *source_p)
{
jerry_value_t result = jerry_eval ((const jerry_char_t *) source_p, strlen (source_p), 0);
TEST_ASSERT (!jerry_value_is_error (result));
jerry_release_value (result);
} /* run_eval */
static void
run_eval_error (const char *source_p)
{
jerry_value_t result = jerry_eval ((const jerry_char_t *) source_p, strlen (source_p), 0);
jerry_release_value (result);
} /* run_eval_error */
int
main (void)
{
@@ -60,6 +95,15 @@ main (void)
jerry_value_t global_weakmap = jerry_get_property (global, weakmap_str);
jerry_value_t global_weakset = jerry_get_property (global, weakset_str);
jerry_value_t function = jerry_create_external_function (create_array_from_container_handler);
jerry_value_t name = jerry_create_string ((const jerry_char_t *) "create_array_from_container");
jerry_value_t res = jerry_set_property (global, name, function);
TEST_ASSERT (!jerry_value_is_error (res));
jerry_release_value (res);
jerry_release_value (name);
jerry_release_value (function);
jerry_release_value (global);
jerry_release_value (map_str);
@@ -122,6 +166,87 @@ main (void)
jerry_gc (JERRY_GC_PRESSURE_LOW);
TEST_ASSERT (global_counter == 1);
run_eval ("function assert(v) {\n"
" if(v !== true)\n"
" throw 'Assertion failed!'\n"
"}");
run_eval ("function test_values(arr1, arr2) {\n"
" assert(Array.isArray(arr1));\n"
" assert(arr1.length == arr2.length);\n"
" for(let i = 0; i < arr1.length; i++) {\n"
" assert(arr1[i] === arr2[i]);\n"
" }\n"
"}\n");
run_eval ("var map = new Map();\n"
"map.set(1, 3.14);\n"
"map.set(2, true);\n"
"map.set(3, 'foo');\n"
"var set = new Set();\n"
"set.add(3.14);\n"
"set.add(true);\n"
"set.add('foo');\n"
"var obj = { x:3, y:'foo'};\n"
"var b_int = 1n;\n"
"var obj_bint_map = new Map();\n"
"obj_bint_map.set(1, obj);\n"
"obj_bint_map.set(2, b_int);\n");
run_eval ("var result = create_array_from_container(map, true);\n"
"test_values(result, [1, 3.14, 2, true, 3, 'foo']);");
run_eval ("var result = create_array_from_container(set, false);\n"
"test_values(result, [3.14, true, 'foo']);");
run_eval ("var result = create_array_from_container(map.entries(), true);\n"
"test_values(result, [1, 3.14, 2, true, 3, 'foo']);");
run_eval ("var result = create_array_from_container(map.keys(), false);\n"
"test_values(result, [1, 2, 3,]);");
run_eval ("var result = create_array_from_container(map.values(), false);\n"
"test_values(result, [3.14, true, 'foo']);");
run_eval ("var result = create_array_from_container(obj_bint_map, true)\n"
"test_values(result, [1, obj, 2, b_int]);");
run_eval ("var map = new Map();\n"
"map.set(1, 1);\n"
"var iter = map.entries();\n"
"iter.next();\n"
"var result = create_array_from_container(iter, true);\n"
"assert(Array.isArray(result));\n"
"assert(result.length == 0);");
run_eval ("var ws = new WeakSet();\n"
"var foo = {};\n"
"var bar = {};\n"
"ws.add(foo);\n"
"ws.add(bar);\n"
"var result = create_array_from_container(ws, false);\n"
"test_values(result, [foo, bar]);\n");
run_eval ("var ws = new WeakMap();\n"
"var foo = {};\n"
"var bar = {};\n"
"ws.set(foo, 37);\n"
"ws.set(bar, 'asd');\n"
"var result = create_array_from_container(ws, true);\n"
"test_values(result, [foo, 37, bar, 'asd']);\n");
run_eval_error ("var iter = null;\n"
"var result = create_array_from_container(iter, false);\n"
"assert(result instanceof Error);");
run_eval_error ("var iter = 3;\n"
"var result = create_array_from_container(iter, false);\n"
"assert(result instanceof Error);");
run_eval_error ("var iter = [3.14, true, 'foo'].entries();\n"
"var result = create_array_from_container(iter, false);\n"
"assert(result instanceof Error);");
jerry_cleanup ();
return 0;
} /* main */