From e1960621f34242a56a7ec60f5bca757a4b5894d2 Mon Sep 17 00:00:00 2001 From: Szilagyi Adam Date: Wed, 20 May 2020 17:10:55 +0200 Subject: [PATCH] Add new target support to RegExp object (#3723) JerryScript-DCO-1.0-Signed-off-by: Adam Szilagyi aszilagy@inf.u-szeged.hu --- .../builtin-objects/ecma-builtin-regexp.c | 12 ++++++------ tests/jerry/es2015/regexp-new-target.js | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 6 deletions(-) create mode 100644 tests/jerry/es2015/regexp-new-target.js diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-regexp.c b/jerry-core/ecma/builtin-objects/ecma-builtin-regexp.c index f50989a7d..65c6d18d4 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-regexp.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-regexp.c @@ -45,14 +45,16 @@ static ecma_value_t ecma_builtin_regexp_dispatch_helper (const ecma_value_t *arguments_list_p, /**< arguments list */ - ecma_length_t arguments_list_len, /**< number of arguments */ - ecma_object_t *new_target_p) /**< pointer to the new target object */ + ecma_length_t arguments_list_len) /**< number of arguments */ { ecma_value_t pattern_value = ECMA_VALUE_UNDEFINED; ecma_value_t flags_value = ECMA_VALUE_UNDEFINED; #if ENABLED (JERRY_ES2015) bool create_regexp_from_bc = false; bool free_arguments = false; + ecma_object_t *new_target_p = JERRY_CONTEXT (current_new_target); +#else /* !ENABLED (JERRY_ES2015) */ + ecma_object_t *new_target_p = NULL; #endif /* ENABLED (JERRY_ES2015) */ if (arguments_list_len > 0) @@ -206,8 +208,7 @@ ecma_builtin_regexp_dispatch_call (const ecma_value_t *arguments_list_p, /**< ar ecma_length_t arguments_list_len) /**< number of arguments */ { return ecma_builtin_regexp_dispatch_helper (arguments_list_p, - arguments_list_len, - NULL); + arguments_list_len); } /* ecma_builtin_regexp_dispatch_call */ /** @@ -221,8 +222,7 @@ ecma_builtin_regexp_dispatch_construct (const ecma_value_t *arguments_list_p, /* ecma_length_t arguments_list_len) /**< number of arguments */ { return ecma_builtin_regexp_dispatch_helper (arguments_list_p, - arguments_list_len, - ecma_builtin_get (ECMA_BUILTIN_ID_REGEXP)); + arguments_list_len); } /* ecma_builtin_regexp_dispatch_construct */ #if ENABLED (JERRY_ES2015) diff --git a/tests/jerry/es2015/regexp-new-target.js b/tests/jerry/es2015/regexp-new-target.js new file mode 100644 index 000000000..2a5bc64dc --- /dev/null +++ b/tests/jerry/es2015/regexp-new-target.js @@ -0,0 +1,19 @@ +// 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(RegExp, ["baz","g"], F); +assert(RegExp.prototype.exec.call(obj, "foobarbaz")[0] === "baz") +assert(obj.lastIndex === 9) +assert(obj instanceof F);