Make the Set.prototype values, keys and [@@iterator] methods to be one intrinsic method (#3777)

After this patch these methods will be the same function objects

JerryScript-DCO-1.0-Signed-off-by: Adam Szilagyi aszilagy@inf.u-szeged.hu
This commit is contained in:
Szilagyi Adam
2020-06-18 13:59:31 +02:00
committed by GitHub
parent 16750e8171
commit 0f0041d720
8 changed files with 52 additions and 7 deletions
@@ -14,6 +14,7 @@
*/
#include "ecma-builtins.h"
#include "ecma-container-object.h"
#include "ecma-array-object.h"
#include "ecma-gc.h"
#include "lit-char-helpers.h"
@@ -36,7 +37,8 @@ enum
ECMA_INTRINSIC_ROUTINE_START = ECMA_BUILTIN_ID__COUNT - 1,
ECMA_INTRINSIC_PARSE_FLOAT,
ECMA_INTRINSIC_PARSE_INT,
ECMA_INTRINSIC_ARRAY_PROTOTYPE_VALUES
ECMA_INTRINSIC_ARRAY_PROTOTYPE_VALUES,
ECMA_INTRINSIC_SET_PROTOTYPE_KEYS
};
#define BUILTIN_INC_HEADER_NAME "ecma-builtin-intrinsic.inc.h"
@@ -81,6 +83,32 @@ ecma_builtin_intrinsic_array_prototype_values (ecma_value_t this_value) /**< thi
return ret_value;
} /* ecma_builtin_intrinsic_array_prototype_values */
/**
* The Set.prototype values, keys and [@@iterator] routines
*
* See also:
* ECMA-262 v6, 23.2.3.8
* ECMA-262 v6, 23.2.3.10
*
* @return ecma value
* Returned value must be freed with ecma_free_value.
*/
static ecma_value_t
ecma_builtin_intrinsic_set_prototype_keys (ecma_value_t this_value)
{
ecma_extended_object_t *map_object_p = ecma_op_container_get_object (this_value, LIT_MAGIC_STRING_SET_UL);
if (map_object_p == NULL)
{
return ECMA_VALUE_ERROR;
}
return ecma_op_container_create_iterator (this_value,
0,
ECMA_BUILTIN_ID_SET_ITERATOR_PROTOTYPE,
ECMA_PSEUDO_SET_ITERATOR);
} /* ecma_builtin_intrinsic_set_prototype_keys */
/**
* Dispatcher of the built-in's routines
*
@@ -103,6 +131,12 @@ ecma_builtin_intrinsic_dispatch_routine (uint16_t builtin_routine_id, /**< built
{
return ecma_builtin_intrinsic_array_prototype_values (this_arg);
}
if (builtin_routine_id == ECMA_INTRINSIC_SET_PROTOTYPE_KEYS)
{
return ecma_builtin_intrinsic_set_prototype_keys (this_arg);
}
ecma_value_t ret_value = ECMA_VALUE_EMPTY;
if (builtin_routine_id <= ECMA_INTRINSIC_PARSE_INT)
{
@@ -69,5 +69,6 @@ SYMBOL_VALUE (LIT_GLOBAL_SYMBOL_UNSCOPABLES,
ROUTINE (LIT_MAGIC_STRING_PARSE_FLOAT, ECMA_INTRINSIC_PARSE_FLOAT, 1, 1)
ROUTINE (LIT_MAGIC_STRING_PARSE_INT, ECMA_INTRINSIC_PARSE_INT, 2, 2)
ROUTINE (LIT_INTERNAL_MAGIC_STRING_ARRAY_PROTOTYPE_VALUES, ECMA_INTRINSIC_ARRAY_PROTOTYPE_VALUES, 0, 0)
ROUTINE (LIT_INTERNAL_MAGIC_STRING_SET_PROTOTYPE_KEYS, ECMA_INTRINSIC_SET_PROTOTYPE_KEYS, 0, 0)
#endif /* ENABLED (JERRY_ESNEXT) */
#include "ecma-builtin-helpers-macro-undefs.inc.h"
@@ -45,9 +45,13 @@ ROUTINE (LIT_MAGIC_STRING_FOR_EACH_UL, ECMA_CONTAINER_ROUTINE_FOREACH, 2, 1)
ROUTINE (LIT_MAGIC_STRING_HAS, ECMA_CONTAINER_ROUTINE_HAS, 1, 1)
#if ENABLED (JERRY_ESNEXT)
ROUTINE (LIT_MAGIC_STRING_ENTRIES, ECMA_CONTAINER_ROUTINE_ENTRIES, 0, 0)
ROUTINE (LIT_MAGIC_STRING_VALUES, ECMA_CONTAINER_ROUTINE_VALUES, 0, 0)
ROUTINE (LIT_GLOBAL_SYMBOL_ITERATOR, ECMA_CONTAINER_ROUTINE_VALUES, 0, 0)
ROUTINE (LIT_MAGIC_STRING_KEYS, ECMA_CONTAINER_ROUTINE_KEYS, 0, 0)
INTRINSIC_PROPERTY (LIT_MAGIC_STRING_VALUES, LIT_INTERNAL_MAGIC_STRING_SET_PROTOTYPE_KEYS,
ECMA_PROPERTY_CONFIGURABLE_WRITABLE)
INTRINSIC_PROPERTY (LIT_GLOBAL_SYMBOL_ITERATOR, LIT_INTERNAL_MAGIC_STRING_SET_PROTOTYPE_KEYS,
ECMA_PROPERTY_CONFIGURABLE_WRITABLE)
INTRINSIC_PROPERTY (LIT_MAGIC_STRING_KEYS, LIT_INTERNAL_MAGIC_STRING_SET_PROTOTYPE_KEYS,
ECMA_PROPERTY_CONFIGURABLE_WRITABLE)
#endif /* ENABLED (JERRY_ESNEXT) */
ACCESSOR_READ_ONLY (LIT_MAGIC_STRING_SIZE,
@@ -725,6 +725,10 @@ ecma_builtin_routine_try_to_instantiate_property (ecma_object_t *object_p, /**<
{
name_p = ecma_get_magic_string (LIT_MAGIC_STRING_VALUES);
}
else if (JERRY_UNLIKELY (name_id == LIT_INTERNAL_MAGIC_STRING_SET_PROTOTYPE_KEYS))
{
name_p = ecma_get_magic_string (LIT_MAGIC_STRING_VALUES);
}
else
{
JERRY_ASSERT (LIT_IS_GLOBAL_SYMBOL (name_id));
+1
View File
@@ -49,6 +49,7 @@ typedef enum
LIT_INTERNAL_MAGIC_STRING_MAP_KEY, /**< Property key used when an object is a key in a map object */
LIT_INTERNAL_MAGIC_API_INTERNAL, /**< Property key used to add non-visible JS properties from the public API */
LIT_INTERNAL_MAGIC_STRING_ARRAY_PROTOTYPE_VALUES, /**< %ArrayProto_values% intrinsic routine */
LIT_INTERNAL_MAGIC_STRING_SET_PROTOTYPE_KEYS, /**< Set.prototype values, keys and [@@iterator] routines */
LIT_INTERNAL_MAGIC_THIS_BINDING_VALUE, /**< FunctionEnvironmentRecord [[ThisBindingValue]] internal slot */
/* List of well known symbols */
LIT_GLOBAL_SYMBOL_HAS_INSTANCE, /**< @@hasInstance well known symbol */
+2 -1
View File
@@ -53,7 +53,8 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_MAP_UL, "Map")
#endif
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_NAN, "NaN")
#if ENABLED (JERRY_BUILTIN_CONTAINER) \
|| ENABLED (JERRY_BUILTIN_SET)
|| ENABLED (JERRY_BUILTIN_SET) \
|| ENABLED (JERRY_ESNEXT)
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SET_UL, "Set")
#endif
#if ENABLED (JERRY_BUILTIN_DATE)
+2
View File
@@ -152,3 +152,5 @@ for (var value of s) {
assert(value === expected[loopCount++]);
}
assert(Set.prototype.values === Set.prototype.keys);
-2
View File
@@ -143,8 +143,6 @@
<test id="built-ins/RegExp/prototype/Symbol.search/get-sticky-coerce.js"><reason></reason></test>
<test id="built-ins/RegExp/prototype/Symbol.search/get-sticky-err.js"><reason></reason></test>
<test id="built-ins/RegExp/prototype/test/get-sticky-err.js"><reason></reason></test>
<test id="built-ins/Set/prototype/keys/keys.js"><reason></reason></test>
<test id="built-ins/Set/prototype/Symbol.iterator.js"><reason></reason></test>
<test id="built-ins/String/prototype/normalize/form-is-not-valid-throws.js"><reason></reason></test>
<test id="built-ins/String/prototype/normalize/length.js"><reason></reason></test>
<test id="built-ins/String/prototype/normalize/name.js"><reason></reason></test>