Definition of function object's 'length' property in ecma_op_create_function_object.

This commit is contained in:
Ruben Ayrapetyan 2014-08-13 15:17:12 +04:00
parent 4fe85cdd1a
commit c3cc674fef
2 changed files with 30 additions and 3 deletions

View File

@ -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);

View File

@ -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);