mirror of
https://github.com/jerryscript-project/jerryscript.git
synced 2025-12-15 16:29:21 +00:00
Correctly setting [[Extensible]] property of built-in objects.
This commit is contained in:
parent
d8acb0b6e2
commit
b4bd0bfb4c
@ -57,164 +57,195 @@ ecma_builtin_bin_search_for_magic_string_id_in_array (const ecma_magic_string_id
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* List of built-in objects in format
|
* List of built-in objects in format
|
||||||
* 'macro (builtin_id, object_type, object_class, object_prototype_builtin_id, lowercase_name)'
|
* 'macro (builtin_id, object_type, object_class, object_prototype_builtin_id, is_extensible, lowercase_name)'
|
||||||
*/
|
*/
|
||||||
#define ECMA_BUILTIN_LIST(macro) \
|
#define ECMA_BUILTIN_LIST(macro) \
|
||||||
macro (OBJECT_PROTOTYPE, \
|
macro (OBJECT_PROTOTYPE, \
|
||||||
TYPE_GENERAL, \
|
TYPE_GENERAL, \
|
||||||
OBJECT_UL, \
|
OBJECT_UL, \
|
||||||
ECMA_BUILTIN_ID__COUNT /* no prototype */, \
|
ECMA_BUILTIN_ID__COUNT /* no prototype */, \
|
||||||
|
true, \
|
||||||
object_prototype) \
|
object_prototype) \
|
||||||
macro (FUNCTION_PROTOTYPE, \
|
macro (FUNCTION_PROTOTYPE, \
|
||||||
TYPE_FUNCTION, \
|
TYPE_FUNCTION, \
|
||||||
FUNCTION_UL, \
|
FUNCTION_UL, \
|
||||||
ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \
|
ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
function_prototype) \
|
function_prototype) \
|
||||||
macro (ARRAY_PROTOTYPE, \
|
macro (ARRAY_PROTOTYPE, \
|
||||||
TYPE_ARRAY, \
|
TYPE_ARRAY, \
|
||||||
ARRAY_UL, \
|
ARRAY_UL, \
|
||||||
ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \
|
ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
array_prototype) \
|
array_prototype) \
|
||||||
macro (STRING_PROTOTYPE, \
|
macro (STRING_PROTOTYPE, \
|
||||||
TYPE_GENERAL, \
|
TYPE_GENERAL, \
|
||||||
STRING_UL, \
|
STRING_UL, \
|
||||||
ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \
|
ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
string_prototype) \
|
string_prototype) \
|
||||||
macro (BOOLEAN_PROTOTYPE, \
|
macro (BOOLEAN_PROTOTYPE, \
|
||||||
TYPE_GENERAL, \
|
TYPE_GENERAL, \
|
||||||
BOOLEAN_UL, \
|
BOOLEAN_UL, \
|
||||||
ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \
|
ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
boolean_prototype) \
|
boolean_prototype) \
|
||||||
macro (NUMBER_PROTOTYPE, \
|
macro (NUMBER_PROTOTYPE, \
|
||||||
TYPE_GENERAL, \
|
TYPE_GENERAL, \
|
||||||
NUMBER_UL, \
|
NUMBER_UL, \
|
||||||
ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \
|
ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
number_prototype) \
|
number_prototype) \
|
||||||
macro (OBJECT, \
|
macro (OBJECT, \
|
||||||
TYPE_FUNCTION, \
|
TYPE_FUNCTION, \
|
||||||
OBJECT_UL, \
|
OBJECT_UL, \
|
||||||
ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \
|
ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
object) \
|
object) \
|
||||||
macro (MATH, \
|
macro (MATH, \
|
||||||
TYPE_GENERAL, \
|
TYPE_GENERAL, \
|
||||||
MATH_UL, \
|
MATH_UL, \
|
||||||
ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \
|
ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
math) \
|
math) \
|
||||||
macro (ARRAY, \
|
macro (ARRAY, \
|
||||||
TYPE_FUNCTION, \
|
TYPE_FUNCTION, \
|
||||||
ARRAY_UL, \
|
ARRAY_UL, \
|
||||||
ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE, \
|
ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
array) \
|
array) \
|
||||||
macro (STRING, \
|
macro (STRING, \
|
||||||
TYPE_FUNCTION, \
|
TYPE_FUNCTION, \
|
||||||
STRING_UL, \
|
STRING_UL, \
|
||||||
ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE, \
|
ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
string) \
|
string) \
|
||||||
macro (BOOLEAN, \
|
macro (BOOLEAN, \
|
||||||
TYPE_FUNCTION, \
|
TYPE_FUNCTION, \
|
||||||
BOOLEAN_UL, \
|
BOOLEAN_UL, \
|
||||||
ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE, \
|
ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
boolean) \
|
boolean) \
|
||||||
macro (NUMBER, \
|
macro (NUMBER, \
|
||||||
TYPE_FUNCTION, \
|
TYPE_FUNCTION, \
|
||||||
NUMBER_UL, \
|
NUMBER_UL, \
|
||||||
ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE, \
|
ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
number) \
|
number) \
|
||||||
macro (FUNCTION, \
|
macro (FUNCTION, \
|
||||||
TYPE_FUNCTION, \
|
TYPE_FUNCTION, \
|
||||||
FUNCTION_UL, \
|
FUNCTION_UL, \
|
||||||
ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE, \
|
ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
function) \
|
function) \
|
||||||
macro (ERROR_PROTOTYPE, \
|
macro (ERROR_PROTOTYPE, \
|
||||||
TYPE_GENERAL, \
|
TYPE_GENERAL, \
|
||||||
ERROR_UL, \
|
ERROR_UL, \
|
||||||
ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \
|
ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
error_prototype) \
|
error_prototype) \
|
||||||
macro (ERROR, \
|
macro (ERROR, \
|
||||||
TYPE_FUNCTION, \
|
TYPE_FUNCTION, \
|
||||||
ERROR_UL, \
|
ERROR_UL, \
|
||||||
ECMA_BUILTIN_ID_ERROR_PROTOTYPE, \
|
ECMA_BUILTIN_ID_ERROR_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
error) \
|
error) \
|
||||||
macro (EVAL_ERROR_PROTOTYPE, \
|
macro (EVAL_ERROR_PROTOTYPE, \
|
||||||
TYPE_GENERAL, \
|
TYPE_GENERAL, \
|
||||||
ERROR_UL, \
|
ERROR_UL, \
|
||||||
ECMA_BUILTIN_ID_ERROR_PROTOTYPE, \
|
ECMA_BUILTIN_ID_ERROR_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
eval_error_prototype) \
|
eval_error_prototype) \
|
||||||
macro (EVAL_ERROR, \
|
macro (EVAL_ERROR, \
|
||||||
TYPE_FUNCTION, \
|
TYPE_FUNCTION, \
|
||||||
ERROR_UL, \
|
ERROR_UL, \
|
||||||
ECMA_BUILTIN_ID_EVAL_ERROR_PROTOTYPE, \
|
ECMA_BUILTIN_ID_EVAL_ERROR_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
eval_error) \
|
eval_error) \
|
||||||
macro (RANGE_ERROR_PROTOTYPE, \
|
macro (RANGE_ERROR_PROTOTYPE, \
|
||||||
TYPE_GENERAL, \
|
TYPE_GENERAL, \
|
||||||
ERROR_UL, \
|
ERROR_UL, \
|
||||||
ECMA_BUILTIN_ID_ERROR_PROTOTYPE, \
|
ECMA_BUILTIN_ID_ERROR_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
range_error_prototype) \
|
range_error_prototype) \
|
||||||
macro (RANGE_ERROR, \
|
macro (RANGE_ERROR, \
|
||||||
TYPE_FUNCTION, \
|
TYPE_FUNCTION, \
|
||||||
ERROR_UL, \
|
ERROR_UL, \
|
||||||
ECMA_BUILTIN_ID_RANGE_ERROR_PROTOTYPE, \
|
ECMA_BUILTIN_ID_RANGE_ERROR_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
range_error) \
|
range_error) \
|
||||||
macro (REFERENCE_ERROR_PROTOTYPE, \
|
macro (REFERENCE_ERROR_PROTOTYPE, \
|
||||||
TYPE_GENERAL, \
|
TYPE_GENERAL, \
|
||||||
ERROR_UL, \
|
ERROR_UL, \
|
||||||
ECMA_BUILTIN_ID_ERROR_PROTOTYPE, \
|
ECMA_BUILTIN_ID_ERROR_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
reference_error_prototype) \
|
reference_error_prototype) \
|
||||||
macro (REFERENCE_ERROR, \
|
macro (REFERENCE_ERROR, \
|
||||||
TYPE_FUNCTION, \
|
TYPE_FUNCTION, \
|
||||||
ERROR_UL, \
|
ERROR_UL, \
|
||||||
ECMA_BUILTIN_ID_REFERENCE_ERROR_PROTOTYPE, \
|
ECMA_BUILTIN_ID_REFERENCE_ERROR_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
reference_error) \
|
reference_error) \
|
||||||
macro (SYNTAX_ERROR_PROTOTYPE, \
|
macro (SYNTAX_ERROR_PROTOTYPE, \
|
||||||
TYPE_GENERAL, \
|
TYPE_GENERAL, \
|
||||||
ERROR_UL, \
|
ERROR_UL, \
|
||||||
ECMA_BUILTIN_ID_ERROR_PROTOTYPE, \
|
ECMA_BUILTIN_ID_ERROR_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
syntax_error_prototype) \
|
syntax_error_prototype) \
|
||||||
macro (SYNTAX_ERROR, \
|
macro (SYNTAX_ERROR, \
|
||||||
TYPE_FUNCTION, \
|
TYPE_FUNCTION, \
|
||||||
ERROR_UL, \
|
ERROR_UL, \
|
||||||
ECMA_BUILTIN_ID_SYNTAX_ERROR_PROTOTYPE, \
|
ECMA_BUILTIN_ID_SYNTAX_ERROR_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
syntax_error) \
|
syntax_error) \
|
||||||
macro (TYPE_ERROR_PROTOTYPE, \
|
macro (TYPE_ERROR_PROTOTYPE, \
|
||||||
TYPE_GENERAL, \
|
TYPE_GENERAL, \
|
||||||
ERROR_UL, \
|
ERROR_UL, \
|
||||||
ECMA_BUILTIN_ID_ERROR_PROTOTYPE, \
|
ECMA_BUILTIN_ID_ERROR_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
type_error_prototype) \
|
type_error_prototype) \
|
||||||
macro (TYPE_ERROR, \
|
macro (TYPE_ERROR, \
|
||||||
TYPE_FUNCTION, \
|
TYPE_FUNCTION, \
|
||||||
ERROR_UL, \
|
ERROR_UL, \
|
||||||
ECMA_BUILTIN_ID_TYPE_ERROR_PROTOTYPE, \
|
ECMA_BUILTIN_ID_TYPE_ERROR_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
type_error) \
|
type_error) \
|
||||||
macro (URI_ERROR_PROTOTYPE, \
|
macro (URI_ERROR_PROTOTYPE, \
|
||||||
TYPE_GENERAL, \
|
TYPE_GENERAL, \
|
||||||
ERROR_UL, \
|
ERROR_UL, \
|
||||||
ECMA_BUILTIN_ID_ERROR_PROTOTYPE, \
|
ECMA_BUILTIN_ID_ERROR_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
uri_error_prototype) \
|
uri_error_prototype) \
|
||||||
macro (URI_ERROR, \
|
macro (URI_ERROR, \
|
||||||
TYPE_FUNCTION, \
|
TYPE_FUNCTION, \
|
||||||
ERROR_UL, \
|
ERROR_UL, \
|
||||||
ECMA_BUILTIN_ID_URI_ERROR_PROTOTYPE, \
|
ECMA_BUILTIN_ID_URI_ERROR_PROTOTYPE, \
|
||||||
|
true, \
|
||||||
uri_error) \
|
uri_error) \
|
||||||
macro (TYPE_ERROR_THROWER, \
|
macro (TYPE_ERROR_THROWER, \
|
||||||
TYPE_FUNCTION, \
|
TYPE_FUNCTION, \
|
||||||
FUNCTION_UL, \
|
FUNCTION_UL, \
|
||||||
ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE, \
|
ECMA_BUILTIN_ID_FUNCTION_PROTOTYPE, \
|
||||||
|
false, \
|
||||||
type_error_thrower) \
|
type_error_thrower) \
|
||||||
macro (COMPACT_PROFILE_ERROR, \
|
macro (COMPACT_PROFILE_ERROR, \
|
||||||
TYPE_FUNCTION, \
|
TYPE_FUNCTION, \
|
||||||
COMPACT_PROFILE_ERROR_UL, \
|
COMPACT_PROFILE_ERROR_UL, \
|
||||||
ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \
|
ECMA_BUILTIN_ID_OBJECT_PROTOTYPE, \
|
||||||
|
false, \
|
||||||
compact_profile_error) \
|
compact_profile_error) \
|
||||||
macro (GLOBAL, \
|
macro (GLOBAL, \
|
||||||
TYPE_GENERAL, \
|
TYPE_GENERAL, \
|
||||||
OBJECT_UL, \
|
OBJECT_UL, \
|
||||||
ECMA_BUILTIN_ID__COUNT /* no prototype */, \
|
ECMA_BUILTIN_ID__COUNT /* no prototype */, \
|
||||||
|
true, \
|
||||||
global)
|
global)
|
||||||
|
|
||||||
#define DECLARE_DISPATCH_ROUTINES(builtin_id, \
|
#define DECLARE_DISPATCH_ROUTINES(builtin_id, \
|
||||||
object_type, \
|
object_type, \
|
||||||
object_class, \
|
object_class, \
|
||||||
object_prototype_builtin_id, \
|
object_prototype_builtin_id, \
|
||||||
|
is_extensible, \
|
||||||
lowercase_name) \
|
lowercase_name) \
|
||||||
extern ecma_completion_value_t \
|
extern ecma_completion_value_t \
|
||||||
ecma_builtin_ ## lowercase_name ## _dispatch_call (ecma_value_t *arguments_list_p, \
|
ecma_builtin_ ## lowercase_name ## _dispatch_call (ecma_value_t *arguments_list_p, \
|
||||||
|
|||||||
@ -94,9 +94,10 @@ static ecma_object_t*
|
|||||||
ecma_builtin_init_object (ecma_builtin_id_t obj_builtin_id, /**< built-in ID */
|
ecma_builtin_init_object (ecma_builtin_id_t obj_builtin_id, /**< built-in ID */
|
||||||
ecma_object_t* prototype_obj_p, /**< prototype object */
|
ecma_object_t* prototype_obj_p, /**< prototype object */
|
||||||
ecma_object_type_t obj_type, /**< object's type */
|
ecma_object_type_t obj_type, /**< object's type */
|
||||||
ecma_magic_string_id_t obj_class) /**< object's class */
|
ecma_magic_string_id_t obj_class, /**< object's class */
|
||||||
|
bool is_extensible) /**< value of object's [[Extensible]] property */
|
||||||
{
|
{
|
||||||
ecma_object_t *object_obj_p = ecma_create_object (prototype_obj_p, true, obj_type);
|
ecma_object_t *object_obj_p = ecma_create_object (prototype_obj_p, is_extensible, obj_type);
|
||||||
|
|
||||||
ecma_property_t *class_prop_p = ecma_create_internal_property (object_obj_p,
|
ecma_property_t *class_prop_p = ecma_create_internal_property (object_obj_p,
|
||||||
ECMA_INTERNAL_PROPERTY_CLASS);
|
ECMA_INTERNAL_PROPERTY_CLASS);
|
||||||
@ -176,6 +177,7 @@ ecma_instantiate_builtin (ecma_builtin_id_t id) /**< built-in id */
|
|||||||
object_type, \
|
object_type, \
|
||||||
object_class, \
|
object_class, \
|
||||||
object_prototype_builtin_id, \
|
object_prototype_builtin_id, \
|
||||||
|
is_extensible, \
|
||||||
lowercase_name) \
|
lowercase_name) \
|
||||||
case ECMA_BUILTIN_ID_ ## builtin_id: \
|
case ECMA_BUILTIN_ID_ ## builtin_id: \
|
||||||
{ \
|
{ \
|
||||||
@ -200,7 +202,8 @@ ecma_instantiate_builtin (ecma_builtin_id_t id) /**< built-in id */
|
|||||||
ecma_object_t *builtin_obj_p = ecma_builtin_init_object (ECMA_BUILTIN_ID_ ## builtin_id, \
|
ecma_object_t *builtin_obj_p = ecma_builtin_init_object (ECMA_BUILTIN_ID_ ## builtin_id, \
|
||||||
prototype_obj_p, \
|
prototype_obj_p, \
|
||||||
ECMA_OBJECT_ ## object_type, \
|
ECMA_OBJECT_ ## object_type, \
|
||||||
ECMA_MAGIC_STRING_ ## object_class); \
|
ECMA_MAGIC_STRING_ ## object_class, \
|
||||||
|
is_extensible); \
|
||||||
ecma_builtin_objects [ECMA_BUILTIN_ID_ ## builtin_id] = builtin_obj_p; \
|
ecma_builtin_objects [ECMA_BUILTIN_ID_ ## builtin_id] = builtin_obj_p; \
|
||||||
\
|
\
|
||||||
break; \
|
break; \
|
||||||
@ -264,6 +267,7 @@ ecma_builtin_try_to_instantiate_property (ecma_object_t *object_p, /**< object *
|
|||||||
object_type, \
|
object_type, \
|
||||||
object_class, \
|
object_class, \
|
||||||
object_prototype_builtin_id, \
|
object_prototype_builtin_id, \
|
||||||
|
is_extensible, \
|
||||||
lowercase_name) \
|
lowercase_name) \
|
||||||
case ECMA_BUILTIN_ID_ ## builtin_id: \
|
case ECMA_BUILTIN_ID_ ## builtin_id: \
|
||||||
{ \
|
{ \
|
||||||
@ -404,6 +408,7 @@ ecma_builtin_dispatch_call (ecma_object_t *obj_p, /**< built-in object */
|
|||||||
object_type, \
|
object_type, \
|
||||||
object_class, \
|
object_class, \
|
||||||
object_prototype_builtin_id, \
|
object_prototype_builtin_id, \
|
||||||
|
is_extensible, \
|
||||||
lowercase_name) \
|
lowercase_name) \
|
||||||
case ECMA_BUILTIN_ID_ ## builtin_id: \
|
case ECMA_BUILTIN_ID_ ## builtin_id: \
|
||||||
{ \
|
{ \
|
||||||
@ -468,6 +473,7 @@ ecma_builtin_dispatch_construct (ecma_object_t *obj_p, /**< built-in object */
|
|||||||
object_type, \
|
object_type, \
|
||||||
object_class, \
|
object_class, \
|
||||||
object_prototype_builtin_id, \
|
object_prototype_builtin_id, \
|
||||||
|
is_extensible, \
|
||||||
lowercase_name) \
|
lowercase_name) \
|
||||||
case ECMA_BUILTIN_ID_ ## builtin_id: \
|
case ECMA_BUILTIN_ID_ ## builtin_id: \
|
||||||
{ \
|
{ \
|
||||||
@ -524,6 +530,7 @@ ecma_builtin_dispatch_routine (ecma_builtin_id_t builtin_object_id, /**< built-i
|
|||||||
object_type, \
|
object_type, \
|
||||||
object_class, \
|
object_class, \
|
||||||
object_prototype_builtin_id, \
|
object_prototype_builtin_id, \
|
||||||
|
is_extensible, \
|
||||||
lowercase_name) \
|
lowercase_name) \
|
||||||
case ECMA_BUILTIN_ID_ ## builtin_id: \
|
case ECMA_BUILTIN_ID_ ## builtin_id: \
|
||||||
{ \
|
{ \
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user