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 @@
-
-