From 4c9d07abf6ab649188420cdb07a52c28dfb8af69 Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Sun, 7 Apr 2019 13:38:04 +0800 Subject: [PATCH] Fixed njs_function_copy(). --- njs/njs_function.c | 14 ++++++++++---- njs/test/njs_unit_test.c | 6 ++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/njs/njs_function.c b/njs/njs_function.c index 7847e78f..1f10c0eb 100644 --- a/njs/njs_function.c +++ b/njs/njs_function.c @@ -15,6 +15,11 @@ static njs_ret_t njs_normalize_args(njs_vm_t *vm, njs_value_t *args, uint8_t *args_types, nxt_uint_t nargs); +#define njs_function_closures(vm, function) \ + (njs_closure_t **) ((function->closure) ? function->closures \ + : vm->active_frame->closures) + + njs_function_t * njs_function_alloc(njs_vm_t *vm, njs_function_lambda_t *lambda, njs_closure_t *closures[], nxt_bool_t shared) @@ -98,6 +103,7 @@ njs_function_copy(njs_vm_t *vm, const njs_function_t *function) { size_t size; nxt_uint_t n, nesting; + njs_closure_t **closures; njs_function_t *copy; nesting = (function->native) ? 0 : function->u.lambda->nesting; @@ -106,7 +112,6 @@ njs_function_copy(njs_vm_t *vm, const njs_function_t *function) copy = nxt_mp_alloc(vm->mem_pool, size); if (nxt_slow_path(copy == NULL)) { - njs_memory_error(vm); return NULL; } @@ -120,11 +125,13 @@ njs_function_copy(njs_vm_t *vm, const njs_function_t *function) copy->closure = 1; + closures = njs_function_closures(vm, function); + n = 0; do { /* GC: retain closure. */ - copy->closures[n] = vm->active_frame->closures[n]; + copy->closures[n] = closures[n]; n++; } while (n < nesting); @@ -470,8 +477,7 @@ njs_function_lambda_call(njs_vm_t *vm, njs_index_t retval, nesting = lambda->nesting; if (nesting != 0) { - closures = (function->closure) ? function->closures - : vm->active_frame->closures; + closures = njs_function_closures(vm, function); do { closure = *closures++; diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index fb668e68..b1903164 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -6362,6 +6362,12 @@ static njs_unit_test_t njs_test[] = { nxt_string("function f() { var a; function baz() { a = 1; return a; } return baz.bind()(); } f()"), nxt_string("1") }, + { nxt_string("(function(){ var a = 1; return (function() { return a; })})().bind()()"), + nxt_string("1") }, + + { nxt_string("function f() { var a = 1; function baz() { return a; } return baz; } f().bind()()"), + nxt_string("1") }, + { nxt_string("function f(a, b) { return a + b }" "f(3,4) === f.bind()(3,4)"), nxt_string("true") }, -- 2.47.3