From a8b627a80c131144138bf3f5af78e82eda3630c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81d=C3=A1m=20Kallai?= Date: Tue, 5 Nov 2019 19:38:13 +0100 Subject: [PATCH] Implement Object.is routine from ES2015 specification (#3272) Related part of the standard: ECMA-262 v6, 19.1.2.10 JerryScript-DCO-1.0-Signed-off-by: Adam Kallai kadam@inf.u-szeged.hu --- .../builtin-objects/ecma-builtin-object.c | 24 ++++++++ .../builtin-objects/ecma-builtin-object.inc.h | 1 + jerry-core/lit/lit-magic-strings.inc.h | 5 ++ jerry-core/lit/lit-magic-strings.ini | 1 + tests/jerry/es2015/object-is.js | 56 +++++++++++++++++++ 5 files changed, 87 insertions(+) create mode 100644 tests/jerry/es2015/object-is.js diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-object.c b/jerry-core/ecma/builtin-objects/ecma-builtin-object.c index 293871a5c..77d7a5b53 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-object.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-object.c @@ -56,6 +56,7 @@ enum ECMA_OBJECT_ROUTINE_GET_PROTOTYPE_OF, ECMA_OBJECT_ROUTINE_SET_PROTOTYPE_OF, ECMA_OBJECT_ROUTINE_ASSIGN, + ECMA_OBJECT_ROUTINE_IS, }; #define BUILTIN_INC_HEADER_NAME "ecma-builtin-object.inc.h" @@ -876,6 +877,25 @@ ecma_builtin_object_object_assign (const ecma_value_t arguments_list_p[], /**< a } /* ecma_builtin_object_object_assign */ #endif /* ENABLED (JERRY_ES2015_BUILTIN) */ +#if ENABLED (JERRY_ES2015_BUILTIN) +/** + * The Object object's 'is' routine + * + * See also: + * ECMA-262 v6, 19.1.2.10 + * + * @return ecma value + * Returned value must be freed with ecma_free_value. + */ +static ecma_value_t +ecma_builtin_object_object_is (ecma_value_t arg1, /**< routine's first argument */ + ecma_value_t arg2) /**< routine's second argument */ +{ + return ecma_op_same_value (arg1, arg2) ? ECMA_VALUE_TRUE : ECMA_VALUE_FALSE; +} /* ecma_builtin_object_object_is */ +#endif /* ENABLED (JERRY_ES2015_BUILTIN) */ + + /** * Dispatcher of the built-in's routines * @@ -917,6 +937,10 @@ ecma_builtin_object_dispatch_routine (uint16_t builtin_routine_id, /**< built-in { return ecma_builtin_object_object_assign (arguments_list_p, arguments_number); } + case ECMA_OBJECT_ROUTINE_IS: + { + return ecma_builtin_object_object_is (arg1, arg2); + } #endif /* ENABLED (JERRY_ES2015_BUILTIN) */ default: { diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-object.inc.h b/jerry-core/ecma/builtin-objects/ecma-builtin-object.inc.h index 703d2f984..6aa65fec2 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-object.inc.h +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-object.inc.h @@ -57,6 +57,7 @@ ROUTINE (LIT_MAGIC_STRING_DEFINE_PROPERTY_UL, ECMA_OBJECT_ROUTINE_DEFINE_PROPERT #if ENABLED (JERRY_ES2015_BUILTIN) ROUTINE (LIT_MAGIC_STRING_SET_PROTOTYPE_OF_UL, ECMA_OBJECT_ROUTINE_SET_PROTOTYPE_OF, 2, 2) ROUTINE (LIT_MAGIC_STRING_ASSIGN, ECMA_OBJECT_ROUTINE_ASSIGN, NON_FIXED, 2) +ROUTINE (LIT_MAGIC_STRING_IS, ECMA_OBJECT_ROUTINE_IS, 2, 2) #endif /* ENABLED (JERRY_ES2015_BUILTIN) */ #include "ecma-builtin-helpers-macro-undefs.inc.h" diff --git a/jerry-core/lit/lit-magic-strings.inc.h b/jerry-core/lit/lit-magic-strings.inc.h index 93c9e8235..53bebf17a 100644 --- a/jerry-core/lit/lit-magic-strings.inc.h +++ b/jerry-core/lit/lit-magic-strings.inc.h @@ -35,6 +35,9 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_RIGHT_SQUARE_CHAR, "]") #if ENABLED (JERRY_BUILTIN_MATH) LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_PI_U, "PI") #endif +#if ENABLED (JERRY_ES2015_BUILTIN) +LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_IS, "is") +#endif #if ENABLED (JERRY_ES2015_BUILTIN_TYPEDARRAY) LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_OF, "of") #endif @@ -778,6 +781,8 @@ LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (0, LIT_MAGIC_STRING__EMPTY) LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (1, LIT_MAGIC_STRING_SPACE_CHAR) #if ENABLED (JERRY_BUILTIN_MATH) LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (2, LIT_MAGIC_STRING_PI_U) +#elif ENABLED (JERRY_ES2015_BUILTIN) +LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (2, LIT_MAGIC_STRING_IS) #elif ENABLED (JERRY_ES2015_BUILTIN_TYPEDARRAY) LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (2, LIT_MAGIC_STRING_OF) #elif ENABLED (JERRY_BUILTIN_MATH) diff --git a/jerry-core/lit/lit-magic-strings.ini b/jerry-core/lit/lit-magic-strings.ini index afb493bd9..072d2ca59 100644 --- a/jerry-core/lit/lit-magic-strings.ini +++ b/jerry-core/lit/lit-magic-strings.ini @@ -32,6 +32,7 @@ LIT_MAGIC_STRING_E_U = "E" LIT_MAGIC_STRING_LEFT_SQUARE_CHAR = "[" LIT_MAGIC_STRING_RIGHT_SQUARE_CHAR = "]" LIT_MAGIC_STRING_PI_U = "PI" +LIT_MAGIC_STRING_IS = "is" LIT_MAGIC_STRING_OF = "of" LIT_MAGIC_STRING_LN2_U = "LN2" LIT_MAGIC_STRING_MAP_UL = "Map" diff --git a/tests/jerry/es2015/object-is.js b/tests/jerry/es2015/object-is.js new file mode 100644 index 000000000..0aad3a2d9 --- /dev/null +++ b/tests/jerry/es2015/object-is.js @@ -0,0 +1,56 @@ +// 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(Object.is(2, "foo") === false); +assert(Object.is(null, 2) === false); + +var x; +assert(Object.is(x, 2) === false); + +assert(Object.is(null, null) === true); + +assert(Object.is(2, 8) === false); +assert(Object.is(8, 8) === true); + +assert(Object.is('foo', 'foo') === true); +assert(Object.is('foo', 'bar') === false); +assert(Object.is(new String('foo'), 'foo') === false); + +assert(Object.is([], []) === false); + +assert(Object.is(true, true) === true); +assert(Object.is(false, false) === true); +assert(Object.is(true, false) === false); +assert(Object.is(false, true) === false); +assert(Object.is("", false) === false); +assert(Object.is(0, false) === false); + +sym1 = Symbol.for('foo'); +sym2 = Symbol.for('foo'); +assert(Object.is(sym1, sym2) === true); +assert(Object.is(Symbol('foo'), Symbol('foo')) === false); + +var foo = { a: 1 }; +var bar = { a: 1 }; +var zoo = foo; +assert(Object.is(foo, foo) === true); +assert(Object.is(foo, bar) === false); +assert(Object.is(foo, zoo) === true); + +// Special Cases +assert(Object.is(+0, -0) === false); +assert(Object.is(+0, 0) === true); +assert(Object.is(-0, -0) === true); +assert(Object.is(-0, 0) === false); +assert(Object.is(NaN, 0/0) === true);