]> git.kaiwu.me - njs.git/commitdiff
For-in loop does not discard the last value of property variable.
authorIgor Sysoev <igor@sysoev.ru>
Mon, 2 Jan 2017 19:59:31 +0000 (22:59 +0300)
committerIgor Sysoev <igor@sysoev.ru>
Mon, 2 Jan 2017 19:59:31 +0000 (22:59 +0300)
njs/njs_generator.c
njs/njs_vm.c
njs/test/njs_unit_test.c

index 19642a927782fba7dae97580066722ea96926d61..de80b8d12111f930d6e6d890a3b1b007720d8d9e 100644 (file)
@@ -1047,7 +1047,7 @@ njs_generate_for_in_statement(njs_vm_t *vm, njs_parser_t *parser,
     njs_generate_code(parser, njs_vmcode_prop_next_t, prop_next);
     prop_next->code.operation = njs_vmcode_property_next;
     prop_next->code.operands = NJS_VMCODE_3OPERANDS;
-    prop_next->code.retval = NJS_VMCODE_RETVAL;
+    prop_next->code.retval = NJS_VMCODE_NO_RETVAL;
     prop_next->retval = foreach->left->index;
     prop_next->object = foreach->right->index;
     prop_next->next = index;
index 0257926ba9ba51aa39ed71808a18cf09220c85e2..ecb61b43eb84bed8e3e4ccbe59b52d1897813a91 100644 (file)
@@ -1227,6 +1227,7 @@ njs_vmcode_property_next(njs_vm_t *vm, njs_value_t *object, njs_value_t *value)
 {
     njs_ret_t               ret;
     nxt_uint_t              n;
+    njs_value_t             *retval;
     njs_array_t             *array;
     njs_extern_t            *ext;
     njs_object_prop_t       *prop;
@@ -1234,6 +1235,7 @@ njs_vmcode_property_next(njs_vm_t *vm, njs_value_t *object, njs_value_t *value)
     njs_vmcode_prop_next_t  *code;
 
     code = (njs_vmcode_prop_next_t *) vm->current;
+    retval = njs_vmcode_operand(vm, code->retval);
 
     if (njs_is_object(object)) {
         next = value->data.u.next;
@@ -1245,7 +1247,7 @@ njs_vmcode_property_next(njs_vm_t *vm, njs_value_t *object, njs_value_t *value)
                 n = next->index++;
 
                 if (njs_is_valid(&array->start[n])) {
-                    njs_number_set(&vm->retval, n);
+                    njs_number_set(retval, n);
 
                     return code->offset;
                 }
@@ -1257,20 +1259,18 @@ njs_vmcode_property_next(njs_vm_t *vm, njs_value_t *object, njs_value_t *value)
         prop = nxt_lvlhsh_each(&object->data.u.object->hash, &next->lhe);
 
         if (prop != NULL) {
-            vm->retval = prop->name;
+            *retval = prop->name;
 
             return code->offset;
         }
 
         nxt_mem_cache_free(vm->mem_cache_pool, next);
 
-        vm->retval = njs_value_void;
-
     } else if (njs_is_external(object)) {
         ext = object->data.u.external;
 
         if (ext->next != NULL) {
-            ret = ext->next(vm, &vm->retval, vm->external[ext->object], value);
+            ret = ext->next(vm, retval, vm->external[ext->object], value);
 
             if (ret == NXT_OK) {
                 return code->offset;
index 1b9d6e44ada01d2c9a81eda53d7279a2757aa6ba..e7c73bcf53fe4212363e0771671b3b1400729a0f 100644 (file)
@@ -4519,6 +4519,15 @@ static njs_unit_test_t  njs_test[] =
                  "for (var i in o) { s += i }; s"),
       nxt_string("abc") },
 
+    { nxt_string("var o = { a: 1, b: 2, c: 3 }; for (var i in o); i"),
+      nxt_string("c") },
+
+    { nxt_string("var o = {}; i = 7; for (var i in o); i"),
+      nxt_string("7") },
+
+    { nxt_string("var a = [1,2,3]; for (var i in a); i"),
+      nxt_string("2") },
+
     /* RegExp. */
 
     { nxt_string("/./x"),