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:
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user