From 8ddd24f870de39e30cf15b734451cd6f42b35ecc Mon Sep 17 00:00:00 2001 From: kisbg Date: Mon, 11 Jan 2021 15:08:21 +0100 Subject: [PATCH] Add new target support to Error object and NativeErrors (#4372) EcmaScript 11 19.5.1.1 Error EcmaScript 11 19.5.6.1.1 NativeError JerryScript-DCO-1.0-Signed-off-by: bence gabor kis kisbg@inf.u-szeged.hu --- .../ecma/builtin-objects/ecma-builtin-error.c | 24 ++++++++++++++ .../builtin-objects/ecma-builtin-evalerror.c | 24 ++++++++++++++ .../builtin-objects/ecma-builtin-rangeerror.c | 24 ++++++++++++++ .../ecma-builtin-referenceerror.c | 24 ++++++++++++++ .../ecma-builtin-syntaxerror.c | 24 ++++++++++++++ .../builtin-objects/ecma-builtin-typeerror.c | 24 ++++++++++++++ .../builtin-objects/ecma-builtin-urierror.c | 24 ++++++++++++++ tests/jerry/es.next/new-target-error.js | 32 +++++++++++++++++++ tests/test262-esnext-excludelist.xml | 7 ---- 9 files changed, 200 insertions(+), 7 deletions(-) create mode 100644 tests/jerry/es.next/new-target-error.js diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-error.c b/jerry-core/ecma/builtin-objects/ecma-builtin-error.c index 78e132eb0..b6404deb0 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-error.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-error.c @@ -22,7 +22,9 @@ #include "ecma-helpers.h" #include "ecma-builtin-helpers.h" #include "ecma-objects.h" +#include "ecma-function-object.h" #include "jrt.h" +#include "jcontext.h" #define ECMA_BUILTINS_INTERNAL #include "ecma-builtins-internal.h" @@ -62,7 +64,29 @@ ecma_value_t ecma_builtin_error_dispatch_construct (const ecma_value_t *arguments_list_p, /**< arguments list */ uint32_t arguments_list_len) /**< number of arguments */ { +#if !ENABLED (JERRY_ESNEXT) return ecma_builtin_error_dispatch_call (arguments_list_p, arguments_list_len); +#else /* ENABLED (JERRY_ESNEXT) */ + ecma_object_t *proto_p = ecma_op_get_prototype_from_constructor (JERRY_CONTEXT (current_new_target), + ECMA_BUILTIN_ID_ERROR_PROTOTYPE); + + if (proto_p == NULL) + { + return ECMA_VALUE_ERROR; + } + + ecma_value_t result = ecma_builtin_error_dispatch_call (arguments_list_p, arguments_list_len); + + if (!ECMA_IS_VALUE_ERROR (result)) + { + ecma_object_t *object_p = ecma_get_object_from_value (result); + ECMA_SET_NON_NULL_POINTER (object_p->u2.prototype_cp, proto_p); + } + + ecma_deref_object (proto_p); + + return result; +#endif /* ENABLED (JERRY_ESNEXT) */ } /* ecma_builtin_error_dispatch_construct */ /** diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-evalerror.c b/jerry-core/ecma/builtin-objects/ecma-builtin-evalerror.c index 7fd168fd6..80fd6d125 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-evalerror.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-evalerror.c @@ -22,7 +22,9 @@ #include "ecma-helpers.h" #include "ecma-builtin-helpers.h" #include "ecma-objects.h" +#include "ecma-function-object.h" #include "jrt.h" +#include "jcontext.h" #if ENABLED (JERRY_BUILTIN_ERRORS) @@ -64,7 +66,29 @@ ecma_value_t ecma_builtin_eval_error_dispatch_construct (const ecma_value_t *arguments_list_p, /**< arguments list */ uint32_t arguments_list_len) /**< number of arguments */ { +#if !ENABLED (JERRY_ESNEXT) return ecma_builtin_eval_error_dispatch_call (arguments_list_p, arguments_list_len); +#else /* ENABLED (JERRY_ESNEXT) */ + ecma_object_t *proto_p = ecma_op_get_prototype_from_constructor (JERRY_CONTEXT (current_new_target), + ECMA_BUILTIN_ID_EVAL_ERROR_PROTOTYPE); + + if (proto_p == NULL) + { + return ECMA_VALUE_ERROR; + } + + ecma_value_t result = ecma_builtin_eval_error_dispatch_call (arguments_list_p, arguments_list_len); + + if (!ECMA_IS_VALUE_ERROR (result)) + { + ecma_object_t *object_p = ecma_get_object_from_value (result); + ECMA_SET_NON_NULL_POINTER (object_p->u2.prototype_cp, proto_p); + } + + ecma_deref_object (proto_p); + + return result; +#endif /* ENABLED (JERRY_ESNEXT) */ } /* ecma_builtin_eval_error_dispatch_construct */ /** diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-rangeerror.c b/jerry-core/ecma/builtin-objects/ecma-builtin-rangeerror.c index 65a381e02..bebce4c79 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-rangeerror.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-rangeerror.c @@ -22,7 +22,9 @@ #include "ecma-helpers.h" #include "ecma-builtin-helpers.h" #include "ecma-objects.h" +#include "ecma-function-object.h" #include "jrt.h" +#include "jcontext.h" #if ENABLED (JERRY_BUILTIN_ERRORS) @@ -64,7 +66,29 @@ ecma_value_t ecma_builtin_range_error_dispatch_construct (const ecma_value_t *arguments_list_p, /**< arguments list */ uint32_t arguments_list_len) /**< number of arguments */ { +#if !ENABLED (JERRY_ESNEXT) return ecma_builtin_range_error_dispatch_call (arguments_list_p, arguments_list_len); +#else /* ENABLED (JERRY_ESNEXT) */ + ecma_object_t *proto_p = ecma_op_get_prototype_from_constructor (JERRY_CONTEXT (current_new_target), + ECMA_BUILTIN_ID_RANGE_ERROR_PROTOTYPE); + + if (proto_p == NULL) + { + return ECMA_VALUE_ERROR; + } + + ecma_value_t result = ecma_builtin_range_error_dispatch_call (arguments_list_p, arguments_list_len); + + if (!ECMA_IS_VALUE_ERROR (result)) + { + ecma_object_t *object_p = ecma_get_object_from_value (result); + ECMA_SET_NON_NULL_POINTER (object_p->u2.prototype_cp, proto_p); + } + + ecma_deref_object (proto_p); + + return result; +#endif /* ENABLED (JERRY_ESNEXT) */ } /* ecma_builtin_range_error_dispatch_construct */ /** diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-referenceerror.c b/jerry-core/ecma/builtin-objects/ecma-builtin-referenceerror.c index c34739da3..9113b743e 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-referenceerror.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-referenceerror.c @@ -22,7 +22,9 @@ #include "ecma-helpers.h" #include "ecma-builtin-helpers.h" #include "ecma-objects.h" +#include "ecma-function-object.h" #include "jrt.h" +#include "jcontext.h" #if ENABLED (JERRY_BUILTIN_ERRORS) @@ -64,7 +66,29 @@ ecma_value_t ecma_builtin_reference_error_dispatch_construct (const ecma_value_t *arguments_list_p, /**< arguments list */ uint32_t arguments_list_len) /**< number of arguments */ { +#if !ENABLED (JERRY_ESNEXT) return ecma_builtin_reference_error_dispatch_call (arguments_list_p, arguments_list_len); +#else /* ENABLED (JERRY_ESNEXT) */ + ecma_object_t *proto_p = ecma_op_get_prototype_from_constructor (JERRY_CONTEXT (current_new_target), + ECMA_BUILTIN_ID_REFERENCE_ERROR_PROTOTYPE); + + if (proto_p == NULL) + { + return ECMA_VALUE_ERROR; + } + + ecma_value_t result = ecma_builtin_reference_error_dispatch_call (arguments_list_p, arguments_list_len); + + if (!ECMA_IS_VALUE_ERROR (result)) + { + ecma_object_t *object_p = ecma_get_object_from_value (result); + ECMA_SET_NON_NULL_POINTER (object_p->u2.prototype_cp, proto_p); + } + + ecma_deref_object (proto_p); + + return result; +#endif /* ENABLED (JERRY_ESNEXT) */ } /* ecma_builtin_reference_error_dispatch_construct */ /** diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-syntaxerror.c b/jerry-core/ecma/builtin-objects/ecma-builtin-syntaxerror.c index ee5796b73..aaae2778b 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-syntaxerror.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-syntaxerror.c @@ -22,7 +22,9 @@ #include "ecma-helpers.h" #include "ecma-builtin-helpers.h" #include "ecma-objects.h" +#include "ecma-function-object.h" #include "jrt.h" +#include "jcontext.h" #if ENABLED (JERRY_BUILTIN_ERRORS) @@ -64,7 +66,29 @@ ecma_value_t ecma_builtin_syntax_error_dispatch_construct (const ecma_value_t *arguments_list_p, /**< arguments list */ uint32_t arguments_list_len) /**< number of arguments */ { +#if !ENABLED (JERRY_ESNEXT) return ecma_builtin_syntax_error_dispatch_call (arguments_list_p, arguments_list_len); +#else /* ENABLED (JERRY_ESNEXT) */ + ecma_object_t *proto_p = ecma_op_get_prototype_from_constructor (JERRY_CONTEXT (current_new_target), + ECMA_BUILTIN_ID_SYNTAX_ERROR_PROTOTYPE); + + if (proto_p == NULL) + { + return ECMA_VALUE_ERROR; + } + + ecma_value_t result = ecma_builtin_syntax_error_dispatch_call (arguments_list_p, arguments_list_len); + + if (!ECMA_IS_VALUE_ERROR (result)) + { + ecma_object_t *object_p = ecma_get_object_from_value (result); + ECMA_SET_NON_NULL_POINTER (object_p->u2.prototype_cp, proto_p); + } + + ecma_deref_object (proto_p); + + return result; +#endif /* ENABLED (JERRY_ESNEXT) */ } /* ecma_builtin_syntax_error_dispatch_construct */ /** diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-typeerror.c b/jerry-core/ecma/builtin-objects/ecma-builtin-typeerror.c index 9fd2b1441..d95e898ca 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-typeerror.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-typeerror.c @@ -22,7 +22,9 @@ #include "ecma-helpers.h" #include "ecma-builtin-helpers.h" #include "ecma-objects.h" +#include "ecma-function-object.h" #include "jrt.h" +#include "jcontext.h" #if ENABLED (JERRY_BUILTIN_ERRORS) @@ -64,7 +66,29 @@ ecma_value_t ecma_builtin_type_error_dispatch_construct (const ecma_value_t *arguments_list_p, /**< arguments list */ uint32_t arguments_list_len) /**< number of arguments */ { +#if !ENABLED (JERRY_ESNEXT) return ecma_builtin_type_error_dispatch_call (arguments_list_p, arguments_list_len); +#else /* ENABLED (JERRY_ESNEXT) */ + ecma_object_t *proto_p = ecma_op_get_prototype_from_constructor (JERRY_CONTEXT (current_new_target), + ECMA_BUILTIN_ID_TYPE_ERROR_PROTOTYPE); + + if (proto_p == NULL) + { + return ECMA_VALUE_ERROR; + } + + ecma_value_t result = ecma_builtin_type_error_dispatch_call (arguments_list_p, arguments_list_len); + + if (!ECMA_IS_VALUE_ERROR (result)) + { + ecma_object_t *object_p = ecma_get_object_from_value (result); + ECMA_SET_NON_NULL_POINTER (object_p->u2.prototype_cp, proto_p); + } + + ecma_deref_object (proto_p); + + return result; +#endif /* ENABLED (JERRY_ESNEXT) */ } /* ecma_builtin_type_error_dispatch_construct */ /** diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-urierror.c b/jerry-core/ecma/builtin-objects/ecma-builtin-urierror.c index d2ce32004..8f505cd2a 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-urierror.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-urierror.c @@ -22,7 +22,9 @@ #include "ecma-helpers.h" #include "ecma-builtin-helpers.h" #include "ecma-objects.h" +#include "ecma-function-object.h" #include "jrt.h" +#include "jcontext.h" #if ENABLED (JERRY_BUILTIN_ERRORS) @@ -64,7 +66,29 @@ ecma_value_t ecma_builtin_uri_error_dispatch_construct (const ecma_value_t *arguments_list_p, /**< arguments list */ uint32_t arguments_list_len) /**< number of arguments */ { +#if !ENABLED (JERRY_ESNEXT) return ecma_builtin_uri_error_dispatch_call (arguments_list_p, arguments_list_len); +#else /* ENABLED (JERRY_ESNEXT) */ + ecma_object_t *proto_p = ecma_op_get_prototype_from_constructor (JERRY_CONTEXT (current_new_target), + ECMA_BUILTIN_ID_URI_ERROR_PROTOTYPE); + + if (proto_p == NULL) + { + return ECMA_VALUE_ERROR; + } + + ecma_value_t result = ecma_builtin_uri_error_dispatch_call (arguments_list_p, arguments_list_len); + + if (!ECMA_IS_VALUE_ERROR (result)) + { + ecma_object_t *object_p = ecma_get_object_from_value (result); + ECMA_SET_NON_NULL_POINTER (object_p->u2.prototype_cp, proto_p); + } + + ecma_deref_object (proto_p); + + return result; +#endif /* ENABLED (JERRY_ESNEXT) */ } /* ecma_builtin_uri_error_dispatch_construct */ /** diff --git a/tests/jerry/es.next/new-target-error.js b/tests/jerry/es.next/new-target-error.js new file mode 100644 index 000000000..1460453fc --- /dev/null +++ b/tests/jerry/es.next/new-target-error.js @@ -0,0 +1,32 @@ +// 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. + +function F (){} +var obj = Reflect.construct (Error, [], F); +obj[2] = 'foo'; +assert (obj instanceof F); + +try { + Reflect.construct (Error, [-1], F); +} catch (e) { + assert (e instanceof RangeError); +} + +var o = new Proxy (function f () {}, { get (t,p,r) { if (p == "prototype") { throw "34" } Reflect.get (...arguments) }}) + +try { + Reflect.construct (Error, [], o) +} catch (e) { + assert (e === "34"); +} diff --git a/tests/test262-esnext-excludelist.xml b/tests/test262-esnext-excludelist.xml index 744f1fdb5..3739499b0 100644 --- a/tests/test262-esnext-excludelist.xml +++ b/tests/test262-esnext-excludelist.xml @@ -9631,17 +9631,10 @@ - - - - - - -