From 2edc921be71d649d953707ba304d1f16d109cb57 Mon Sep 17 00:00:00 2001 From: Ruben Ayrapetyan Date: Wed, 17 Sep 2014 20:03:22 +0400 Subject: [PATCH] Introducing has_non_instantiated_built_in_properties flag in ecma_object_t and 'built-in function' object type. --- src/libecmaobjects/ecma-globals.h | 13 +++++++++++-- src/libecmaoperations/ecma-function-object.c | 13 ++++++++++--- src/libecmaoperations/ecma-objects.c | 10 ++++++++++ 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/libecmaobjects/ecma-globals.h b/src/libecmaobjects/ecma-globals.h index 261ee9277..163c7a37d 100644 --- a/src/libecmaobjects/ecma-globals.h +++ b/src/libecmaobjects/ecma-globals.h @@ -314,6 +314,8 @@ typedef enum ECMA_OBJECT_TYPE_STRING, /**< String objects (15.5) */ ECMA_OBJECT_TYPE_FUNCTION, /**< Function objects (15.3), created through 13.2 routine */ ECMA_OBJECT_TYPE_BOUND_FUNCTION, /**< Function objects (15.3), created through 15.3.4.5 routine */ + ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION, /** One of built-in functions described in section 15 + of ECMA-262 v5 specification */ ECMA_OBJECT_TYPE_ARGUMENTS, /**< Arguments object (10.6) */ ECMA_OBJECT_TYPE_ARRAY, /**< Array object (15.4) */ ECMA_OBJECT_TYPE_HOST /**< Host object */ @@ -420,11 +422,18 @@ typedef struct ECMA_OBJECT_OBJ_TYPE_WIDTH) #define ECMA_OBJECT_OBJ_PROTOTYPE_OBJECT_CP_WIDTH (ECMA_POINTER_FIELD_WIDTH) +/** + * Flag indicating whether the object has non-instantiated built-in properties + */ +#define ECMA_OBJECT_OBJ_HAS_NON_INSTANTIATED_BUILT_IN_PROPERTIES_POS (ECMA_OBJECT_OBJ_PROTOTYPE_OBJECT_CP_POS + \ + ECMA_OBJECT_OBJ_PROTOTYPE_OBJECT_CP_WIDTH) +#define ECMA_OBJECT_OBJ_HAS_NON_INSTANTIATED_BUILT_IN_PROPERTIES_WIDTH (1) + /** * Size of structure for objects */ -#define ECMA_OBJECT_OBJ_TYPE_SIZE (ECMA_OBJECT_OBJ_PROTOTYPE_OBJECT_CP_POS + \ - ECMA_OBJECT_OBJ_PROTOTYPE_OBJECT_CP_WIDTH) +#define ECMA_OBJECT_OBJ_TYPE_SIZE (ECMA_OBJECT_OBJ_HAS_NON_INSTANTIATED_BUILT_IN_PROPERTIES_POS + \ + ECMA_OBJECT_OBJ_HAS_NON_INSTANTIATED_BUILT_IN_PROPERTIES_WIDTH) /* Lexical environments' only part */ diff --git a/src/libecmaoperations/ecma-function-object.c b/src/libecmaoperations/ecma-function-object.c index 7d468f2f9..0059ea079 100644 --- a/src/libecmaoperations/ecma-function-object.c +++ b/src/libecmaoperations/ecma-function-object.c @@ -101,7 +101,8 @@ ecma_op_is_callable (ecma_value_t value) /**< ecma-value */ JERRY_ASSERT(!ecma_is_lexical_environment (obj_p)); return (ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_FUNCTION - || ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_BOUND_FUNCTION); + || ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_BOUND_FUNCTION + || ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION); } /* ecma_op_is_callable */ /** @@ -124,7 +125,8 @@ ecma_is_constructor (ecma_value_t value) /**< ecma-value */ JERRY_ASSERT(!ecma_is_lexical_environment (obj_p)); return (ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_FUNCTION - || ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_BOUND_FUNCTION); + || ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_BOUND_FUNCTION + || ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION); } /* ecma_is_constructor */ /** @@ -517,6 +519,10 @@ ecma_op_function_call (ecma_object_t *func_obj_p, /**< Function object */ return ret_value; } + else if (ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION) + { + JERRY_UNIMPLEMENTED (); + } else { JERRY_ASSERT(ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_BOUND_FUNCTION); @@ -543,7 +549,8 @@ ecma_op_function_construct (ecma_object_t *func_obj_p, /**< Function object */ JERRY_ASSERT(ecma_op_is_callable (ecma_make_object_value (func_obj_p))); JERRY_ASSERT(arguments_list_len == 0 || arguments_list_p != NULL); - if (ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_FUNCTION) + if (ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_FUNCTION + || ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION) { ecma_completion_value_t ret_value; diff --git a/src/libecmaoperations/ecma-objects.c b/src/libecmaoperations/ecma-objects.c index b0d86386f..202a5e77c 100644 --- a/src/libecmaoperations/ecma-objects.c +++ b/src/libecmaoperations/ecma-objects.c @@ -63,6 +63,7 @@ ecma_op_object_get (ecma_object_t *obj_p, /**< the object */ case ECMA_OBJECT_TYPE_BOUND_FUNCTION: case ECMA_OBJECT_TYPE_FUNCTION: + case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: { return ecma_op_function_object_get (obj_p, property_name_p); } @@ -101,6 +102,7 @@ ecma_op_object_get_own_property (ecma_object_t *obj_p, /**< the object */ case ECMA_OBJECT_TYPE_ARRAY: case ECMA_OBJECT_TYPE_FUNCTION: case ECMA_OBJECT_TYPE_BOUND_FUNCTION: + case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: { return ecma_op_general_object_get_own_property (obj_p, property_name_p); } @@ -146,6 +148,7 @@ ecma_op_object_get_property (ecma_object_t *obj_p, /**< the object */ case ECMA_OBJECT_TYPE_ARRAY: case ECMA_OBJECT_TYPE_FUNCTION: case ECMA_OBJECT_TYPE_BOUND_FUNCTION: + case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: case ECMA_OBJECT_TYPE_STRING: { return ecma_op_general_object_get_property (obj_p, property_name_p); @@ -188,6 +191,7 @@ ecma_op_object_put (ecma_object_t *obj_p, /**< the object */ case ECMA_OBJECT_TYPE_ARRAY: case ECMA_OBJECT_TYPE_FUNCTION: case ECMA_OBJECT_TYPE_BOUND_FUNCTION: + case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: case ECMA_OBJECT_TYPE_STRING: { return ecma_op_general_object_put (obj_p, property_name_p, value, is_throw); @@ -228,6 +232,7 @@ ecma_op_object_can_put (ecma_object_t *obj_p, /**< the object */ case ECMA_OBJECT_TYPE_ARRAY: case ECMA_OBJECT_TYPE_FUNCTION: case ECMA_OBJECT_TYPE_BOUND_FUNCTION: + case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: case ECMA_OBJECT_TYPE_STRING: { return ecma_op_general_object_can_put (obj_p, property_name_p); @@ -268,6 +273,7 @@ ecma_op_object_has_property (ecma_object_t *obj_p, /**< the object */ case ECMA_OBJECT_TYPE_ARRAY: case ECMA_OBJECT_TYPE_FUNCTION: case ECMA_OBJECT_TYPE_BOUND_FUNCTION: + case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: case ECMA_OBJECT_TYPE_STRING: { return ecma_op_general_object_has_property (obj_p, property_name_p); @@ -308,6 +314,7 @@ ecma_op_object_delete (ecma_object_t *obj_p, /**< the object */ case ECMA_OBJECT_TYPE_ARRAY: case ECMA_OBJECT_TYPE_FUNCTION: case ECMA_OBJECT_TYPE_BOUND_FUNCTION: + case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: case ECMA_OBJECT_TYPE_STRING: { return ecma_op_general_object_delete (obj_p, property_name_p, is_throw); @@ -352,6 +359,7 @@ ecma_op_object_default_value (ecma_object_t *obj_p, /**< the object */ case ECMA_OBJECT_TYPE_ARRAY: case ECMA_OBJECT_TYPE_FUNCTION: case ECMA_OBJECT_TYPE_BOUND_FUNCTION: + case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: case ECMA_OBJECT_TYPE_STRING: { return ecma_op_general_object_default_value (obj_p, hint); @@ -392,6 +400,7 @@ ecma_op_object_define_own_property (ecma_object_t *obj_p, /**< the object */ case ECMA_OBJECT_TYPE_GENERAL: case ECMA_OBJECT_TYPE_FUNCTION: case ECMA_OBJECT_TYPE_BOUND_FUNCTION: + case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: case ECMA_OBJECT_TYPE_STRING: { return ecma_op_general_object_define_own_property (obj_p, property_name_p, property_desc, is_throw); @@ -443,6 +452,7 @@ ecma_op_object_has_instance (ecma_object_t *obj_p, /**< the object */ case ECMA_OBJECT_TYPE_FUNCTION: case ECMA_OBJECT_TYPE_BOUND_FUNCTION: + case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION: { JERRY_UNIMPLEMENTED_REF_UNUSED_VARS (obj_p, value); }