Welcome! Log In Create A New Profile

Advanced

[njs] Avoiding OBJECT COPY instruction each time global object accessed.

Dmitry Volyntsev
October 18, 2019 10:02AM
details: https://hg.nginx.org/njs/rev/10c10102cad0
branches:
changeset: 1187:10c10102cad0
user: Dmitry Volyntsev <xeioex@nginx.com>
date: Fri Oct 18 16:28:16 2019 +0300
description:
Avoiding OBJECT COPY instruction each time global object accessed.

diffstat:

src/njs_builtin.c | 8 +++++++-
src/njs_generator.c | 8 +++++---
src/njs_lexer.h | 4 ++--
src/njs_parser_terminal.c | 11 +++--------
src/njs_vm.c | 5 ++++-
src/njs_vm.h | 10 ++++++++--
6 files changed, 29 insertions(+), 17 deletions(-)

diffs (151 lines):

diff -r ed4472f545a1 -r 10c10102cad0 src/njs_builtin.c
--- a/src/njs_builtin.c Sat Aug 24 05:41:46 2019 +0300
+++ b/src/njs_builtin.c Fri Oct 18 16:28:16 2019 +0300
@@ -495,7 +495,7 @@ njs_prototype_function(njs_vm_t *vm, njs
*/

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 -r ed4472f545a1 -r 10c10102cad0 src/njs_generator.c
--- a/src/njs_generator.c Sat Aug 24 05:41:46 2019 +0300
+++ b/src/njs_generator.c Fri Oct 18 16:28:16 2019 +0300
@@ -442,9 +442,9 @@ njs_generate(njs_vm_t *vm, njs_generator
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
return NJS_ERROR;
}

- /* Fall through. */
+ node->index = NJS_INDEX_GLOBAL_OBJECT;
+
+ return NJS_OK;

case NJS_TOKEN_NJS:
case NJS_TOKEN_PROCESS:
diff -r ed4472f545a1 -r 10c10102cad0 src/njs_lexer.h
--- a/src/njs_lexer.h Sat Aug 24 05:41:46 2019 +0300
+++ b/src/njs_lexer.h Fri Oct 18 16:28:16 2019 +0300
@@ -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 -r ed4472f545a1 -r 10c10102cad0 src/njs_parser_terminal.c
--- a/src/njs_parser_terminal.c Sat Aug 24 05:41:46 2019 +0300
+++ b/src/njs_parser_terminal.c Fri Oct 18 16:28:16 2019 +0300
@@ -261,14 +261,9 @@ njs_parser_reference(njs_vm_t *vm, njs_p
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_pars

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 -r ed4472f545a1 -r 10c10102cad0 src/njs_vm.c
--- a/src/njs_vm.c Sat Aug 24 05:41:46 2019 +0300
+++ b/src/njs_vm.c Fri Oct 18 16:28:16 2019 +0300
@@ -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 -r ed4472f545a1 -r 10c10102cad0 src/njs_vm.h
--- a/src/njs_vm.h Sat Aug 24 05:41:46 2019 +0300
+++ b/src/njs_vm.h Fri Oct 18 16:28:16 2019 +0300
@@ -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_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);

_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[njs] Avoiding OBJECT COPY instruction each time global object accessed.

Dmitry Volyntsev 178 October 18, 2019 10:02AM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 305
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready