diff --git a/src/libecmaoperations/ecma-function-object.c b/src/libecmaoperations/ecma-function-object.c index 5530abc13..dcaee5ee3 100644 --- a/src/libecmaoperations/ecma-function-object.c +++ b/src/libecmaoperations/ecma-function-object.c @@ -13,6 +13,7 @@ * limitations under the License. */ +#include "ecma-alloc.h" #include "ecma-function-object.h" #include "ecma-gc.h" #include "ecma-globals.h" @@ -108,7 +109,7 @@ ecma_op_is_callable (ecma_value_t value) /**< ecma-value */ */ ecma_object_t* ecma_op_create_function_object (const ecma_char_t* formal_parameter_list_p[], /**< formal parameters list */ - size_t formal_parameters_number, /**< formal parameters list's length */ + uint32_t formal_parameters_number, /**< formal parameters list's length */ ecma_object_t *scope_p, /**< function's scope */ bool is_strict, /**< 'strict' flag */ opcode_counter_t first_opcode_idx) /**< index of first opcode of function's body */ @@ -135,7 +136,7 @@ ecma_op_create_function_object (const ecma_char_t* formal_parameter_list_p[], /* ecma_gc_update_may_ref_younger_object_flag_by_object (f, scope_p); - // 10., 11., 14., 15. + // 10., 11. if (formal_parameters_number != 0) { JERRY_UNIMPLEMENTED_REF_UNUSED_VARS(formal_parameter_list_p); @@ -146,6 +147,32 @@ ecma_op_create_function_object (const ecma_char_t* formal_parameter_list_p[], /* code_prop_p->u.internal_property.value = ecma_pack_code_internal_property_value (is_strict, first_opcode_idx); + // 14. + ecma_number_t* len_p = ecma_alloc_number (); + *len_p = ecma_uint32_to_number (formal_parameters_number); + + // 15. + ecma_property_descriptor_t length_prop_desc = ecma_make_empty_property_descriptor (); + length_prop_desc.is_value_defined = true; + length_prop_desc.value = ecma_make_number_value (len_p); + length_prop_desc.is_writable_defined = false; + length_prop_desc.writable = ECMA_PROPERTY_NOT_WRITABLE; + length_prop_desc.is_enumerable_defined = false; + length_prop_desc.enumerable = ECMA_PROPERTY_NOT_ENUMERABLE; + length_prop_desc.is_configurable_defined = false; + length_prop_desc.configurable = ECMA_PROPERTY_NOT_CONFIGURABLE; + + const ecma_char_t* magic_string_length_p = ecma_get_magic_string (ECMA_MAGIC_STRING_LENGTH); + ecma_completion_value_t completion = ecma_op_object_define_own_property (f, + magic_string_length_p, + length_prop_desc, + false); + JERRY_ASSERT (ecma_is_completion_value_normal_true (completion) + || ecma_is_completion_value_normal_false (completion)); + + ecma_dealloc_number (len_p); + len_p = NULL; + // 16. FIXME(Use 'new Object ()' instead); ecma_object_t *proto_p = ecma_create_object (NULL, true, ECMA_OBJECT_TYPE_GENERAL); diff --git a/src/libecmaoperations/ecma-function-object.h b/src/libecmaoperations/ecma-function-object.h index f6f7eb1e5..01bfec482 100644 --- a/src/libecmaoperations/ecma-function-object.h +++ b/src/libecmaoperations/ecma-function-object.h @@ -30,7 +30,7 @@ extern bool ecma_op_is_callable (ecma_value_t value); extern ecma_object_t* ecma_op_create_function_object (const ecma_char_t* formal_parameter_list_p[], - size_t formal_parameters_number, + uint32_t formal_parameters_number, ecma_object_t *scope_p, bool is_strict, opcode_counter_t first_opcode_idx);