* zend_optimizer_replace_by_const() supports this. */
zval_ptr_dtor(val);
return 0;
+ case ZEND_CASE:
+ case ZEND_FETCH_LIST:
+ zval_ptr_dtor(val);
+ return 0;
case ZEND_CONCAT:
case ZEND_FAST_CONCAT:
case ZEND_FETCH_R:
*/
case ZEND_FETCH_LIST: {
zend_op *m = opline;
+
+ if (Z_TYPE_P(val) == IS_STRING) {
+ zend_string_hash_val(Z_STR_P(val));
+ }
+
do {
if (m->opcode == ZEND_FETCH_LIST &&
ZEND_OP1_TYPE(m) == type &&
ZEND_OP1(m).var == var) {
- zend_optimizer_update_op1_const(op_array, m, val);
+ zval v;
+ ZVAL_COPY_VALUE(&v, val);
+ zval_copy_ctor(&v);
+ ZEND_OP1(m).constant = zend_optimizer_add_literal(op_array, &v);
+ ZEND_OP1_TYPE(m) = IS_CONST;
}
m++;
} while (m->opcode != ZEND_FREE || ZEND_OP1_TYPE(m) != type || ZEND_OP1(m).var != var);
+
ZEND_ASSERT(m->opcode == ZEND_FREE && ZEND_OP1_TYPE(m) == type && ZEND_OP1(m).var == var);
MAKE_NOP(m);
+ zval_dtor(val);
zend_optimizer_remove_live_range(op_array, var);
return 1;
}
} else {
n = op_array->opcodes + op_array->last;
}
+
+ if (Z_TYPE_P(val) == IS_STRING) {
+ zend_string_hash_val(Z_STR_P(val));
+ }
+
while (m < n) {
if (ZEND_OP1_TYPE(m) == type &&
ZEND_OP1(m).var == var) {
if (m->opcode == ZEND_CASE
|| m->opcode == ZEND_SWITCH_LONG
|| m->opcode == ZEND_SWITCH_STRING) {
- zval old_val;
- ZVAL_COPY_VALUE(&old_val, val);
- zval_copy_ctor(val);
- zend_optimizer_update_op1_const(op_array, m, val);
- ZVAL_COPY_VALUE(val, &old_val);
+ zval v;
+ ZVAL_COPY_VALUE(&v, val);
+ zval_copy_ctor(&v);
+ ZEND_OP1(m).constant = zend_optimizer_add_literal(op_array, &v);
+ ZEND_OP1_TYPE(m) = IS_CONST;
} else if (m->opcode == ZEND_FREE) {
MAKE_NOP(m);
} else {