From 0f0041d720adfd83012e59435c2f1b555c1234d5 Mon Sep 17 00:00:00 2001 From: Szilagyi Adam Date: Thu, 18 Jun 2020 13:59:31 +0200 Subject: [PATCH] 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 --- .../builtin-objects/ecma-builtin-intrinsic.c | 36 ++++++++++++++++++- .../ecma-builtin-intrinsic.inc.h | 1 + .../ecma-builtin-set-prototype.inc.h | 10 ++++-- .../ecma/builtin-objects/ecma-builtins.c | 4 +++ jerry-core/lit/lit-magic-strings.h | 1 + jerry-core/lit/lit-magic-strings.inc.h | 3 +- tests/jerry/es.next/set-iterators.js | 2 ++ tests/test262-es6-excludelist.xml | 2 -- 8 files changed, 52 insertions(+), 7 deletions(-) diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-intrinsic.c b/jerry-core/ecma/builtin-objects/ecma-builtin-intrinsic.c index 1c92b6877..e5271bc5b 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-intrinsic.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-intrinsic.c @@ -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) { diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-intrinsic.inc.h b/jerry-core/ecma/builtin-objects/ecma-builtin-intrinsic.inc.h index edc06c633..511806cf9 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-intrinsic.inc.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-intrinsic.inc.h @@ -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" diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-set-prototype.inc.h b/jerry-core/ecma/builtin-objects/ecma-builtin-set-prototype.inc.h index 861511771..f745a57c6 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-set-prototype.inc.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-set-prototype.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, diff --git a/jerry-core/ecma/builtin-objects/ecma-builtins.c b/jerry-core/ecma/builtin-objects/ecma-builtins.c index 035bf462e..8b3037a31 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtins.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtins.c @@ -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)); diff --git a/jerry-core/lit/lit-magic-strings.h b/jerry-core/lit/lit-magic-strings.h index ff3a84ad7..990264e6a 100644 --- a/jerry-core/lit/lit-magic-strings.h +++ b/jerry-core/lit/lit-magic-strings.h @@ -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 */ diff --git a/jerry-core/lit/lit-magic-strings.inc.h b/jerry-core/lit/lit-magic-strings.inc.h index e890a53d1..22f38e167 100644 --- a/jerry-core/lit/lit-magic-strings.inc.h +++ b/jerry-core/lit/lit-magic-strings.inc.h @@ -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) diff --git a/tests/jerry/es.next/set-iterators.js b/tests/jerry/es.next/set-iterators.js index 31423a359..21c299784 100644 --- a/tests/jerry/es.next/set-iterators.js +++ b/tests/jerry/es.next/set-iterators.js @@ -152,3 +152,5 @@ for (var value of s) { assert(value === expected[loopCount++]); } + +assert(Set.prototype.values === Set.prototype.keys); diff --git a/tests/test262-es6-excludelist.xml b/tests/test262-es6-excludelist.xml index 5920d3b2e..84131e13f 100644 --- a/tests/test262-es6-excludelist.xml +++ b/tests/test262-es6-excludelist.xml @@ -143,8 +143,6 @@ - -