Definition of function object's 'length' property in ecma_op_create_function_object.
This commit is contained in:
@@ -13,6 +13,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "ecma-alloc.h"
|
||||||
#include "ecma-function-object.h"
|
#include "ecma-function-object.h"
|
||||||
#include "ecma-gc.h"
|
#include "ecma-gc.h"
|
||||||
#include "ecma-globals.h"
|
#include "ecma-globals.h"
|
||||||
@@ -108,7 +109,7 @@ ecma_op_is_callable (ecma_value_t value) /**< ecma-value */
|
|||||||
*/
|
*/
|
||||||
ecma_object_t*
|
ecma_object_t*
|
||||||
ecma_op_create_function_object (const ecma_char_t* formal_parameter_list_p[], /**< formal parameters list */
|
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 */
|
ecma_object_t *scope_p, /**< function's scope */
|
||||||
bool is_strict, /**< 'strict' flag */
|
bool is_strict, /**< 'strict' flag */
|
||||||
opcode_counter_t first_opcode_idx) /**< index of first opcode of function's body */
|
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);
|
ecma_gc_update_may_ref_younger_object_flag_by_object (f, scope_p);
|
||||||
|
|
||||||
// 10., 11., 14., 15.
|
// 10., 11.
|
||||||
if (formal_parameters_number != 0)
|
if (formal_parameters_number != 0)
|
||||||
{
|
{
|
||||||
JERRY_UNIMPLEMENTED_REF_UNUSED_VARS(formal_parameter_list_p);
|
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,
|
code_prop_p->u.internal_property.value = ecma_pack_code_internal_property_value (is_strict,
|
||||||
first_opcode_idx);
|
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.
|
// 16.
|
||||||
FIXME(Use 'new Object ()' instead);
|
FIXME(Use 'new Object ()' instead);
|
||||||
ecma_object_t *proto_p = ecma_create_object (NULL, true, ECMA_OBJECT_TYPE_GENERAL);
|
ecma_object_t *proto_p = ecma_create_object (NULL, true, ECMA_OBJECT_TYPE_GENERAL);
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ extern bool ecma_op_is_callable (ecma_value_t value);
|
|||||||
|
|
||||||
extern ecma_object_t*
|
extern ecma_object_t*
|
||||||
ecma_op_create_function_object (const ecma_char_t* formal_parameter_list_p[],
|
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,
|
ecma_object_t *scope_p,
|
||||||
bool is_strict,
|
bool is_strict,
|
||||||
opcode_counter_t first_opcode_idx);
|
opcode_counter_t first_opcode_idx);
|
||||||
|
|||||||
Reference in New Issue
Block a user