From: Dmitry Volyntsev Date: Fri, 18 Oct 2019 13:28:16 +0000 (+0300) Subject: Avoiding OBJECT COPY instruction each time global object accessed. X-Git-Tag: 0.3.6~5 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=fe691782055efe067d74820e10e1081cf1835c6d;p=njs.git Avoiding OBJECT COPY instruction each time global object accessed. --- diff --git a/src/njs_builtin.c b/src/njs_builtin.c index a66a6303..6358b509 100644 --- a/src/njs_builtin.c +++ b/src/njs_builtin.c @@ -495,7 +495,7 @@ njs_prototype_function(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, */ njs_int_t -njs_builtin_objects_clone(njs_vm_t *vm) +njs_builtin_objects_clone(njs_vm_t *vm, njs_value_t *global) { size_t size; njs_uint_t i; @@ -531,6 +531,12 @@ njs_builtin_objects_clone(njs_vm_t *vm) vm->constructors[i].object.__proto__ = function_prototype; } + vm->global_object = vm->shared->objects[0]; + vm->global_object.__proto__ = &vm->prototypes[NJS_PROTOTYPE_OBJECT].object; + vm->global_object.shared = 0; + + njs_set_object(global, &vm->global_object); + vm->string_object = vm->shared->string_object; vm->string_object.__proto__ = &vm->prototypes[NJS_PROTOTYPE_STRING].object; diff --git a/src/njs_generator.c b/src/njs_generator.c index 1443957d..7d1a3e01 100644 --- a/src/njs_generator.c +++ b/src/njs_generator.c @@ -442,9 +442,9 @@ njs_generate(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node) case NJS_TOKEN_NON_LOCAL_THIS: return njs_generate_name(vm, generator, node); - case NJS_TOKEN_GLOBAL_THIS: + case NJS_TOKEN_GLOBAL_OBJECT: if (vm->options.module) { - node->index = njs_value_index(vm, &node->u.value, + node->index = njs_value_index(vm, &njs_value_undefined, generator->runtime); if (njs_fast_path(node->index != NJS_INDEX_NONE)) { return NJS_OK; @@ -453,7 +453,9 @@ njs_generate(njs_vm_t *vm, njs_generator_t *generator, njs_parser_node_t *node) return NJS_ERROR; } - /* Fall through. */ + node->index = NJS_INDEX_GLOBAL_OBJECT; + + return NJS_OK; case NJS_TOKEN_NJS: case NJS_TOKEN_PROCESS: diff --git a/src/njs_lexer.h b/src/njs_lexer.h index d0afa806..99319fd8 100644 --- a/src/njs_lexer.h +++ b/src/njs_lexer.h @@ -170,9 +170,9 @@ typedef enum { NJS_TOKEN_NON_LOCAL_THIS, NJS_TOKEN_ARGUMENTS, -#define NJS_TOKEN_FIRST_OBJECT NJS_TOKEN_GLOBAL_THIS +#define NJS_TOKEN_FIRST_OBJECT NJS_TOKEN_GLOBAL_OBJECT - NJS_TOKEN_GLOBAL_THIS, + NJS_TOKEN_GLOBAL_OBJECT, NJS_TOKEN_NJS, NJS_TOKEN_PROCESS, NJS_TOKEN_MATH, diff --git a/src/njs_parser_terminal.c b/src/njs_parser_terminal.c index 11f3bbf7..d410b485 100644 --- a/src/njs_parser_terminal.c +++ b/src/njs_parser_terminal.c @@ -261,14 +261,9 @@ njs_parser_reference(njs_vm_t *vm, njs_parser_t *parser, njs_token_t token, break; } - node->token = NJS_TOKEN_GLOBAL_THIS; + node->token = NJS_TOKEN_GLOBAL_OBJECT; - if (vm->options.module) { - njs_set_undefined(&node->u.value); - break; - } - - /* Fall through. */ + break; case NJS_TOKEN_NJS: case NJS_TOKEN_PROCESS: @@ -652,7 +647,7 @@ njs_parser_object(njs_vm_t *vm, njs_parser_t *parser, njs_parser_node_t *obj) if (name.length == 0 || lexer->prev_token == NJS_TOKEN_THIS - || lexer->prev_token == NJS_TOKEN_GLOBAL_THIS) + || lexer->prev_token == NJS_TOKEN_GLOBAL_OBJECT) { return NJS_TOKEN_ILLEGAL; } diff --git a/src/njs_vm.c b/src/njs_vm.c index bd34521d..e9c453da 100644 --- a/src/njs_vm.c +++ b/src/njs_vm.c @@ -326,6 +326,7 @@ njs_vm_init(njs_vm_t *vm) u_char *values; njs_int_t ret; njs_arr_t *backtrace; + njs_value_t *global; njs_frame_t *frame; scope_size = vm->scope_size + NJS_INDEX_GLOBAL_OFFSET; @@ -362,7 +363,9 @@ njs_vm_init(njs_vm_t *vm) return NJS_ERROR; } - ret = njs_builtin_objects_clone(vm); + global = (njs_value_t *) (values + NJS_INDEX_GLOBAL_OBJECT_OFFSET); + + ret = njs_builtin_objects_clone(vm, global); if (njs_slow_path(ret != NJS_OK)) { return NJS_ERROR; } diff --git a/src/njs_vm.h b/src/njs_vm.h index 2b2edbbf..63a49a14 100644 --- a/src/njs_vm.h +++ b/src/njs_vm.h @@ -203,7 +203,12 @@ enum njs_function_e { #define NJS_INDEX_OBJECT_MEMORY_ERROR \ njs_global_scope_index(NJS_CONSTRUCTOR_MEMORY_ERROR) -#define NJS_INDEX_GLOBAL_RETVAL njs_global_scope_index(NJS_CONSTRUCTOR_MAX) +#define NJS_INDEX_GLOBAL_OBJECT njs_global_scope_index(NJS_CONSTRUCTOR_MAX) +#define NJS_INDEX_GLOBAL_OBJECT_OFFSET \ + njs_scope_index(NJS_CONSTRUCTOR_MAX, 0) + +#define NJS_INDEX_GLOBAL_RETVAL \ + njs_global_scope_index(NJS_CONSTRUCTOR_MAX + 1) #define NJS_INDEX_GLOBAL_OFFSET njs_scope_index(NJS_CONSTRUCTOR_MAX + 1, 0) @@ -284,6 +289,7 @@ struct njs_vm_s { njs_object_t memory_error_object; njs_object_t string_object; + njs_object_t global_object; njs_arr_t *codes; /* of njs_vm_code_t */ @@ -341,7 +347,7 @@ void njs_vm_scopes_restore(njs_vm_t *vm, njs_frame_t *frame, njs_int_t njs_vm_add_backtrace_entry(njs_vm_t *vm, njs_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_int_t njs_builtin_objects_clone(njs_vm_t *vm, njs_value_t *global); njs_int_t njs_builtin_match_native_function(njs_vm_t *vm, njs_function_t *function, njs_str_t *name);