diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 2113fb94fd5..b9193303455 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -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); } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index cf6c02b94b9..28682099038 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -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: diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 99c4fe20d52..6b8b7ec4a42 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -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;