Introducing has_non_instantiated_built_in_properties flag in ecma_object_t and 'built-in function' object type.
This commit is contained in:
@@ -314,6 +314,8 @@ typedef enum
|
|||||||
ECMA_OBJECT_TYPE_STRING, /**< String objects (15.5) */
|
ECMA_OBJECT_TYPE_STRING, /**< String objects (15.5) */
|
||||||
ECMA_OBJECT_TYPE_FUNCTION, /**< Function objects (15.3), created through 13.2 routine */
|
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_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_ARGUMENTS, /**< Arguments object (10.6) */
|
||||||
ECMA_OBJECT_TYPE_ARRAY, /**< Array object (15.4) */
|
ECMA_OBJECT_TYPE_ARRAY, /**< Array object (15.4) */
|
||||||
ECMA_OBJECT_TYPE_HOST /**< Host object */
|
ECMA_OBJECT_TYPE_HOST /**< Host object */
|
||||||
@@ -420,11 +422,18 @@ typedef struct
|
|||||||
ECMA_OBJECT_OBJ_TYPE_WIDTH)
|
ECMA_OBJECT_OBJ_TYPE_WIDTH)
|
||||||
#define ECMA_OBJECT_OBJ_PROTOTYPE_OBJECT_CP_WIDTH (ECMA_POINTER_FIELD_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
|
* Size of structure for objects
|
||||||
*/
|
*/
|
||||||
#define ECMA_OBJECT_OBJ_TYPE_SIZE (ECMA_OBJECT_OBJ_PROTOTYPE_OBJECT_CP_POS + \
|
#define ECMA_OBJECT_OBJ_TYPE_SIZE (ECMA_OBJECT_OBJ_HAS_NON_INSTANTIATED_BUILT_IN_PROPERTIES_POS + \
|
||||||
ECMA_OBJECT_OBJ_PROTOTYPE_OBJECT_CP_WIDTH)
|
ECMA_OBJECT_OBJ_HAS_NON_INSTANTIATED_BUILT_IN_PROPERTIES_WIDTH)
|
||||||
|
|
||||||
|
|
||||||
/* Lexical environments' only part */
|
/* Lexical environments' only part */
|
||||||
|
|||||||
@@ -101,7 +101,8 @@ ecma_op_is_callable (ecma_value_t value) /**< ecma-value */
|
|||||||
JERRY_ASSERT(!ecma_is_lexical_environment (obj_p));
|
JERRY_ASSERT(!ecma_is_lexical_environment (obj_p));
|
||||||
|
|
||||||
return (ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_FUNCTION
|
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 */
|
} /* 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));
|
JERRY_ASSERT(!ecma_is_lexical_environment (obj_p));
|
||||||
|
|
||||||
return (ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_FUNCTION
|
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 */
|
} /* ecma_is_constructor */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -517,6 +519,10 @@ ecma_op_function_call (ecma_object_t *func_obj_p, /**< Function object */
|
|||||||
|
|
||||||
return ret_value;
|
return ret_value;
|
||||||
}
|
}
|
||||||
|
else if (ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION)
|
||||||
|
{
|
||||||
|
JERRY_UNIMPLEMENTED ();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
JERRY_ASSERT(ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_BOUND_FUNCTION);
|
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(ecma_op_is_callable (ecma_make_object_value (func_obj_p)));
|
||||||
JERRY_ASSERT(arguments_list_len == 0 || arguments_list_p != NULL);
|
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;
|
ecma_completion_value_t ret_value;
|
||||||
|
|
||||||
|
|||||||
@@ -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_BOUND_FUNCTION:
|
||||||
case ECMA_OBJECT_TYPE_FUNCTION:
|
case ECMA_OBJECT_TYPE_FUNCTION:
|
||||||
|
case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION:
|
||||||
{
|
{
|
||||||
return ecma_op_function_object_get (obj_p, property_name_p);
|
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_ARRAY:
|
||||||
case ECMA_OBJECT_TYPE_FUNCTION:
|
case ECMA_OBJECT_TYPE_FUNCTION:
|
||||||
case ECMA_OBJECT_TYPE_BOUND_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);
|
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_ARRAY:
|
||||||
case ECMA_OBJECT_TYPE_FUNCTION:
|
case ECMA_OBJECT_TYPE_FUNCTION:
|
||||||
case ECMA_OBJECT_TYPE_BOUND_FUNCTION:
|
case ECMA_OBJECT_TYPE_BOUND_FUNCTION:
|
||||||
|
case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION:
|
||||||
case ECMA_OBJECT_TYPE_STRING:
|
case ECMA_OBJECT_TYPE_STRING:
|
||||||
{
|
{
|
||||||
return ecma_op_general_object_get_property (obj_p, property_name_p);
|
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_ARRAY:
|
||||||
case ECMA_OBJECT_TYPE_FUNCTION:
|
case ECMA_OBJECT_TYPE_FUNCTION:
|
||||||
case ECMA_OBJECT_TYPE_BOUND_FUNCTION:
|
case ECMA_OBJECT_TYPE_BOUND_FUNCTION:
|
||||||
|
case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION:
|
||||||
case ECMA_OBJECT_TYPE_STRING:
|
case ECMA_OBJECT_TYPE_STRING:
|
||||||
{
|
{
|
||||||
return ecma_op_general_object_put (obj_p, property_name_p, value, is_throw);
|
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_ARRAY:
|
||||||
case ECMA_OBJECT_TYPE_FUNCTION:
|
case ECMA_OBJECT_TYPE_FUNCTION:
|
||||||
case ECMA_OBJECT_TYPE_BOUND_FUNCTION:
|
case ECMA_OBJECT_TYPE_BOUND_FUNCTION:
|
||||||
|
case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION:
|
||||||
case ECMA_OBJECT_TYPE_STRING:
|
case ECMA_OBJECT_TYPE_STRING:
|
||||||
{
|
{
|
||||||
return ecma_op_general_object_can_put (obj_p, property_name_p);
|
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_ARRAY:
|
||||||
case ECMA_OBJECT_TYPE_FUNCTION:
|
case ECMA_OBJECT_TYPE_FUNCTION:
|
||||||
case ECMA_OBJECT_TYPE_BOUND_FUNCTION:
|
case ECMA_OBJECT_TYPE_BOUND_FUNCTION:
|
||||||
|
case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION:
|
||||||
case ECMA_OBJECT_TYPE_STRING:
|
case ECMA_OBJECT_TYPE_STRING:
|
||||||
{
|
{
|
||||||
return ecma_op_general_object_has_property (obj_p, property_name_p);
|
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_ARRAY:
|
||||||
case ECMA_OBJECT_TYPE_FUNCTION:
|
case ECMA_OBJECT_TYPE_FUNCTION:
|
||||||
case ECMA_OBJECT_TYPE_BOUND_FUNCTION:
|
case ECMA_OBJECT_TYPE_BOUND_FUNCTION:
|
||||||
|
case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION:
|
||||||
case ECMA_OBJECT_TYPE_STRING:
|
case ECMA_OBJECT_TYPE_STRING:
|
||||||
{
|
{
|
||||||
return ecma_op_general_object_delete (obj_p, property_name_p, is_throw);
|
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_ARRAY:
|
||||||
case ECMA_OBJECT_TYPE_FUNCTION:
|
case ECMA_OBJECT_TYPE_FUNCTION:
|
||||||
case ECMA_OBJECT_TYPE_BOUND_FUNCTION:
|
case ECMA_OBJECT_TYPE_BOUND_FUNCTION:
|
||||||
|
case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION:
|
||||||
case ECMA_OBJECT_TYPE_STRING:
|
case ECMA_OBJECT_TYPE_STRING:
|
||||||
{
|
{
|
||||||
return ecma_op_general_object_default_value (obj_p, hint);
|
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_GENERAL:
|
||||||
case ECMA_OBJECT_TYPE_FUNCTION:
|
case ECMA_OBJECT_TYPE_FUNCTION:
|
||||||
case ECMA_OBJECT_TYPE_BOUND_FUNCTION:
|
case ECMA_OBJECT_TYPE_BOUND_FUNCTION:
|
||||||
|
case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION:
|
||||||
case ECMA_OBJECT_TYPE_STRING:
|
case ECMA_OBJECT_TYPE_STRING:
|
||||||
{
|
{
|
||||||
return ecma_op_general_object_define_own_property (obj_p, property_name_p, property_desc, is_throw);
|
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_FUNCTION:
|
||||||
case ECMA_OBJECT_TYPE_BOUND_FUNCTION:
|
case ECMA_OBJECT_TYPE_BOUND_FUNCTION:
|
||||||
|
case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION:
|
||||||
{
|
{
|
||||||
JERRY_UNIMPLEMENTED_REF_UNUSED_VARS (obj_p, value);
|
JERRY_UNIMPLEMENTED_REF_UNUSED_VARS (obj_p, value);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user