diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-array.c b/jerry-core/ecma/builtin-objects/ecma-builtin-array.c index 4e266cf3b..d676b7980 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-array.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-array.c @@ -25,6 +25,7 @@ #include "ecma-iterator-object.h" #include "ecma-objects.h" #include "ecma-array-object.h" +#include "jcontext.h" #include "jrt.h" #if ENABLED (JERRY_BUILTIN_ARRAY) @@ -485,7 +486,7 @@ ecma_builtin_array_dispatch_call (const ecma_value_t *arguments_list_p, /**< arg { JERRY_ASSERT (arguments_list_len == 0 || arguments_list_p != NULL); - return ecma_builtin_array_dispatch_construct (arguments_list_p, arguments_list_len); + return ecma_op_create_array_object (arguments_list_p, arguments_list_len, true); } /* ecma_builtin_array_dispatch_call */ /** @@ -499,7 +500,30 @@ ecma_builtin_array_dispatch_construct (const ecma_value_t *arguments_list_p, /** { JERRY_ASSERT (arguments_list_len == 0 || arguments_list_p != NULL); +#if !ENABLED (JERRY_ES2015) return ecma_op_create_array_object (arguments_list_p, arguments_list_len, true); +#else /* ENABLED (JERRY_ES2015) */ + ecma_object_t *proto_p = ecma_op_get_prototype_from_constructor (JERRY_CONTEXT (current_new_target), + ECMA_BUILTIN_ID_ARRAY_PROTOTYPE); + + if (proto_p == NULL) + { + return ECMA_VALUE_ERROR; + } + + ecma_value_t result = ecma_op_create_array_object (arguments_list_p, arguments_list_len, true); + + if (ECMA_IS_VALUE_ERROR (result)) + { + ecma_deref_object (proto_p); + return ECMA_VALUE_ERROR; + } + + 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_ES2015) */ } /* ecma_builtin_array_dispatch_construct */ /** diff --git a/tests/jerry/es2015/array-new-target-support.js b/tests/jerry/es2015/array-new-target-support.js new file mode 100644 index 000000000..5165300f2 --- /dev/null +++ b/tests/jerry/es2015/array-new-target-support.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 (Array, [], F); +obj[2] = 'foo'; +assert (obj.length === 3 && obj instanceof F); + +try { + Reflect.construct (Array, [-1], F); +} catch (e) { + assert (e instanceof RangeError); +} + +var o = new Proxy (function f () {}, { get (t,p,r) { if (p == "prototype") { throw "Kitten" } Reflect.get (...arguments) }}) + +try { + Reflect.construct (Array, [], o) +} catch (e) { + assert (e === "Kitten"); +}