]> granicus.if.org Git - php/commitdiff
Stop using internal array/object pointer in foreach by reference according to https...
authorDmitry Stogov <dmitry@zend.com>
Thu, 12 Feb 2015 11:36:04 +0000 (14:36 +0300)
committerDmitry Stogov <dmitry@zend.com>
Thu, 12 Feb 2015 11:36:04 +0000 (14:36 +0300)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
tests/lang/foreachLoop.001.phpt

index 81a9bbb6584ad8e3c41e17ed6e332cc60a1d6445..479f7b7151a18a4708141e7acafe60d8c1eb0985 100644 (file)
@@ -4699,7 +4699,6 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET_R, CONST|TMP|VAR|CV, ANY)
                                }
                                pos++;
                        }
-                       fe_ht->nInternalPointer = pos;
                        Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos);
 
                        FREE_OP1_IF_VAR();
@@ -4810,7 +4809,6 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, ANY)
                        }
                        pos++;
                }
-               fe_ht->nInternalPointer = pos;
                Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos);
 
                FREE_OP1_VAR_PTR();
@@ -4846,7 +4844,6 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, ANY)
                                }
                                pos++;
                        }
-                       fe_ht->nInternalPointer = pos;
                        Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos);
 
                        FREE_OP1_VAR_PTR();
@@ -5033,8 +5030,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY)
                                        break;
                                }
                        }
-                       EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos =
-                               fe_ht->nInternalPointer = pos;
+                       EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos;
                        ZEND_VM_INC_OPCODE();
                        ZEND_VM_NEXT_OPCODE();
                } else {
@@ -5107,7 +5103,6 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY)
                while (1) {
                        if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
                                /* reached end of iteration */
-                               fe_ht->nInternalPointer = INVALID_IDX;
                                ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
                        }
                        p = fe_ht->arData + pos;
@@ -5147,8 +5142,7 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY)
                                break;
                        }
                }
-               EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos =
-                       fe_ht->nInternalPointer = pos;
+               EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos;
                ZEND_VM_INC_OPCODE();
                ZEND_VM_NEXT_OPCODE();
        } else if (EXPECTED(Z_TYPE_P(array) == IS_OBJECT)) {
@@ -5163,7 +5157,6 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY)
                        while (1) {
                                if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
                                        /* reached end of iteration */
-                                       fe_ht->nInternalPointer = INVALID_IDX;
                                        ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
                                }
 
@@ -5217,8 +5210,7 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY)
                                        break;
                                }
                        }
-                       EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos =
-                               fe_ht->nInternalPointer = pos;
+                       EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos;
                        ZEND_VM_INC_OPCODE();
                        ZEND_VM_NEXT_OPCODE();
                } else {
index 0121d65faf170904d71ba4f0af0b7020feecb57e..4ef0779089cf1725839a15c1f3b331387dbfa9a7 100644 (file)
@@ -3109,7 +3109,6 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_R_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER
                                }
                                pos++;
                        }
-                       fe_ht->nInternalPointer = pos;
                        Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos);
 
                        CHECK_EXCEPTION();
@@ -3218,7 +3217,6 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_RW_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLE
                        }
                        pos++;
                }
-               fe_ht->nInternalPointer = pos;
                Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos);
 
                CHECK_EXCEPTION();
@@ -3253,7 +3251,6 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_RW_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLE
                                }
                                pos++;
                        }
-                       fe_ht->nInternalPointer = pos;
                        Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos);
 
                        CHECK_EXCEPTION();
@@ -9107,7 +9104,6 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_R_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_A
                                }
                                pos++;
                        }
-                       fe_ht->nInternalPointer = pos;
                        Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos);
 
                        CHECK_EXCEPTION();
@@ -9217,7 +9213,6 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_
                        }
                        pos++;
                }
-               fe_ht->nInternalPointer = pos;
                Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos);
 
                CHECK_EXCEPTION();
@@ -9252,7 +9247,6 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_
                                }
                                pos++;
                        }
-                       fe_ht->nInternalPointer = pos;
                        Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos);
 
                        CHECK_EXCEPTION();
@@ -12008,7 +12002,6 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_R_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_A
                                }
                                pos++;
                        }
-                       fe_ht->nInternalPointer = pos;
                        Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos);
 
                        zval_ptr_dtor_nogc(free_op1);
@@ -12119,7 +12112,6 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_
                        }
                        pos++;
                }
-               fe_ht->nInternalPointer = pos;
                Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos);
 
                if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
@@ -12155,7 +12147,6 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_
                                }
                                pos++;
                        }
-                       fe_ht->nInternalPointer = pos;
                        Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos);
 
                        if (free_op1) {zval_ptr_dtor_nogc(free_op1);};
@@ -12342,8 +12333,7 @@ static int ZEND_FASTCALL  ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_A
                                        break;
                                }
                        }
-                       EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos =
-                               fe_ht->nInternalPointer = pos;
+                       EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos;
                        ZEND_VM_INC_OPCODE();
                        ZEND_VM_NEXT_OPCODE();
                } else {
@@ -12416,7 +12406,6 @@ static int ZEND_FASTCALL  ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_
                while (1) {
                        if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
                                /* reached end of iteration */
-                               fe_ht->nInternalPointer = INVALID_IDX;
                                ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
                        }
                        p = fe_ht->arData + pos;
@@ -12456,8 +12445,7 @@ static int ZEND_FASTCALL  ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_
                                break;
                        }
                }
-               EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos =
-                       fe_ht->nInternalPointer = pos;
+               EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos;
                ZEND_VM_INC_OPCODE();
                ZEND_VM_NEXT_OPCODE();
        } else if (EXPECTED(Z_TYPE_P(array) == IS_OBJECT)) {
@@ -12472,7 +12460,6 @@ static int ZEND_FASTCALL  ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_
                        while (1) {
                                if (UNEXPECTED(pos >= fe_ht->nNumUsed)) {
                                        /* reached end of iteration */
-                                       fe_ht->nInternalPointer = INVALID_IDX;
                                        ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
                                }
 
@@ -12526,8 +12513,7 @@ static int ZEND_FASTCALL  ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_
                                        break;
                                }
                        }
-                       EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos =
-                               fe_ht->nInternalPointer = pos;
+                       EG(ht_iterators)[Z_FE_ITER_P(EX_VAR(opline->op1.var))].pos = pos;
                        ZEND_VM_INC_OPCODE();
                        ZEND_VM_NEXT_OPCODE();
                } else {
@@ -24479,7 +24465,6 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_R_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_AR
                                }
                                pos++;
                        }
-                       fe_ht->nInternalPointer = pos;
                        Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos);
 
                        CHECK_EXCEPTION();
@@ -24588,7 +24573,6 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_A
                        }
                        pos++;
                }
-               fe_ht->nInternalPointer = pos;
                Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos);
 
                CHECK_EXCEPTION();
@@ -24623,7 +24607,6 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_A
                                }
                                pos++;
                        }
-                       fe_ht->nInternalPointer = pos;
                        Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(fe_ht, pos);
 
                        CHECK_EXCEPTION();
index c35b9b44e51f939a15210e70d26bd3ce42160073..d35f26116dcdc85e3fc0b5457e04243bcf598650 100644 (file)
@@ -61,4 +61,4 @@ int(2)
 string(1) "f"\r
 \r
 string(1) "a"\r
-bool(false)
+string(1) "a"