]> git.kaiwu.me - njs.git/commitdiff
Avoiding OBJECT COPY instruction each time global object accessed.
authorDmitry Volyntsev <xeioex@nginx.com>
Fri, 18 Oct 2019 13:28:16 +0000 (16:28 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Fri, 18 Oct 2019 13:28:16 +0000 (16:28 +0300)
src/njs_builtin.c
src/njs_generator.c
src/njs_lexer.h
src/njs_parser_terminal.c
src/njs_vm.c
src/njs_vm.h

index a66a6303678c1fdfbe5fd27456402f451f5be721..6358b509b7a23caa2c9c4520a92a72d2b641294a 100644 (file)
@@ -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;
 
index 1443957d40f3c94ec8185bd084d0265ccafe3590..7d1a3e0198e501f055aec85aefbe754db6a0ee51 100644 (file)
@@ -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:
index d0afa8067755671f9d7e384e0e26f5e001704de6..99319fd8a870d7d3dcdb2b380c521c13cf1c06ce 100644 (file)
@@ -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,
index 11f3bbf739a2bb11cda7bfe480dd425d4a4653ef..d410b485631fe132d9c97f6b74487d233008adf3 100644 (file)
@@ -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;
                 }
index bd34521d1ff01fe13d1e21b5d069236f1a1680a9..e9c453dac5f30b98e806b31263efac99de8b8ac2 100644 (file)
@@ -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;
     }
index 2b2edbbf565f62afb0430030a5acc3df2414bc97..63a49a14f63b27a3e8f8da5290a9677da2c5400a 100644 (file)
@@ -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);