diff --git a/jerry-core/ecma/base/ecma-globals.h b/jerry-core/ecma/base/ecma-globals.h index 9ee1d9b23..1c3247dd0 100644 --- a/jerry-core/ecma/base/ecma-globals.h +++ b/jerry-core/ecma/base/ecma-globals.h @@ -202,20 +202,25 @@ enum ECMA_VALUE_TRUE = ECMA_MAKE_VALUE (3), /**< boolean true */ ECMA_VALUE_UNDEFINED = ECMA_MAKE_VALUE (4), /**< undefined value */ ECMA_VALUE_NULL = ECMA_MAKE_VALUE (5), /**< null value */ - ECMA_VALUE_ARRAY_HOLE = ECMA_MAKE_VALUE (6), /**< array hole, used for - * initialization of an array literal */ + ECMA_VALUE_UNINITIALIZED = ECMA_MAKE_VALUE (6), /**< a special value for uninitialized let/const declarations */ ECMA_VALUE_NOT_FOUND = ECMA_MAKE_VALUE (7), /**< a special value returned by * ecma_op_object_find */ - ECMA_VALUE_REGISTER_REF = ECMA_MAKE_VALUE (8), /**< register reference, + /* Values for controlling the VM */ + ECMA_VALUE_ARRAY_HOLE = ECMA_MAKE_VALUE (8), /**< array hole, used for + * initialization of an array literal */ + ECMA_VALUE_REGISTER_REF = ECMA_MAKE_VALUE (9), /**< register reference, * a special "base" value for vm */ - ECMA_VALUE_RELEASE_LEX_ENV = ECMA_MAKE_VALUE (9), /**< if this error remains on the stack when an exception occours + ECMA_VALUE_RELEASE_LEX_ENV = ECMA_MAKE_VALUE (10), /**< if this error remains on the stack when an exception occurs the top lexical environment of the VM frame should be popped */ - ECMA_VALUE_UNINITIALIZED = ECMA_MAKE_VALUE (10), /**< a special value for uninitialized let/const declarations */ ECMA_VALUE_SPREAD_ELEMENT = ECMA_MAKE_VALUE (11), /**< a special value for spread elements in array initialization * or function call argument list */ - ECMA_VALUE_SYNC_ITERATOR = ECMA_MAKE_VALUE (12), /**< option for ecma_op_get_iterator: sync iterator is requested */ - ECMA_VALUE_ASYNC_ITERATOR = ECMA_MAKE_VALUE (13), /**< option for ecma_op_get_iterator: async iterator is requested */ - ECMA_VALUE_INITIALIZED = ECMA_MAKE_VALUE (14), /**< represents initialized mapped arguments formal parameter */ + /* Other values */ + ECMA_VALUE_INITIALIZED = ECMA_MAKE_VALUE (12), /**< represents initialized mapped arguments formal parameter */ +#if ENABLED (JERRY_ESNEXT) + ECMA_VALUE_SYNC_ITERATOR = ECMA_MAKE_VALUE (13), /**< option for ecma_op_get_iterator: sync iterator is requested */ + ECMA_VALUE_ASYNC_ITERATOR = ECMA_MAKE_VALUE (14), /**< option for ecma_op_get_iterator: async iterator is requested */ + ECMA_VALUE_GLOBAL_THIS = ECMA_MAKE_VALUE (15), /**< globalThis built-in */ +#endif /* ENABLED (JERRY_ESNEXT) */ }; #if !ENABLED (JERRY_NUMBER_TYPE_FLOAT64) diff --git a/jerry-core/ecma/base/ecma-helpers-string.c b/jerry-core/ecma/base/ecma-helpers-string.c index 5f83ab278..6329b0b8d 100644 --- a/jerry-core/ecma/base/ecma-helpers-string.c +++ b/jerry-core/ecma/base/ecma-helpers-string.c @@ -210,6 +210,9 @@ ecma_new_ecma_string_from_magic_string_ex_id (lit_magic_string_ex_id_t id) /**< /** * Allocate new ecma-string and fill it with reference to the symbol descriptor * + * Note: + * Takes the reference to the string_desc + * * @return pointer to ecma-string descriptor */ ecma_string_t * diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-global.inc.h b/jerry-core/ecma/builtin-objects/ecma-builtin-global.inc.h index 2a3f2783b..f5fc51ef4 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-global.inc.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-global.inc.h @@ -247,6 +247,11 @@ OBJECT_VALUE (LIT_MAGIC_STRING_WEAKSET_UL, OBJECT_VALUE (LIT_MAGIC_STRING_SYMBOL_UL, ECMA_BUILTIN_ID_SYMBOL, ECMA_PROPERTY_CONFIGURABLE_WRITABLE) + +/* ECMA-262 v11, 18.1.1 */ +SIMPLE_VALUE (LIT_MAGIC_STRING_GLOBAL_THIS_UL, + ECMA_VALUE_GLOBAL_THIS, + ECMA_PROPERTY_CONFIGURABLE_WRITABLE) #endif /* ENABLED (JERRY_ESNEXT) */ #if ENABLED (JERRY_BUILTIN_DATAVIEW) diff --git a/jerry-core/ecma/builtin-objects/ecma-builtins.c b/jerry-core/ecma/builtin-objects/ecma-builtins.c index a15253d31..01f71d448 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtins.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtins.c @@ -851,6 +851,15 @@ ecma_builtin_try_to_instantiate_property (ecma_object_t *object_p, /**< object * case ECMA_BUILTIN_PROPERTY_SIMPLE: { value = curr_property_p->value; + +#if ENABLED (JERRY_ESNEXT) + if (value == ECMA_VALUE_GLOBAL_THIS) + { + ecma_object_t *global_object_p = ecma_builtin_get_global (); + ecma_ref_object (global_object_p); + value = ecma_make_object_value (global_object_p); + } +#endif /* ENABLED (JERRY_ESNEXT) */ break; } case ECMA_BUILTIN_PROPERTY_NUMBER: @@ -919,15 +928,11 @@ ecma_builtin_try_to_instantiate_property (ecma_object_t *object_p, /**< object * #if ENABLED (JERRY_ESNEXT) case ECMA_BUILTIN_PROPERTY_SYMBOL: { - ecma_stringbuilder_t builder = ecma_stringbuilder_create_raw ((lit_utf8_byte_t *) "Symbol.", 7); + ecma_string_t *symbol_dot_p = ecma_get_magic_string (LIT_MAGIC_STRING_SYMBOL_DOT_UL); + ecma_string_t *name_p = ecma_get_magic_string ((lit_magic_string_id_t) curr_property_p->value); + ecma_string_t *descriptor_p = ecma_concat_ecma_strings (symbol_dot_p, name_p); - lit_magic_string_id_t symbol_desc_id = (lit_magic_string_id_t) curr_property_p->value; - - ecma_stringbuilder_append_magic (&builder, symbol_desc_id); - - ecma_value_t symbol_desc_value = ecma_make_string_value (ecma_stringbuilder_finalize (&builder)); - - ecma_string_t *symbol_p = ecma_new_symbol_from_descriptor_string (symbol_desc_value); + ecma_string_t *symbol_p = ecma_new_symbol_from_descriptor_string (ecma_make_string_value (descriptor_p)); lit_magic_string_id_t symbol_id = (lit_magic_string_id_t) curr_property_p->magic_string_id; symbol_p->u.hash = (uint16_t) ((symbol_id << ECMA_GLOBAL_SYMBOL_SHIFT) | ECMA_GLOBAL_SYMBOL_FLAG); @@ -1024,10 +1029,7 @@ ecma_builtin_try_to_instantiate_property (ecma_object_t *object_p, /**< object * prop_value_p->value = value; /* Reference count of objects must be decreased. */ - if (ecma_is_value_object (value)) - { - ecma_free_value (value); - } + ecma_deref_if_object (value); } return prop_p; diff --git a/jerry-core/lit/lit-magic-strings.inc.h b/jerry-core/lit/lit-magic-strings.inc.h index 9772976b6..54cde1d6f 100644 --- a/jerry-core/lit/lit-magic-strings.inc.h +++ b/jerry-core/lit/lit-magic-strings.inc.h @@ -443,6 +443,9 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_REFLECT_UL, "Reflect") #if ENABLED (JERRY_BUILTIN_MATH) LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SQRT1_2_U, "SQRT1_2") #endif +#if ENABLED (JERRY_ESNEXT) +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SYMBOL_DOT_UL, "Symbol.") +#endif #if ENABLED (JERRY_BUILTIN_CONTAINER) \ || ENABLED (JERRY_BUILTIN_WEAKMAP) LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_WEAKMAP_UL, "WeakMap") @@ -716,6 +719,9 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_GET_MINUTES_UL, "getMinutes") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_GET_SECONDS_UL, "getSeconds") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_GET_UTC_DATE_UL, "getUTCDate") #endif +#if ENABLED (JERRY_ESNEXT) +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_GLOBAL_THIS_UL, "globalThis") +#endif #if !ENABLED (JERRY_ESNEXT) && ENABLED (JERRY_BUILTIN_REGEXP) \ || ENABLED (JERRY_BUILTIN_REGEXP) && ENABLED (JERRY_ESNEXT) \ || ENABLED (JERRY_BUILTIN_REGEXP) && !(ENABLED (JERRY_ESNEXT)) diff --git a/jerry-core/lit/lit-magic-strings.ini b/jerry-core/lit/lit-magic-strings.ini index 37fc77eb3..3d95fd278 100644 --- a/jerry-core/lit/lit-magic-strings.ini +++ b/jerry-core/lit/lit-magic-strings.ini @@ -181,6 +181,7 @@ LIT_MAGIC_STRING_BOOLEAN_UL = "Boolean" LIT_MAGIC_STRING_FINALLY = "finally" LIT_MAGIC_STRING_PROMISE_UL = "Promise" LIT_MAGIC_STRING_REFLECT_UL = "Reflect" +LIT_MAGIC_STRING_SYMBOL_DOT_UL = "Symbol." LIT_MAGIC_STRING_SQRT1_2_U = "SQRT1_2" LIT_MAGIC_STRING_BOOLEAN = "boolean" LIT_MAGIC_STRING_COMPILE = "compile" @@ -287,6 +288,7 @@ LIT_MAGIC_STRING_GET_FLOAT_64_UL = "getFloat64" LIT_MAGIC_STRING_GET_MINUTES_UL = "getMinutes" LIT_MAGIC_STRING_GET_SECONDS_UL = "getSeconds" LIT_MAGIC_STRING_GET_UTC_DATE_UL = "getUTCDate" +LIT_MAGIC_STRING_GLOBAL_THIS_UL = "globalThis" LIT_MAGIC_STRING_IGNORECASE_UL = "ignoreCase" LIT_MAGIC_STRING_PARSE_FLOAT = "parseFloat" LIT_MAGIC_STRING_REPLACE_ALL = "replaceAll" diff --git a/tests/jerry/es.next/global-this.js b/tests/jerry/es.next/global-this.js new file mode 100644 index 000000000..43df0ed15 --- /dev/null +++ b/tests/jerry/es.next/global-this.js @@ -0,0 +1,19 @@ +// Copyright JS Foundation and other contributors, http://js.foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +assert(this === globalThis) +assert(this.globalThis === globalThis) + +globalThis = "X" +assert(globalThis === "X") diff --git a/tests/test262-esnext-excludelist.xml b/tests/test262-esnext-excludelist.xml index 2d27282c6..fa1f18b5c 100644 --- a/tests/test262-esnext-excludelist.xml +++ b/tests/test262-esnext-excludelist.xml @@ -481,8 +481,6 @@ - -