From e063b8af80b23cb0b8c0024f2e60dc9b2a20902f Mon Sep 17 00:00:00 2001 From: Robert Fancsik Date: Fri, 29 Mar 2019 12:13:27 +0100 Subject: [PATCH] Fix bound functions with no arguments after #2801 (#2805) JerryScript-DCO-1.0-Signed-off-by: Robert Fancsik frobert@inf.u-szeged.hu --- .../ecma/operations/ecma-function-object.c | 57 ++++++++++--------- tests/jerry/regression-test-issue-2805.js | 20 +++++++ 2 files changed, 50 insertions(+), 27 deletions(-) create mode 100644 tests/jerry/regression-test-issue-2805.js diff --git a/jerry-core/ecma/operations/ecma-function-object.c b/jerry-core/ecma/operations/ecma-function-object.c index 1dd5d7bc3..27518c496 100644 --- a/jerry-core/ecma/operations/ecma-function-object.c +++ b/jerry-core/ecma/operations/ecma-function-object.c @@ -927,37 +927,40 @@ ecma_op_function_call (ecma_object_t *func_obj_p, /**< Function object */ } else { - break; +#ifndef CONFIG_DISABLE_ES2015_CLASS + arguments_list_p = ecma_op_function_clear_construct_flag (arguments_list_p); +#endif /* !CONFIG_DISABLE_ES2015_CLASS */ + + JERRY_ASSERT (!ecma_op_function_has_construct_flag (arguments_list_p)); + args_length--; + + ecma_length_t merged_args_list_len = args_length + arguments_list_len; + ecma_value_t ret_value; + + JMEM_DEFINE_LOCAL_ARRAY (merged_args_list_p, merged_args_list_len, ecma_value_t); + + ecma_value_t *args_p = (ecma_value_t *) (ext_function_p + 1); + + memcpy (merged_args_list_p, args_p + 1, args_length * sizeof (ecma_value_t)); + memcpy (merged_args_list_p + args_length, arguments_list_p, arguments_list_len * sizeof (ecma_value_t)); + + /* 5. */ + ret_value = ecma_op_function_call (target_func_obj_p, + this_arg_value, + merged_args_list_p, + merged_args_list_len); + + JMEM_FINALIZE_LOCAL_ARRAY (merged_args_list_p); + + return ret_value; } } while (ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_BOUND_FUNCTION); -#ifndef CONFIG_DISABLE_ES2015_CLASS - arguments_list_p = ecma_op_function_clear_construct_flag (arguments_list_p); -#endif /* !CONFIG_DISABLE_ES2015_CLASS */ - - JERRY_ASSERT (!ecma_op_function_has_construct_flag (arguments_list_p)); - args_length--; - - ecma_length_t merged_args_list_len = args_length + arguments_list_len; - ecma_value_t ret_value; - - JMEM_DEFINE_LOCAL_ARRAY (merged_args_list_p, merged_args_list_len, ecma_value_t); - - ecma_value_t *args_p = (ecma_value_t *) (ext_function_p + 1); - - memcpy (merged_args_list_p, args_p + 1, args_length * sizeof (ecma_value_t)); - memcpy (merged_args_list_p + args_length, arguments_list_p, arguments_list_len * sizeof (ecma_value_t)); - - /* 5. */ - ret_value = ecma_op_function_call (target_func_obj_p, - this_arg_value, - merged_args_list_p, - merged_args_list_len); - - JMEM_FINALIZE_LOCAL_ARRAY (merged_args_list_p); - - return ret_value; + return ecma_op_function_call (func_obj_p, + this_arg_value, + arguments_list_p, + arguments_list_len); } /* ecma_op_function_call */ /** diff --git a/tests/jerry/regression-test-issue-2805.js b/tests/jerry/regression-test-issue-2805.js new file mode 100644 index 000000000..715b02208 --- /dev/null +++ b/tests/jerry/regression-test-issue-2805.js @@ -0,0 +1,20 @@ +// 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. + +var arrayBindNoArgs = Array.bind (this); +var bindWithArgs = arrayBindNoArgs.bind (this, 1, 2); +var array = new bindWithArgs (); +assert (array instanceof Array); +assert (array[0] === 1); +assert (array[1] === 2);