Implement ES11 globalThis (#4306)

Also improve symbol built-in instantiation.

JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
Zoltan Herczeg
2020-10-22 10:59:54 +02:00
committed by GitHub
parent a65988798c
commit 91e0cfc767
8 changed files with 62 additions and 22 deletions
+13 -8
View File
@@ -202,20 +202,25 @@ enum
ECMA_VALUE_TRUE = ECMA_MAKE_VALUE (3), /**< boolean true */ ECMA_VALUE_TRUE = ECMA_MAKE_VALUE (3), /**< boolean true */
ECMA_VALUE_UNDEFINED = ECMA_MAKE_VALUE (4), /**< undefined value */ ECMA_VALUE_UNDEFINED = ECMA_MAKE_VALUE (4), /**< undefined value */
ECMA_VALUE_NULL = ECMA_MAKE_VALUE (5), /**< null value */ ECMA_VALUE_NULL = ECMA_MAKE_VALUE (5), /**< null value */
ECMA_VALUE_ARRAY_HOLE = ECMA_MAKE_VALUE (6), /**< array hole, used for ECMA_VALUE_UNINITIALIZED = ECMA_MAKE_VALUE (6), /**< a special value for uninitialized let/const declarations */
* initialization of an array literal */
ECMA_VALUE_NOT_FOUND = ECMA_MAKE_VALUE (7), /**< a special value returned by ECMA_VALUE_NOT_FOUND = ECMA_MAKE_VALUE (7), /**< a special value returned by
* ecma_op_object_find */ * 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 */ * 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 */ 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 ECMA_VALUE_SPREAD_ELEMENT = ECMA_MAKE_VALUE (11), /**< a special value for spread elements in array initialization
* or function call argument list */ * or function call argument list */
ECMA_VALUE_SYNC_ITERATOR = ECMA_MAKE_VALUE (12), /**< option for ecma_op_get_iterator: sync iterator is requested */ /* Other values */
ECMA_VALUE_ASYNC_ITERATOR = ECMA_MAKE_VALUE (13), /**< option for ecma_op_get_iterator: async iterator is requested */ ECMA_VALUE_INITIALIZED = ECMA_MAKE_VALUE (12), /**< represents initialized mapped arguments formal parameter */
ECMA_VALUE_INITIALIZED = ECMA_MAKE_VALUE (14), /**< 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) #if !ENABLED (JERRY_NUMBER_TYPE_FLOAT64)
@@ -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 * 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 * @return pointer to ecma-string descriptor
*/ */
ecma_string_t * ecma_string_t *
@@ -247,6 +247,11 @@ OBJECT_VALUE (LIT_MAGIC_STRING_WEAKSET_UL,
OBJECT_VALUE (LIT_MAGIC_STRING_SYMBOL_UL, OBJECT_VALUE (LIT_MAGIC_STRING_SYMBOL_UL,
ECMA_BUILTIN_ID_SYMBOL, ECMA_BUILTIN_ID_SYMBOL,
ECMA_PROPERTY_CONFIGURABLE_WRITABLE) 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) */ #endif /* ENABLED (JERRY_ESNEXT) */
#if ENABLED (JERRY_BUILTIN_DATAVIEW) #if ENABLED (JERRY_BUILTIN_DATAVIEW)
+14 -12
View File
@@ -851,6 +851,15 @@ ecma_builtin_try_to_instantiate_property (ecma_object_t *object_p, /**< object *
case ECMA_BUILTIN_PROPERTY_SIMPLE: case ECMA_BUILTIN_PROPERTY_SIMPLE:
{ {
value = curr_property_p->value; 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; break;
} }
case ECMA_BUILTIN_PROPERTY_NUMBER: 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) #if ENABLED (JERRY_ESNEXT)
case ECMA_BUILTIN_PROPERTY_SYMBOL: 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_string_t *symbol_p = ecma_new_symbol_from_descriptor_string (ecma_make_string_value (descriptor_p));
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);
lit_magic_string_id_t symbol_id = (lit_magic_string_id_t) curr_property_p->magic_string_id; 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); 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; prop_value_p->value = value;
/* Reference count of objects must be decreased. */ /* Reference count of objects must be decreased. */
if (ecma_is_value_object (value)) ecma_deref_if_object (value);
{
ecma_free_value (value);
}
} }
return prop_p; return prop_p;
+6
View File
@@ -443,6 +443,9 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_REFLECT_UL, "Reflect")
#if ENABLED (JERRY_BUILTIN_MATH) #if ENABLED (JERRY_BUILTIN_MATH)
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SQRT1_2_U, "SQRT1_2") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SQRT1_2_U, "SQRT1_2")
#endif #endif
#if ENABLED (JERRY_ESNEXT)
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SYMBOL_DOT_UL, "Symbol.")
#endif
#if ENABLED (JERRY_BUILTIN_CONTAINER) \ #if ENABLED (JERRY_BUILTIN_CONTAINER) \
|| ENABLED (JERRY_BUILTIN_WEAKMAP) || ENABLED (JERRY_BUILTIN_WEAKMAP)
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_WEAKMAP_UL, "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_SECONDS_UL, "getSeconds")
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_GET_UTC_DATE_UL, "getUTCDate") LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_GET_UTC_DATE_UL, "getUTCDate")
#endif #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) \ #if !ENABLED (JERRY_ESNEXT) && ENABLED (JERRY_BUILTIN_REGEXP) \
|| ENABLED (JERRY_BUILTIN_REGEXP) && ENABLED (JERRY_ESNEXT) \ || ENABLED (JERRY_BUILTIN_REGEXP) && ENABLED (JERRY_ESNEXT) \
|| ENABLED (JERRY_BUILTIN_REGEXP) && !(ENABLED (JERRY_ESNEXT)) || ENABLED (JERRY_BUILTIN_REGEXP) && !(ENABLED (JERRY_ESNEXT))
+2
View File
@@ -181,6 +181,7 @@ LIT_MAGIC_STRING_BOOLEAN_UL = "Boolean"
LIT_MAGIC_STRING_FINALLY = "finally" LIT_MAGIC_STRING_FINALLY = "finally"
LIT_MAGIC_STRING_PROMISE_UL = "Promise" LIT_MAGIC_STRING_PROMISE_UL = "Promise"
LIT_MAGIC_STRING_REFLECT_UL = "Reflect" LIT_MAGIC_STRING_REFLECT_UL = "Reflect"
LIT_MAGIC_STRING_SYMBOL_DOT_UL = "Symbol."
LIT_MAGIC_STRING_SQRT1_2_U = "SQRT1_2" LIT_MAGIC_STRING_SQRT1_2_U = "SQRT1_2"
LIT_MAGIC_STRING_BOOLEAN = "boolean" LIT_MAGIC_STRING_BOOLEAN = "boolean"
LIT_MAGIC_STRING_COMPILE = "compile" 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_MINUTES_UL = "getMinutes"
LIT_MAGIC_STRING_GET_SECONDS_UL = "getSeconds" LIT_MAGIC_STRING_GET_SECONDS_UL = "getSeconds"
LIT_MAGIC_STRING_GET_UTC_DATE_UL = "getUTCDate" LIT_MAGIC_STRING_GET_UTC_DATE_UL = "getUTCDate"
LIT_MAGIC_STRING_GLOBAL_THIS_UL = "globalThis"
LIT_MAGIC_STRING_IGNORECASE_UL = "ignoreCase" LIT_MAGIC_STRING_IGNORECASE_UL = "ignoreCase"
LIT_MAGIC_STRING_PARSE_FLOAT = "parseFloat" LIT_MAGIC_STRING_PARSE_FLOAT = "parseFloat"
LIT_MAGIC_STRING_REPLACE_ALL = "replaceAll" LIT_MAGIC_STRING_REPLACE_ALL = "replaceAll"
+19
View File
@@ -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")
-2
View File
@@ -481,8 +481,6 @@
<test id="built-ins/TypedArrayConstructors/of/custom-ctor-returns-other-instance.js"><reason></reason></test> <test id="built-ins/TypedArrayConstructors/of/custom-ctor-returns-other-instance.js"><reason></reason></test>
<test id="built-ins/TypedArrayConstructors/of/custom-ctor.js"><reason></reason></test> <test id="built-ins/TypedArrayConstructors/of/custom-ctor.js"><reason></reason></test>
<test id="built-ins/TypedArrayConstructors/of/new-instance-using-custom-ctor.js"><reason></reason></test> <test id="built-ins/TypedArrayConstructors/of/new-instance-using-custom-ctor.js"><reason></reason></test>
<test id="built-ins/global/global-object.js"><reason></reason></test>
<test id="built-ins/global/property-descriptor.js"><reason></reason></test>
<test id="harness/isConstructor.js"><reason></reason></test> <test id="harness/isConstructor.js"><reason></reason></test>
<test id="language/block-scope/syntax/redeclaration/async-function-name-redeclaration-attempt-with-async-function.js"><reason></reason></test> <test id="language/block-scope/syntax/redeclaration/async-function-name-redeclaration-attempt-with-async-function.js"><reason></reason></test>
<test id="language/block-scope/syntax/redeclaration/async-function-name-redeclaration-attempt-with-function.js"><reason></reason></test> <test id="language/block-scope/syntax/redeclaration/async-function-name-redeclaration-attempt-with-function.js"><reason></reason></test>