]> granicus.if.org Git - php/commitdiff
Fixed foreach (now we store HashPointer in additional IS_TMP_VAR slot(s))
authorDmitry Stogov <dmitry@zend.com>
Thu, 13 Mar 2014 13:01:28 +0000 (17:01 +0400)
committerDmitry Stogov <dmitry@zend.com>
Thu, 13 Mar 2014 13:01:28 +0000 (17:01 +0400)
Zend/zend_compile.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 2113fb94fd5de3089f0fd75ed6c75d6374f7161e..b9193303455508f1dc79fba2d7e47daeb33ffd96 100644 (file)
@@ -6400,7 +6400,13 @@ void zend_do_foreach_begin(znode *foreach_token, znode *open_brackets_token, zno
 
        opline = get_next_op(CG(active_op_array) TSRMLS_CC);
        opline->opcode = ZEND_OP_DATA;
-       SET_UNUSED(opline->op1);
+       /* Allocate enough space to keep HashPointer on VM stack */
+       opline->op1_type = IS_TMP_VAR;
+       opline->op1.var = get_temporary_variable(CG(active_op_array));
+       if (sizeof(HashPointer) > sizeof(zval)) {
+               /* Make shure 1 zval is enough for HashPointer (2 must be enough) */
+               get_temporary_variable(CG(active_op_array));
+       }
        SET_UNUSED(opline->op2);
        SET_UNUSED(opline->result);
 }
index cf6c02b94b9db20bff969d71517ac930e2ec97bc..286820990388dfddb30cae6abca155ec98c0e70e 100644 (file)
@@ -4441,7 +4441,7 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY)
                        }
                }
                is_empty = zend_hash_has_more_elements(fe_ht) != SUCCESS;
-//???          zend_hash_get_pointer(fe_ht, EX_VAR(opline->result.var));
+               zend_hash_get_pointer(fe_ht, (HashPointer*)EX_VAR((opline+2)->op1.var));
        } else {
                zend_error(E_WARNING, "Invalid argument supplied for foreach()");
                is_empty = 1;
@@ -4491,7 +4491,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY)
                        zend_ulong int_key;
 
                        fe_ht = Z_OBJPROP_P(array);
-//???                  zend_hash_set_pointer(fe_ht, &EX_T(opline->op1.var).fe.fe_pos);
+                       zend_hash_set_pointer(fe_ht, (HashPointer*)EX_VAR((opline+1)->op1.var));
                        do {
                                if ((value = zend_hash_get_current_data(fe_ht)) == NULL) {
                                        /* reached end of iteration */
@@ -4516,13 +4516,13 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY)
                                }
                        }
 
-//???                  zend_hash_get_pointer(fe_ht, &EX_T(opline->op1.var).fe.fe_pos);
+                       zend_hash_get_pointer(fe_ht, (HashPointer*)EX_VAR((opline+1)->op1.var));
                        break;
                }
 
                case ZEND_ITER_PLAIN_ARRAY:
                        fe_ht = Z_ARRVAL_P(array);
-//???                  zend_hash_set_pointer(fe_ht, &EX_T(opline->op1.var).fe.fe_pos);
+                       zend_hash_set_pointer(fe_ht, (HashPointer*)EX_VAR((opline+1)->op1.var));
                        if ((value = zend_hash_get_current_data(fe_ht)) == NULL) {
                                /* reached end of iteration */
                                ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
@@ -4531,7 +4531,7 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY)
                                zend_hash_get_current_key_zval(fe_ht, key);
                        }
                        zend_hash_move_forward(fe_ht);
-//???                  zend_hash_get_pointer(fe_ht, &EX_T(opline->op1.var).fe.fe_pos);
+                       zend_hash_get_pointer(fe_ht, (HashPointer*)EX_VAR((opline+1)->op1.var));
                        break;
 
                case ZEND_ITER_OBJECT:
index 99c4fe20d5234c1dc33adb3526bfebc3c5abd2ff..6b8b7ec4a42581999594b038aeecf78faa31110c 100644 (file)
@@ -3159,7 +3159,7 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
                        }
                }
                is_empty = zend_hash_has_more_elements(fe_ht) != SUCCESS;
-//???          zend_hash_get_pointer(fe_ht, EX_VAR(opline->result.var));
+               zend_hash_get_pointer(fe_ht, (HashPointer*)EX_VAR((opline+2)->op1.var));
        } else {
                zend_error(E_WARNING, "Invalid argument supplied for foreach()");
                is_empty = 1;
@@ -8270,7 +8270,7 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
                        }
                }
                is_empty = zend_hash_has_more_elements(fe_ht) != SUCCESS;
-//???          zend_hash_get_pointer(fe_ht, EX_VAR(opline->result.var));
+               zend_hash_get_pointer(fe_ht, (HashPointer*)EX_VAR((opline+2)->op1.var));
        } else {
                zend_error(E_WARNING, "Invalid argument supplied for foreach()");
                is_empty = 1;
@@ -13459,7 +13459,7 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                        }
                }
                is_empty = zend_hash_has_more_elements(fe_ht) != SUCCESS;
-//???          zend_hash_get_pointer(fe_ht, EX_VAR(opline->result.var));
+               zend_hash_get_pointer(fe_ht, (HashPointer*)EX_VAR((opline+2)->op1.var));
        } else {
                zend_error(E_WARNING, "Invalid argument supplied for foreach()");
                is_empty = 1;
@@ -13509,7 +13509,7 @@ static int ZEND_FASTCALL  ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                        zend_ulong int_key;
 
                        fe_ht = Z_OBJPROP_P(array);
-//???                  zend_hash_set_pointer(fe_ht, &EX_T(opline->op1.var).fe.fe_pos);
+                       zend_hash_set_pointer(fe_ht, (HashPointer*)EX_VAR((opline+1)->op1.var));
                        do {
                                if ((value = zend_hash_get_current_data(fe_ht)) == NULL) {
                                        /* reached end of iteration */
@@ -13534,13 +13534,13 @@ static int ZEND_FASTCALL  ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                                }
                        }
 
-//???                  zend_hash_get_pointer(fe_ht, &EX_T(opline->op1.var).fe.fe_pos);
+                       zend_hash_get_pointer(fe_ht, (HashPointer*)EX_VAR((opline+1)->op1.var));
                        break;
                }
 
                case ZEND_ITER_PLAIN_ARRAY:
                        fe_ht = Z_ARRVAL_P(array);
-//???                  zend_hash_set_pointer(fe_ht, &EX_T(opline->op1.var).fe.fe_pos);
+                       zend_hash_set_pointer(fe_ht, (HashPointer*)EX_VAR((opline+1)->op1.var));
                        if ((value = zend_hash_get_current_data(fe_ht)) == NULL) {
                                /* reached end of iteration */
                                ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
@@ -13549,7 +13549,7 @@ static int ZEND_FASTCALL  ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
                                zend_hash_get_current_key_zval(fe_ht, key);
                        }
                        zend_hash_move_forward(fe_ht);
-//???                  zend_hash_get_pointer(fe_ht, &EX_T(opline->op1.var).fe.fe_pos);
+                       zend_hash_get_pointer(fe_ht, (HashPointer*)EX_VAR((opline+1)->op1.var));
                        break;
 
                case ZEND_ITER_OBJECT:
@@ -30927,7 +30927,7 @@ static int ZEND_FASTCALL  ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
                        }
                }
                is_empty = zend_hash_has_more_elements(fe_ht) != SUCCESS;
-//???          zend_hash_get_pointer(fe_ht, EX_VAR(opline->result.var));
+               zend_hash_get_pointer(fe_ht, (HashPointer*)EX_VAR((opline+2)->op1.var));
        } else {
                zend_error(E_WARNING, "Invalid argument supplied for foreach()");
                is_empty = 1;