From 99c7099eaa8de54a3f8f04fe512f73bd94f36e40 Mon Sep 17 00:00:00 2001 From: kisbg Date: Wed, 7 Oct 2020 15:05:17 +0200 Subject: [PATCH] Update object.prototype.toString to conform ES11 standard (#4196) JerryScript-DCO-1.0-Signed-off-by: bence gabor kis kisbg@inf.u-szeged.hu --- .../ecma/builtin-objects/ecma-builtin-helpers.c | 12 ++++++++++++ jerry-core/ecma/operations/ecma-objects.c | 13 +++++++++++++ tests/jerry/es.next/object-prototype-tostring.js | 12 ++++++------ tests/test262-esnext-excludelist.xml | 4 ---- 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-helpers.c b/jerry-core/ecma/builtin-objects/ecma-builtin-helpers.c index ad809fc25..bc0537faf 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-helpers.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-helpers.c @@ -167,6 +167,18 @@ ecma_builtin_helper_object_to_string (const ecma_value_t this_arg) /**< this arg ecma_deref_object (obj_p); return ecma_builtin_helper_object_to_string_tag_helper (tag); } + else if (builtin_tag != LIT_MAGIC_STRING_ARGUMENTS_UL + && builtin_tag != LIT_MAGIC_STRING_FUNCTION_UL + && builtin_tag != LIT_MAGIC_STRING_ERROR_UL + && builtin_tag != LIT_MAGIC_STRING_BOOLEAN_UL + && builtin_tag != LIT_MAGIC_STRING_NUMBER_UL + && builtin_tag != LIT_MAGIC_STRING_STRING_UL + && builtin_tag != LIT_MAGIC_STRING_DATE_UL + && builtin_tag != LIT_MAGIC_STRING_REGEXP_UL + && builtin_tag != LIT_MAGIC_STRING_ARRAY_UL) + { + builtin_tag = LIT_MAGIC_STRING_OBJECT_UL; + } ecma_free_value (tag); #endif /* ENABLED (JERRY_ESNEXT) */ diff --git a/jerry-core/ecma/operations/ecma-objects.c b/jerry-core/ecma/operations/ecma-objects.c index 448efd5b7..6237f3589 100644 --- a/jerry-core/ecma/operations/ecma-objects.c +++ b/jerry-core/ecma/operations/ecma-objects.c @@ -2670,6 +2670,19 @@ ecma_object_get_class_name (ecma_object_t *obj_p) /**< object */ { return LIT_MAGIC_STRING_FUNCTION_UL; } +#if ENABLED (JERRY_ESNEXT) + case ECMA_OBJECT_TYPE_PROXY: + { + ecma_proxy_object_t *proxy_obj_p = (ecma_proxy_object_t *) obj_p; + + if (!ecma_is_value_null (proxy_obj_p->target) && ecma_is_value_object (proxy_obj_p->target)) + { + ecma_object_t *target_obj_p = ecma_get_object_from_value (proxy_obj_p->target); + return ecma_object_get_class_name (target_obj_p); + } + return LIT_MAGIC_STRING_OBJECT_UL; + } +#endif /* ENABLED (JERRY_ESNEXT) */ default: { JERRY_ASSERT (type == ECMA_OBJECT_TYPE_GENERAL || type == ECMA_OBJECT_TYPE_PROXY); diff --git a/tests/jerry/es.next/object-prototype-tostring.js b/tests/jerry/es.next/object-prototype-tostring.js index 8347de579..b8e58279d 100644 --- a/tests/jerry/es.next/object-prototype-tostring.js +++ b/tests/jerry/es.next/object-prototype-tostring.js @@ -21,7 +21,7 @@ assert (Symbol.prototype[Symbol.toStringTag] === undefined); Symbol.prototype[Symbol.toStringTag] = "myStringTag1"; assert (Object.prototype.toString.call (Symbol ()) === "[object myStringTag1]"); Symbol.prototype[Symbol.toStringTag] = {}; -assert (Object.prototype.toString.call (Symbol ()) === "[object Symbol]"); +assert (Object.prototype.toString.call (Symbol ()) === "[object Object]"); /* Math @@toStringTag */ assert (Math[Symbol.toStringTag] === "Math"); @@ -32,7 +32,7 @@ assert (Math[Symbol.toStringTag] === undefined); Math[Symbol.toStringTag] = "myStringTag2"; assert (Object.prototype.toString.call (Math) === "[object myStringTag2]"); Math[Symbol.toStringTag] = {}; -assert (Object.prototype.toString.call (Math) === "[object Math]"); +assert (Object.prototype.toString.call (Math) === "[object Object]"); /* ArrayBuffer.prototype @@toStringTag */ assert (ArrayBuffer.prototype[Symbol.toStringTag] === "ArrayBuffer"); @@ -43,7 +43,7 @@ assert (ArrayBuffer.prototype[Symbol.toStringTag] === undefined); ArrayBuffer.prototype[Symbol.toStringTag] = "myStringTag3"; assert (Object.prototype.toString.call (new ArrayBuffer ()) === "[object myStringTag3]"); ArrayBuffer.prototype[Symbol.toStringTag] = {}; -assert (ArrayBuffer.prototype.toString.call (new ArrayBuffer ()) === "[object ArrayBuffer]"); +assert (ArrayBuffer.prototype.toString.call (new ArrayBuffer ()) === "[object Object]"); /* Promise.prototype @@toStringTag */ assert (Promise.prototype[Symbol.toStringTag] === "Promise"); @@ -54,7 +54,7 @@ assert (Promise.prototype[Symbol.toStringTag] === undefined); Promise.prototype[Symbol.toStringTag] = "myStringTag4"; assert (Object.prototype.toString.call (new Promise (function () {})) === "[object myStringTag4]"); Promise.prototype[Symbol.toStringTag] = {}; -assert (Promise.prototype.toString.call (new Promise (function () {})) === "[object Promise]"); +assert (Promise.prototype.toString.call (new Promise (function () {})) === "[object Object]"); /* Map.prototype @@toStringTag */ assert (Map.prototype[Symbol.toStringTag] === "Map"); @@ -67,7 +67,7 @@ Map.prototype[Symbol.toStringTag] = "myStringTag5"; assert (Map.prototype.toString.call (new Map ()) === "[object myStringTag5]"); assert (Object.prototype.toString.call (Map) === "[object Function]"); Map.prototype[Symbol.toStringTag] = {}; -assert (Map.prototype.toString.call (new Map) === "[object Map]"); +assert (Map.prototype.toString.call (new Map) === "[object Object]"); /* JSON @@toStringTag */ assert (JSON[Symbol.toStringTag] === "JSON"); @@ -78,7 +78,7 @@ assert (JSON[Symbol.toStringTag] === undefined); JSON[Symbol.toStringTag] = "myStringTag6"; assert (Map.prototype.toString.call (JSON) === "[object myStringTag6]"); JSON[Symbol.toStringTag] = {}; -assert (Object.prototype.toString.call (JSON) === "[object JSON]"); +assert (Object.prototype.toString.call (JSON) === "[object Object]"); var typedArrayTypes = ["Int8Array", "Uint8Array", diff --git a/tests/test262-esnext-excludelist.xml b/tests/test262-esnext-excludelist.xml index dc5e32e84..458141395 100644 --- a/tests/test262-esnext-excludelist.xml +++ b/tests/test262-esnext-excludelist.xml @@ -806,9 +806,6 @@ - - - Test expects incorrect call order @@ -8926,5 +8923,4 @@ -