details: https://hg.nginx.org/njs/rev/29ddc56f7aa5 branches: changeset: 2085:29ddc56f7aa5 user: Dmitry Volyntsev <xei...@nginx.com> date: Mon Apr 10 23:06:34 2023 -0700 description: Simplified functional stack unwinding.
diffstat: src/njs_function.c | 73 +++++++++++++---------------------------------------- src/njs_function.h | 18 ------------- src/njs_vm.c | 5 +-- src/njs_vm.h | 3 +- src/njs_vmcode.c | 9 ++---- 5 files changed, 24 insertions(+), 84 deletions(-) diffs (235 lines): diff -r 46c0af7318b8 -r 29ddc56f7aa5 src/njs_function.c --- a/src/njs_function.c Mon Apr 10 23:06:29 2023 -0700 +++ b/src/njs_function.c Mon Apr 10 23:06:34 2023 -0700 @@ -620,7 +620,7 @@ njs_function_native_call(njs_vm_t *vm) { njs_int_t ret; njs_function_t *function; - njs_native_frame_t *native, *previous; + njs_native_frame_t *native; njs_function_native_t call; native = vm->top_frame; @@ -656,17 +656,9 @@ njs_function_native_call(njs_vm_t *vm) return ret; } - if (ret == NJS_DECLINED) { - return NJS_OK; - } - - previous = njs_function_previous_frame(native); + njs_vm_scopes_restore(vm, native); - njs_vm_scopes_restore(vm, native, previous); - - if (!native->skip) { - *native->retval = vm->retval; - } + *native->retval = vm->retval; njs_function_frame_free(vm, native); @@ -700,20 +692,10 @@ njs_function_frame_invoke(njs_vm_t *vm, void njs_function_frame_free(njs_vm_t *vm, njs_native_frame_t *native) { - njs_native_frame_t *previous; - - do { - previous = native->previous; - - /* GC: free frame->local, etc. */ - - if (native->size != 0) { - vm->spare_stack_size += native->size; - njs_mp_free(vm->mem_pool, native); - } - - native = previous; - } while (native->skip); + if (native->size != 0) { + vm->spare_stack_size += native->size; + njs_mp_free(vm->mem_pool, native); + } } @@ -1236,10 +1218,9 @@ static njs_int_t njs_function_prototype_call(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused) { - njs_int_t ret; - njs_function_t *function; - const njs_value_t *this; - njs_native_frame_t *frame; + njs_int_t ret; + njs_value_t retval; + const njs_value_t *this; if (!njs_is_function(&args[0])) { njs_type_error(vm, "\"this\" argument is not a function"); @@ -1255,24 +1236,15 @@ njs_function_prototype_call(njs_vm_t *vm nargs = 0; } - frame = vm->top_frame; - - /* Skip the "call" method frame. */ - frame->skip = 1; - - function = njs_function(&args[0]); - - ret = njs_function_frame(vm, function, this, &args[2], nargs, 0); + ret = njs_function_call(vm, njs_function(&args[0]), this, &args[2], nargs, + &retval); if (njs_slow_path(ret != NJS_OK)) { return ret; } - ret = njs_function_frame_invoke(vm, frame->retval); - if (njs_slow_path(ret != NJS_OK)) { - return ret; - } + njs_value_assign(&vm->retval, &retval); - return NJS_DECLINED; + return NJS_OK; } @@ -1282,8 +1254,7 @@ njs_function_prototype_apply(njs_vm_t *v { int64_t i, length; njs_int_t ret; - njs_frame_t *frame; - njs_value_t *this, *arr_like; + njs_value_t retval, *this, *arr_like; njs_array_t *arr; njs_function_t *func; @@ -1332,22 +1303,14 @@ njs_function_prototype_apply(njs_vm_t *v activate: - /* Skip the "apply" method frame. */ - vm->top_frame->skip = 1; - - frame = (njs_frame_t *) vm->top_frame; - - ret = njs_function_frame(vm, func, this, args, length, 0); + ret = njs_function_call(vm, func, this, args, length, &retval); if (njs_slow_path(ret != NJS_OK)) { return ret; } - ret = njs_function_frame_invoke(vm, frame->native.retval); - if (njs_slow_path(ret != NJS_OK)) { - return ret; - } + njs_value_assign(&vm->retval, &retval); - return NJS_DECLINED; + return NJS_OK; } diff -r 46c0af7318b8 -r 29ddc56f7aa5 src/njs_function.h --- a/src/njs_function.h Mon Apr 10 23:06:29 2023 -0700 +++ b/src/njs_function.h Mon Apr 10 23:06:34 2023 -0700 @@ -65,9 +65,6 @@ struct njs_native_frame_s { uint8_t native; /* 1 bit */ /* Function is called as constructor with "new" keyword. */ uint8_t ctor; /* 1 bit */ - - /* Skip the Function.call() and Function.apply() methods frames. */ - uint8_t skip; /* 1 bit */ }; @@ -161,21 +158,6 @@ njs_function_frame(njs_vm_t *vm, njs_fun } -njs_inline njs_native_frame_t * -njs_function_previous_frame(njs_native_frame_t *frame) -{ - njs_native_frame_t *previous; - - do { - previous = frame->previous; - frame = previous; - - } while (frame->skip); - - return frame; -} - - njs_inline njs_int_t njs_function_call(njs_vm_t *vm, njs_function_t *function, const njs_value_t *this, const njs_value_t *args, diff -r 46c0af7318b8 -r 29ddc56f7aa5 src/njs_vm.c --- a/src/njs_vm.c Mon Apr 10 23:06:29 2023 -0700 +++ b/src/njs_vm.c Mon Apr 10 23:06:34 2023 -0700 @@ -442,12 +442,11 @@ njs_vm_invoke(njs_vm_t *vm, njs_function void -njs_vm_scopes_restore(njs_vm_t *vm, njs_native_frame_t *native, - njs_native_frame_t *previous) +njs_vm_scopes_restore(njs_vm_t *vm, njs_native_frame_t *native) { njs_frame_t *frame; - vm->top_frame = previous; + vm->top_frame = native->previous; if (native->function->native) { return; diff -r 46c0af7318b8 -r 29ddc56f7aa5 src/njs_vm.h --- a/src/njs_vm.h Mon Apr 10 23:06:29 2023 -0700 +++ b/src/njs_vm.h Mon Apr 10 23:06:34 2023 -0700 @@ -239,8 +239,7 @@ struct njs_vm_shared_s { }; -void njs_vm_scopes_restore(njs_vm_t *vm, njs_native_frame_t *frame, - njs_native_frame_t *previous); +void njs_vm_scopes_restore(njs_vm_t *vm, njs_native_frame_t *frame); njs_int_t njs_builtin_objects_create(njs_vm_t *vm); njs_int_t njs_builtin_objects_clone(njs_vm_t *vm, njs_value_t *global); diff -r 46c0af7318b8 -r 29ddc56f7aa5 src/njs_vmcode.c --- a/src/njs_vmcode.c Mon Apr 10 23:06:29 2023 -0700 +++ b/src/njs_vmcode.c Mon Apr 10 23:06:34 2023 -0700 @@ -1853,7 +1853,7 @@ error: lambda_call = (native == &vm->active_frame->native); - njs_vm_scopes_restore(vm, native, previous); + njs_vm_scopes_restore(vm, native); if (native->size != 0) { vm->spare_stack_size += native->size; @@ -2674,8 +2674,7 @@ njs_function_new_object(njs_vm_t *vm, nj static njs_jump_off_t njs_vmcode_return(njs_vm_t *vm, njs_value_t *invld, njs_value_t *retval) { - njs_frame_t *frame; - njs_native_frame_t *previous; + njs_frame_t *frame; frame = (njs_frame_t *) vm->top_frame; @@ -2688,9 +2687,7 @@ njs_vmcode_return(njs_vm_t *vm, njs_valu } } - previous = njs_function_previous_frame(&frame->native); - - njs_vm_scopes_restore(vm, &frame->native, previous); + njs_vm_scopes_restore(vm, &frame->native); *frame->native.retval = *retval; _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-devel