/** * The %TypedArray%.from routine * * See also: * ES2015 22.2.2.1 * * @return ecma value * Returned value must be freed with ecma_free_value. */ static ecma_value_t ecma_builtin_typedarray_from (ecma_value_t this_arg, /**< 'this' argument */ const ecma_value_t *arguments_list_p, /**< arguments list */ ecma_length_t arguments_list_len) /**< number of arguments */ { JERRY_ASSERT (arguments_list_len == 0 || arguments_list_p != NULL); if (!ecma_is_constructor (this_arg)) { return ecma_raise_type_error (ECMA_ERR_MSG ("'this' is not a constructor.")); } ecma_value_t source; ecma_value_t map_fn = ECMA_VALUE_UNDEFINED; ecma_value_t this_in_fn = ECMA_VALUE_UNDEFINED; if (arguments_list_len == 0) { return ecma_raise_type_error (ECMA_ERR_MSG ("no source argument")); } source = arguments_list_p[0]; if (arguments_list_len > 1) { map_fn = arguments_list_p[1]; if (!ecma_op_is_callable (map_fn)) { return ecma_raise_type_error (ECMA_ERR_MSG ("mapfn argument is not callable")); } if (arguments_list_len > 2) { this_in_fn = arguments_list_p[2]; } } ecma_object_t *obj_p = ecma_get_object_from_value (this_arg); const uint8_t builtin_id = ecma_get_object_builtin_id (obj_p); if (!ecma_typedarray_helper_is_typedarray (builtin_id)) { return ecma_raise_type_error (ECMA_ERR_MSG ("'this' is not a typedarray constructor")); } ecma_object_t *proto_p = ecma_builtin_get (ecma_typedarray_helper_get_prototype_id (builtin_id)); const uint8_t element_size_shift = ecma_typedarray_helper_get_shift_size (builtin_id); const lit_magic_string_id_t class_id = ecma_typedarray_helper_get_magic_string (builtin_id); return ecma_op_typedarray_from (source, map_fn, this_in_fn, proto_p, element_size_shift, class_id); } /* ecma_builtin_typedarray_from */
/** * The common function for 'reject' and 'resolve'. * * @return ecma value * Returned value must be freed with ecma_free_value. */ static ecma_value_t ecma_builtin_promise_reject_or_resolve (ecma_value_t this_arg, /**< "this" argument */ ecma_value_t argument, /**< argument for reject or resolve */ bool is_resolve) /**< whether it is for resolve routine */ { if (!ecma_is_value_object (this_arg)) { return ecma_raise_type_error (ECMA_ERR_MSG ("'this' is not an object.")); } uint8_t builtin_id = ecma_get_object_builtin_id (ecma_get_object_from_value (this_arg)); if (builtin_id != ECMA_BUILTIN_ID_PROMISE) { return ecma_raise_type_error (ECMA_ERR_MSG ("'this' is not the Promise constructor.")); } if (is_resolve && ecma_is_value_object (argument) && ecma_is_promise (ecma_get_object_from_value (argument))) { return ecma_copy_value (argument); } ecma_value_t capability = ecma_promise_new_capability (); if (ECMA_IS_VALUE_ERROR (capability)) { return capability; } ecma_string_t *str; if (is_resolve) { str = ecma_new_ecma_string_from_uint32 (ECMA_PROMISE_PROPERTY_RESOLVE); } else { str = ecma_new_ecma_string_from_uint32 (ECMA_PROMISE_PROPERTY_REJECT); } ecma_value_t func = ecma_op_object_get (ecma_get_object_from_value (capability), str); ecma_deref_ecma_string (str); ecma_value_t call_ret = ecma_op_function_call (ecma_get_object_from_value (func), ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED), &argument, 1); ecma_free_value (func); if (ECMA_IS_VALUE_ERROR (call_ret)) { return call_ret; } ecma_free_value (call_ret); ecma_string_t *str_promise = ecma_new_ecma_string_from_uint32 (ECMA_PROMISE_PROPERTY_PROMISE); ecma_value_t promise_new = ecma_op_object_get (ecma_get_object_from_value (capability), str_promise); ecma_deref_ecma_string (str_promise); ecma_free_value (capability); return promise_new; } /* ecma_builtin_promise_reject_or_resolve */
/** * Runtime Semantics: PerformPromiseRace. * * See also: * ES2015 25.4.4.3.1 * * @return ecma value of the new promise. * Returned value must be freed with ecma_free_value. */ inline static ecma_value_t ecma_builtin_promise_do_race (ecma_value_t array, /**< the array for race */ ecma_value_t capability, /**< PromiseCapability record */ ecma_value_t ctor) /**< the caller of Promise.race */ { JERRY_ASSERT (ecma_is_value_object (capability) && ecma_is_value_object (array) && ecma_is_value_object (ctor)); JERRY_ASSERT (ecma_get_object_builtin_id (ecma_get_object_from_value (ctor)) == ECMA_BUILTIN_ID_PROMISE); JERRY_ASSERT (ecma_get_object_type (ecma_get_object_from_value (array)) == ECMA_OBJECT_TYPE_ARRAY); ecma_value_t ret = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY); ecma_string_t *magic_string_length_p = ecma_new_ecma_length_string (); ecma_object_t *array_p = ecma_get_object_from_value (array); ecma_value_t len_value = ecma_op_object_get (array_p, magic_string_length_p); ecma_deref_ecma_string (magic_string_length_p); ecma_length_t len = (ecma_length_t) ecma_get_integer_from_value (len_value); ecma_fast_free_value (len_value); ecma_string_t *str_promise = ecma_new_ecma_string_from_uint32 (ECMA_PROMISE_PROPERTY_PROMISE); ecma_string_t *str_resolve = ecma_new_ecma_string_from_uint32 (ECMA_PROMISE_PROPERTY_RESOLVE); ecma_string_t *str_reject = ecma_new_ecma_string_from_uint32 (ECMA_PROMISE_PROPERTY_REJECT); ecma_value_t resolve = ecma_op_object_get (ecma_get_object_from_value (capability), str_resolve); ecma_value_t reject = ecma_op_object_get (ecma_get_object_from_value (capability), str_reject); for (ecma_length_t index = 0; index <= len; index++) { /* b-d. */ if (index == len) { ret = ecma_op_object_get (ecma_get_object_from_value (capability), str_promise); break; } /* e. */ ecma_string_t *str_index = ecma_new_ecma_string_from_uint32 (index); ecma_value_t array_item = ecma_op_object_get (array_p, str_index); ecma_deref_ecma_string (str_index); /* h. */ ecma_value_t next_promise = ecma_builtin_promise_resolve (ctor, array_item); ecma_free_value (array_item); /* i. */ if (ECMA_IS_VALUE_ERROR (next_promise)) { ret = next_promise; break; } /* j. */ ecma_value_t then_result = ecma_promise_then (next_promise, resolve, reject); ecma_free_value (next_promise); /* k. */ if (ECMA_IS_VALUE_ERROR (then_result)) { ret = then_result; break; } ecma_free_value (then_result); } ecma_free_value (reject); ecma_free_value (resolve); ecma_deref_ecma_string (str_promise); ecma_deref_ecma_string (str_resolve); ecma_deref_ecma_string (str_reject); JERRY_ASSERT (!ecma_is_value_empty (ret)); return ret; } /* ecma_builtin_promise_do_race */