]> git.kaiwu.me - njs.git/commitdiff
Fixed temporary variables handling in accumulative mode.
authorDmitry Volyntsev <xeioex@nginx.com>
Tue, 18 Jul 2017 16:25:50 +0000 (19:25 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Tue, 18 Jul 2017 16:25:50 +0000 (19:25 +0300)
njs/njs_generator.c
njs/test/njs_interactive_test.c
njs/test/njs_unit_test.c

index 16ee8baadf5c7f1abe808d649169c39c42575a80..b058b7d6bbaa9fa4a41f282bdda5b93d3caceadd 100644 (file)
@@ -2540,17 +2540,36 @@ njs_generator_temp_index_get(njs_vm_t *vm, njs_parser_t *parser,
          scope = scope->parent;
     }
 
-    value = nxt_array_add(scope->values[0], &njs_array_mem_proto,
-                          vm->mem_cache_pool);
-    if (nxt_slow_path(value == NULL)) {
-        return NJS_INDEX_ERROR;
+    if (vm->accumulative && scope->type == NJS_SCOPE_GLOBAL) {
+
+        /*
+         * When non-clonable VM runs in accumulative mode
+         * all global variables are allocated in absolute scope
+         * to simplify global scope handling.
+         */
+
+        value = nxt_mem_cache_align(vm->mem_cache_pool, sizeof(njs_value_t),
+                                    sizeof(njs_value_t));
+        if (nxt_slow_path(value == NULL)) {
+            return NJS_INDEX_ERROR;
+        }
+
+        index = (njs_index_t) value;
+
+    } else {
+
+        value = nxt_array_add(scope->values[0], &njs_array_mem_proto,
+                              vm->mem_cache_pool);
+        if (nxt_slow_path(value == NULL)) {
+            return NJS_INDEX_ERROR;
+        }
+
+        index = scope->next_index[0];
+        scope->next_index[0] += sizeof(njs_value_t);
     }
 
     *value = njs_value_invalid;
 
-    index = scope->next_index[0];
-    scope->next_index[0] += sizeof(njs_value_t);
-
     return index;
 }
 
index b096f35a6a1a23ce3b6d256f243938dfef5afa75..d0ca9f98edcb480f440324b64abaa681edc48450 100644 (file)
@@ -63,6 +63,27 @@ static njs_interactive_test_t  njs_test[] =
                  "sq(function () { return 3 })" ENTER),
       nxt_string("9") },
 
+    /* Temporary indexes */
+
+    { nxt_string("var a = [1,2,3], i; for (i in a) {Object.seal({});}" ENTER),
+      nxt_string("undefined") },
+
+    { nxt_string("var i; for (i in [1,2,3]) {Object.seal({});}" ENTER),
+      nxt_string("undefined") },
+
+    { nxt_string("var a = 'A'; switch (a) {"
+                 "case 0: a += '0';"
+                 "case 1: a += '1';"
+                 "}; a" ENTER),
+      nxt_string("A") },
+
+    { nxt_string("var a = 0; try { a = 5 }"
+                 "catch (e) { a = 9 } finally { a++ } a" ENTER),
+      nxt_string("6") },
+
+    { nxt_string("/abc/i.test('ABC')" ENTER),
+      nxt_string("true") },
+
     /* Error handling */
 
     { nxt_string("var a = ;" ENTER
index a62caf4ee2aa44e7d1ed9908ff3ab4a063e65045..e3c83a3e39048a91ac36e94d51a07208ef07599b 100644 (file)
@@ -2069,6 +2069,12 @@ static njs_unit_test_t  njs_test[] =
     { nxt_string("var a; for (a = 1; a; a--) switch (a) { case 0: continue }"),
       nxt_string("undefined") },
 
+    { nxt_string("var a = [1,2,3], i; for (i in a) {Object.seal({})}"),
+      nxt_string("undefined") },
+
+    { nxt_string("var i; for (i in [1,2,3]) {Object.seal({});}"),
+      nxt_string("undefined") },
+
     /* break. */
 
     { nxt_string("break"),