Fixed foreach (now we store HashPointer in additional IS_TMP_VAR slot(s))

This commit is contained in:
Dmitry Stogov 2014-03-13 17:01:28 +04:00
parent 918866da5f
commit 25d55d16fc
3 changed files with 20 additions and 14 deletions

View 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);
}

View 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:

View 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;