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