SAVE_OPLINE();
if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) &&
- (opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
+ UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = NULL;
if (IS_CONST == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
} else {
expr_ptr = EX_CONSTANT(opline->op1);
if (IS_CONST == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&new_expr, expr_ptr);
- expr_ptr = &new_expr;
+ /* pass */
} else if (IS_CONST == IS_CONST) {
- if (!Z_IMMUTABLE_P(expr_ptr)) {
- ZVAL_DUP(&new_expr, expr_ptr);
+ if (UNEXPECTED(Z_OPT_COPYABLE_P(expr_ptr))) {
+ ZVAL_COPY_VALUE(&new_expr, expr_ptr);
+ zval_copy_ctor_func(&new_expr);
expr_ptr = &new_expr;
}
} else if (IS_CONST == IS_CV) {
zend_ulong hval;
add_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index;
- case IS_LONG:
- hval = Z_LVAL_P(offset);
-num_index:
- zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
- break;
- case IS_STRING:
- str = Z_STR_P(offset);
- if (IS_CONST != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(str, hval)) {
- goto num_index;
- }
+ if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
+ str = Z_STR_P(offset);
+ if (IS_CONST != IS_CONST) {
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
}
+ }
str_index:
- zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
- break;
- case IS_NULL:
- str = STR_EMPTY_ALLOC();
- goto str_index;
- case IS_FALSE:
- hval = 0;
- goto num_index;
- case IS_TRUE:
- hval = 1;
- goto num_index;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto add_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
- /* do nothing */
- break;
+ zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
+ } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ hval = Z_LVAL_P(offset);
+num_index:
+ zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
+ } else if ((IS_CONST & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
+ offset = Z_REFVAL_P(offset);
+ goto add_again;
+ } else if (Z_TYPE_P(offset) == IS_NULL) {
+ str = STR_EMPTY_ALLOC();
+ goto str_index;
+ } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_FALSE) {
+ hval = 0;
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_TRUE) {
+ hval = 1;
+ goto num_index;
+ } else {
+ zend_error(E_WARNING, "Illegal offset type");
+ zval_ptr_dtor(expr_ptr);
}
} else {
zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
- if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
if (IS_CONST != IS_UNUSED) {
- if (EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
/* Constants and temporary variables aren't yieldable by reference,
* but we still allow them with a notice. */
if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
value = EX_CONSTANT(opline->op1);
ZVAL_COPY_VALUE(&generator->value, value);
- if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
-
- /* Temporary variables don't need ctor copying */
- if (IS_CONST != IS_TMP_VAR) {
- zval_opt_copy_ctor(&generator->value);
+ if (IS_CONST != IS_CONST) {
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
}
} else {
zval *value_ptr = NULL;
/* Consts, temporary variables and references need copying */
if (IS_CONST == IS_CONST) {
- ZVAL_DUP(&generator->value, value);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
} else if (IS_CONST == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_CONST == IS_CV || IS_CONST == IS_VAR) && Z_ISREF_P(value)) {
- ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
+ } else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
} else {
ZVAL_COPY_VALUE(&generator->value, value);
/* Consts, temporary variables and references need copying */
if (IS_CONST == IS_CONST) {
- ZVAL_DUP(&generator->key, key);
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) {
+ zval_copy_ctor_func(&generator->key);
+ }
} else if (IS_CONST == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && Z_ISREF_P(key)) {
- ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
+ } else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
} else {
ZVAL_COPY_VALUE(&generator->key, key);
zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
- if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
if (IS_CONST != IS_UNUSED) {
- if (EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
/* Constants and temporary variables aren't yieldable by reference,
* but we still allow them with a notice. */
if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
value = EX_CONSTANT(opline->op1);
ZVAL_COPY_VALUE(&generator->value, value);
- if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
-
- /* Temporary variables don't need ctor copying */
- if (IS_CONST != IS_TMP_VAR) {
- zval_opt_copy_ctor(&generator->value);
+ if (IS_CONST != IS_CONST) {
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
}
} else {
zval *value_ptr = NULL;
/* Consts, temporary variables and references need copying */
if (IS_CONST == IS_CONST) {
- ZVAL_DUP(&generator->value, value);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
} else if (IS_CONST == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_CONST == IS_CV || IS_CONST == IS_VAR) && Z_ISREF_P(value)) {
- ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
+ } else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
} else {
ZVAL_COPY_VALUE(&generator->value, value);
/* Consts, temporary variables and references need copying */
if (IS_TMP_VAR == IS_CONST) {
- ZVAL_DUP(&generator->key, key);
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) {
+ zval_copy_ctor_func(&generator->key);
+ }
} else if (IS_TMP_VAR == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && Z_ISREF_P(key)) {
- ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
+ } else if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
} else {
ZVAL_COPY_VALUE(&generator->key, key);
zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
- if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
if (IS_CONST != IS_UNUSED) {
- if (EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
/* Constants and temporary variables aren't yieldable by reference,
* but we still allow them with a notice. */
if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
value = EX_CONSTANT(opline->op1);
ZVAL_COPY_VALUE(&generator->value, value);
- if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
-
- /* Temporary variables don't need ctor copying */
- if (IS_CONST != IS_TMP_VAR) {
- zval_opt_copy_ctor(&generator->value);
+ if (IS_CONST != IS_CONST) {
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
}
} else {
zval *value_ptr = NULL;
/* Consts, temporary variables and references need copying */
if (IS_CONST == IS_CONST) {
- ZVAL_DUP(&generator->value, value);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
} else if (IS_CONST == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_CONST == IS_CV || IS_CONST == IS_VAR) && Z_ISREF_P(value)) {
- ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
+ } else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
} else {
ZVAL_COPY_VALUE(&generator->value, value);
/* Consts, temporary variables and references need copying */
if (IS_VAR == IS_CONST) {
- ZVAL_DUP(&generator->key, key);
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) {
+ zval_copy_ctor_func(&generator->key);
+ }
} else if (IS_VAR == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && Z_ISREF_P(key)) {
- ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
+ } else if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
zval_ptr_dtor_nogc(free_op2);
} else {
ZVAL_COPY_VALUE(&generator->key, key);
SAVE_OPLINE();
if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) &&
- (opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
+ UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = NULL;
if (IS_CONST == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
} else {
expr_ptr = EX_CONSTANT(opline->op1);
if (IS_CONST == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&new_expr, expr_ptr);
- expr_ptr = &new_expr;
+ /* pass */
} else if (IS_CONST == IS_CONST) {
- if (!Z_IMMUTABLE_P(expr_ptr)) {
- ZVAL_DUP(&new_expr, expr_ptr);
+ if (UNEXPECTED(Z_OPT_COPYABLE_P(expr_ptr))) {
+ ZVAL_COPY_VALUE(&new_expr, expr_ptr);
+ zval_copy_ctor_func(&new_expr);
expr_ptr = &new_expr;
}
} else if (IS_CONST == IS_CV) {
zend_ulong hval;
add_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index;
- case IS_LONG:
- hval = Z_LVAL_P(offset);
-num_index:
- zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
- break;
- case IS_STRING:
- str = Z_STR_P(offset);
- if (IS_UNUSED != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(str, hval)) {
- goto num_index;
- }
+ if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
+ str = Z_STR_P(offset);
+ if (IS_UNUSED != IS_CONST) {
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
}
+ }
str_index:
- zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
- break;
- case IS_NULL:
- str = STR_EMPTY_ALLOC();
- goto str_index;
- case IS_FALSE:
- hval = 0;
- goto num_index;
- case IS_TRUE:
- hval = 1;
- goto num_index;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto add_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
- /* do nothing */
- break;
+ zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
+ } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ hval = Z_LVAL_P(offset);
+num_index:
+ zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
+ } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
+ offset = Z_REFVAL_P(offset);
+ goto add_again;
+ } else if (Z_TYPE_P(offset) == IS_NULL) {
+ str = STR_EMPTY_ALLOC();
+ goto str_index;
+ } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_FALSE) {
+ hval = 0;
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_TRUE) {
+ hval = 1;
+ goto num_index;
+ } else {
+ zend_error(E_WARNING, "Illegal offset type");
+ zval_ptr_dtor(expr_ptr);
}
} else {
zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
- if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
if (IS_CONST != IS_UNUSED) {
- if (EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
/* Constants and temporary variables aren't yieldable by reference,
* but we still allow them with a notice. */
if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
value = EX_CONSTANT(opline->op1);
ZVAL_COPY_VALUE(&generator->value, value);
- if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
-
- /* Temporary variables don't need ctor copying */
- if (IS_CONST != IS_TMP_VAR) {
- zval_opt_copy_ctor(&generator->value);
+ if (IS_CONST != IS_CONST) {
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
}
} else {
zval *value_ptr = NULL;
/* Consts, temporary variables and references need copying */
if (IS_CONST == IS_CONST) {
- ZVAL_DUP(&generator->value, value);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
} else if (IS_CONST == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_CONST == IS_CV || IS_CONST == IS_VAR) && Z_ISREF_P(value)) {
- ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
+ } else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
} else {
ZVAL_COPY_VALUE(&generator->value, value);
/* Consts, temporary variables and references need copying */
if (IS_UNUSED == IS_CONST) {
- ZVAL_DUP(&generator->key, key);
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) {
+ zval_copy_ctor_func(&generator->key);
+ }
} else if (IS_UNUSED == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_UNUSED == IS_VAR || IS_UNUSED == IS_CV) && Z_ISREF_P(key)) {
- ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
+ } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
} else {
ZVAL_COPY_VALUE(&generator->key, key);
SAVE_OPLINE();
if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) &&
- (opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
+ UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = NULL;
if (IS_CONST == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
} else {
expr_ptr = EX_CONSTANT(opline->op1);
if (IS_CONST == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&new_expr, expr_ptr);
- expr_ptr = &new_expr;
+ /* pass */
} else if (IS_CONST == IS_CONST) {
- if (!Z_IMMUTABLE_P(expr_ptr)) {
- ZVAL_DUP(&new_expr, expr_ptr);
+ if (UNEXPECTED(Z_OPT_COPYABLE_P(expr_ptr))) {
+ ZVAL_COPY_VALUE(&new_expr, expr_ptr);
+ zval_copy_ctor_func(&new_expr);
expr_ptr = &new_expr;
}
} else if (IS_CONST == IS_CV) {
zend_ulong hval;
add_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index;
- case IS_LONG:
- hval = Z_LVAL_P(offset);
-num_index:
- zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
- break;
- case IS_STRING:
- str = Z_STR_P(offset);
- if (IS_CV != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(str, hval)) {
- goto num_index;
- }
+ if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
+ str = Z_STR_P(offset);
+ if (IS_CV != IS_CONST) {
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
}
+ }
str_index:
- zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
- break;
- case IS_NULL:
- str = STR_EMPTY_ALLOC();
- goto str_index;
- case IS_FALSE:
- hval = 0;
- goto num_index;
- case IS_TRUE:
- hval = 1;
- goto num_index;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto add_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
- /* do nothing */
- break;
+ zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
+ } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ hval = Z_LVAL_P(offset);
+num_index:
+ zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
+ offset = Z_REFVAL_P(offset);
+ goto add_again;
+ } else if (Z_TYPE_P(offset) == IS_NULL) {
+ str = STR_EMPTY_ALLOC();
+ goto str_index;
+ } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_FALSE) {
+ hval = 0;
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_TRUE) {
+ hval = 1;
+ goto num_index;
+ } else {
+ zend_error(E_WARNING, "Illegal offset type");
+ zval_ptr_dtor(expr_ptr);
}
} else {
zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
- if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
if (IS_CONST != IS_UNUSED) {
- if (EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
/* Constants and temporary variables aren't yieldable by reference,
* but we still allow them with a notice. */
if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
value = EX_CONSTANT(opline->op1);
ZVAL_COPY_VALUE(&generator->value, value);
- if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
-
- /* Temporary variables don't need ctor copying */
- if (IS_CONST != IS_TMP_VAR) {
- zval_opt_copy_ctor(&generator->value);
+ if (IS_CONST != IS_CONST) {
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
}
} else {
zval *value_ptr = NULL;
/* Consts, temporary variables and references need copying */
if (IS_CONST == IS_CONST) {
- ZVAL_DUP(&generator->value, value);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
} else if (IS_CONST == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_CONST == IS_CV || IS_CONST == IS_VAR) && Z_ISREF_P(value)) {
- ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
+ } else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
} else {
ZVAL_COPY_VALUE(&generator->value, value);
/* Consts, temporary variables and references need copying */
if (IS_CV == IS_CONST) {
- ZVAL_DUP(&generator->key, key);
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) {
+ zval_copy_ctor_func(&generator->key);
+ }
} else if (IS_CV == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_CV == IS_VAR || IS_CV == IS_CV) && Z_ISREF_P(key)) {
- ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
} else {
ZVAL_COPY_VALUE(&generator->key, key);
SAVE_OPLINE();
if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) &&
- (opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
+ UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = NULL;
if (IS_CONST == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
} else {
expr_ptr = EX_CONSTANT(opline->op1);
if (IS_CONST == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&new_expr, expr_ptr);
- expr_ptr = &new_expr;
+ /* pass */
} else if (IS_CONST == IS_CONST) {
- if (!Z_IMMUTABLE_P(expr_ptr)) {
- ZVAL_DUP(&new_expr, expr_ptr);
+ if (UNEXPECTED(Z_OPT_COPYABLE_P(expr_ptr))) {
+ ZVAL_COPY_VALUE(&new_expr, expr_ptr);
+ zval_copy_ctor_func(&new_expr);
expr_ptr = &new_expr;
}
} else if (IS_CONST == IS_CV) {
zend_ulong hval;
add_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index;
- case IS_LONG:
- hval = Z_LVAL_P(offset);
-num_index:
- zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
- break;
- case IS_STRING:
- str = Z_STR_P(offset);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(str, hval)) {
- goto num_index;
- }
+ if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
+ str = Z_STR_P(offset);
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
}
+ }
str_index:
- zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
- break;
- case IS_NULL:
- str = STR_EMPTY_ALLOC();
- goto str_index;
- case IS_FALSE:
- hval = 0;
- goto num_index;
- case IS_TRUE:
- hval = 1;
- goto num_index;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto add_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
- /* do nothing */
- break;
+ zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
+ } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ hval = Z_LVAL_P(offset);
+num_index:
+ zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
+ } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
+ offset = Z_REFVAL_P(offset);
+ goto add_again;
+ } else if (Z_TYPE_P(offset) == IS_NULL) {
+ str = STR_EMPTY_ALLOC();
+ goto str_index;
+ } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_FALSE) {
+ hval = 0;
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_TRUE) {
+ hval = 1;
+ goto num_index;
+ } else {
+ zend_error(E_WARNING, "Illegal offset type");
+ zval_ptr_dtor(expr_ptr);
}
zval_ptr_dtor_nogc(free_op2);
} else {
SAVE_OPLINE();
if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) &&
- (opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
+ UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = NULL;
if (IS_TMP_VAR == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
} else {
expr_ptr = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
if (IS_TMP_VAR == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&new_expr, expr_ptr);
- expr_ptr = &new_expr;
+ /* pass */
} else if (IS_TMP_VAR == IS_CONST) {
- if (!Z_IMMUTABLE_P(expr_ptr)) {
- ZVAL_DUP(&new_expr, expr_ptr);
+ if (UNEXPECTED(Z_OPT_COPYABLE_P(expr_ptr))) {
+ ZVAL_COPY_VALUE(&new_expr, expr_ptr);
+ zval_copy_ctor_func(&new_expr);
expr_ptr = &new_expr;
}
} else if (IS_TMP_VAR == IS_CV) {
zend_ulong hval;
add_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index;
- case IS_LONG:
- hval = Z_LVAL_P(offset);
-num_index:
- zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
- break;
- case IS_STRING:
- str = Z_STR_P(offset);
- if (IS_CONST != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(str, hval)) {
- goto num_index;
- }
+ if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
+ str = Z_STR_P(offset);
+ if (IS_CONST != IS_CONST) {
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
}
+ }
str_index:
- zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
- break;
- case IS_NULL:
- str = STR_EMPTY_ALLOC();
- goto str_index;
- case IS_FALSE:
- hval = 0;
- goto num_index;
- case IS_TRUE:
- hval = 1;
- goto num_index;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto add_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
- /* do nothing */
- break;
+ zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
+ } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ hval = Z_LVAL_P(offset);
+num_index:
+ zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
+ } else if ((IS_CONST & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
+ offset = Z_REFVAL_P(offset);
+ goto add_again;
+ } else if (Z_TYPE_P(offset) == IS_NULL) {
+ str = STR_EMPTY_ALLOC();
+ goto str_index;
+ } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_FALSE) {
+ hval = 0;
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_TRUE) {
+ hval = 1;
+ goto num_index;
+ } else {
+ zend_error(E_WARNING, "Illegal offset type");
+ zval_ptr_dtor(expr_ptr);
}
} else {
zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
- if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
if (IS_TMP_VAR != IS_UNUSED) {
zend_free_op free_op1;
- if (EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
/* Constants and temporary variables aren't yieldable by reference,
* but we still allow them with a notice. */
if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) {
value = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
ZVAL_COPY_VALUE(&generator->value, value);
- if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
-
- /* Temporary variables don't need ctor copying */
- if (IS_TMP_VAR != IS_TMP_VAR) {
- zval_opt_copy_ctor(&generator->value);
+ if (IS_TMP_VAR != IS_CONST) {
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
}
} else {
zval *value_ptr = NULL;
/* Consts, temporary variables and references need copying */
if (IS_TMP_VAR == IS_CONST) {
- ZVAL_DUP(&generator->value, value);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
} else if (IS_TMP_VAR == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) && Z_ISREF_P(value)) {
- ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
+ } else if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
} else {
ZVAL_COPY_VALUE(&generator->value, value);
/* Consts, temporary variables and references need copying */
if (IS_CONST == IS_CONST) {
- ZVAL_DUP(&generator->key, key);
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) {
+ zval_copy_ctor_func(&generator->key);
+ }
} else if (IS_CONST == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && Z_ISREF_P(key)) {
- ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
+ } else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
} else {
ZVAL_COPY_VALUE(&generator->key, key);
zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
- if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
if (IS_TMP_VAR != IS_UNUSED) {
zend_free_op free_op1;
- if (EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
/* Constants and temporary variables aren't yieldable by reference,
* but we still allow them with a notice. */
if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) {
value = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
ZVAL_COPY_VALUE(&generator->value, value);
- if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
-
- /* Temporary variables don't need ctor copying */
- if (IS_TMP_VAR != IS_TMP_VAR) {
- zval_opt_copy_ctor(&generator->value);
+ if (IS_TMP_VAR != IS_CONST) {
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
}
} else {
zval *value_ptr = NULL;
/* Consts, temporary variables and references need copying */
if (IS_TMP_VAR == IS_CONST) {
- ZVAL_DUP(&generator->value, value);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
} else if (IS_TMP_VAR == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) && Z_ISREF_P(value)) {
- ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
+ } else if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
} else {
ZVAL_COPY_VALUE(&generator->value, value);
/* Consts, temporary variables and references need copying */
if (IS_TMP_VAR == IS_CONST) {
- ZVAL_DUP(&generator->key, key);
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) {
+ zval_copy_ctor_func(&generator->key);
+ }
} else if (IS_TMP_VAR == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && Z_ISREF_P(key)) {
- ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
+ } else if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
} else {
ZVAL_COPY_VALUE(&generator->key, key);
zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
- if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
if (IS_TMP_VAR != IS_UNUSED) {
zend_free_op free_op1;
- if (EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
/* Constants and temporary variables aren't yieldable by reference,
* but we still allow them with a notice. */
if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) {
value = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
ZVAL_COPY_VALUE(&generator->value, value);
- if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
-
- /* Temporary variables don't need ctor copying */
- if (IS_TMP_VAR != IS_TMP_VAR) {
- zval_opt_copy_ctor(&generator->value);
+ if (IS_TMP_VAR != IS_CONST) {
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
}
} else {
zval *value_ptr = NULL;
/* Consts, temporary variables and references need copying */
if (IS_TMP_VAR == IS_CONST) {
- ZVAL_DUP(&generator->value, value);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
} else if (IS_TMP_VAR == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) && Z_ISREF_P(value)) {
- ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
+ } else if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
} else {
ZVAL_COPY_VALUE(&generator->value, value);
/* Consts, temporary variables and references need copying */
if (IS_VAR == IS_CONST) {
- ZVAL_DUP(&generator->key, key);
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) {
+ zval_copy_ctor_func(&generator->key);
+ }
} else if (IS_VAR == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && Z_ISREF_P(key)) {
- ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
+ } else if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
zval_ptr_dtor_nogc(free_op2);
} else {
ZVAL_COPY_VALUE(&generator->key, key);
SAVE_OPLINE();
if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) &&
- (opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
+ UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = NULL;
if (IS_TMP_VAR == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
} else {
expr_ptr = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
if (IS_TMP_VAR == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&new_expr, expr_ptr);
- expr_ptr = &new_expr;
+ /* pass */
} else if (IS_TMP_VAR == IS_CONST) {
- if (!Z_IMMUTABLE_P(expr_ptr)) {
- ZVAL_DUP(&new_expr, expr_ptr);
+ if (UNEXPECTED(Z_OPT_COPYABLE_P(expr_ptr))) {
+ ZVAL_COPY_VALUE(&new_expr, expr_ptr);
+ zval_copy_ctor_func(&new_expr);
expr_ptr = &new_expr;
}
} else if (IS_TMP_VAR == IS_CV) {
zend_ulong hval;
add_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index;
- case IS_LONG:
- hval = Z_LVAL_P(offset);
-num_index:
- zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
- break;
- case IS_STRING:
- str = Z_STR_P(offset);
- if (IS_UNUSED != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(str, hval)) {
- goto num_index;
- }
+ if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
+ str = Z_STR_P(offset);
+ if (IS_UNUSED != IS_CONST) {
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
}
+ }
str_index:
- zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
- break;
- case IS_NULL:
- str = STR_EMPTY_ALLOC();
- goto str_index;
- case IS_FALSE:
- hval = 0;
- goto num_index;
- case IS_TRUE:
- hval = 1;
- goto num_index;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto add_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
- /* do nothing */
- break;
+ zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
+ } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ hval = Z_LVAL_P(offset);
+num_index:
+ zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
+ } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
+ offset = Z_REFVAL_P(offset);
+ goto add_again;
+ } else if (Z_TYPE_P(offset) == IS_NULL) {
+ str = STR_EMPTY_ALLOC();
+ goto str_index;
+ } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_FALSE) {
+ hval = 0;
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_TRUE) {
+ hval = 1;
+ goto num_index;
+ } else {
+ zend_error(E_WARNING, "Illegal offset type");
+ zval_ptr_dtor(expr_ptr);
}
} else {
zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
- if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
if (IS_TMP_VAR != IS_UNUSED) {
zend_free_op free_op1;
- if (EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
/* Constants and temporary variables aren't yieldable by reference,
* but we still allow them with a notice. */
if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) {
value = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
ZVAL_COPY_VALUE(&generator->value, value);
- if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
-
- /* Temporary variables don't need ctor copying */
- if (IS_TMP_VAR != IS_TMP_VAR) {
- zval_opt_copy_ctor(&generator->value);
+ if (IS_TMP_VAR != IS_CONST) {
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
}
} else {
zval *value_ptr = NULL;
/* Consts, temporary variables and references need copying */
if (IS_TMP_VAR == IS_CONST) {
- ZVAL_DUP(&generator->value, value);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
} else if (IS_TMP_VAR == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) && Z_ISREF_P(value)) {
- ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
+ } else if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
} else {
ZVAL_COPY_VALUE(&generator->value, value);
/* Consts, temporary variables and references need copying */
if (IS_UNUSED == IS_CONST) {
- ZVAL_DUP(&generator->key, key);
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) {
+ zval_copy_ctor_func(&generator->key);
+ }
} else if (IS_UNUSED == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_UNUSED == IS_VAR || IS_UNUSED == IS_CV) && Z_ISREF_P(key)) {
- ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
+ } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
} else {
ZVAL_COPY_VALUE(&generator->key, key);
SAVE_OPLINE();
if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) &&
- (opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
+ UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = NULL;
if (IS_TMP_VAR == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
} else {
expr_ptr = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
if (IS_TMP_VAR == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&new_expr, expr_ptr);
- expr_ptr = &new_expr;
+ /* pass */
} else if (IS_TMP_VAR == IS_CONST) {
- if (!Z_IMMUTABLE_P(expr_ptr)) {
- ZVAL_DUP(&new_expr, expr_ptr);
+ if (UNEXPECTED(Z_OPT_COPYABLE_P(expr_ptr))) {
+ ZVAL_COPY_VALUE(&new_expr, expr_ptr);
+ zval_copy_ctor_func(&new_expr);
expr_ptr = &new_expr;
}
} else if (IS_TMP_VAR == IS_CV) {
zend_ulong hval;
add_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index;
- case IS_LONG:
- hval = Z_LVAL_P(offset);
-num_index:
- zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
- break;
- case IS_STRING:
- str = Z_STR_P(offset);
- if (IS_CV != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(str, hval)) {
- goto num_index;
- }
+ if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
+ str = Z_STR_P(offset);
+ if (IS_CV != IS_CONST) {
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
}
+ }
str_index:
- zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
- break;
- case IS_NULL:
- str = STR_EMPTY_ALLOC();
- goto str_index;
- case IS_FALSE:
- hval = 0;
- goto num_index;
- case IS_TRUE:
- hval = 1;
- goto num_index;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto add_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
- /* do nothing */
- break;
+ zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
+ } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ hval = Z_LVAL_P(offset);
+num_index:
+ zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
+ offset = Z_REFVAL_P(offset);
+ goto add_again;
+ } else if (Z_TYPE_P(offset) == IS_NULL) {
+ str = STR_EMPTY_ALLOC();
+ goto str_index;
+ } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_FALSE) {
+ hval = 0;
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_TRUE) {
+ hval = 1;
+ goto num_index;
+ } else {
+ zend_error(E_WARNING, "Illegal offset type");
+ zval_ptr_dtor(expr_ptr);
}
} else {
zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
- if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
if (IS_TMP_VAR != IS_UNUSED) {
zend_free_op free_op1;
- if (EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
/* Constants and temporary variables aren't yieldable by reference,
* but we still allow them with a notice. */
if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) {
value = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
ZVAL_COPY_VALUE(&generator->value, value);
- if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
-
- /* Temporary variables don't need ctor copying */
- if (IS_TMP_VAR != IS_TMP_VAR) {
- zval_opt_copy_ctor(&generator->value);
+ if (IS_TMP_VAR != IS_CONST) {
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
}
} else {
zval *value_ptr = NULL;
/* Consts, temporary variables and references need copying */
if (IS_TMP_VAR == IS_CONST) {
- ZVAL_DUP(&generator->value, value);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
} else if (IS_TMP_VAR == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) && Z_ISREF_P(value)) {
- ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
+ } else if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
} else {
ZVAL_COPY_VALUE(&generator->value, value);
/* Consts, temporary variables and references need copying */
if (IS_CV == IS_CONST) {
- ZVAL_DUP(&generator->key, key);
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) {
+ zval_copy_ctor_func(&generator->key);
+ }
} else if (IS_CV == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_CV == IS_VAR || IS_CV == IS_CV) && Z_ISREF_P(key)) {
- ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
} else {
ZVAL_COPY_VALUE(&generator->key, key);
SAVE_OPLINE();
if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) &&
- (opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
+ UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = NULL;
if (IS_TMP_VAR == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
} else {
expr_ptr = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1);
if (IS_TMP_VAR == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&new_expr, expr_ptr);
- expr_ptr = &new_expr;
+ /* pass */
} else if (IS_TMP_VAR == IS_CONST) {
- if (!Z_IMMUTABLE_P(expr_ptr)) {
- ZVAL_DUP(&new_expr, expr_ptr);
+ if (UNEXPECTED(Z_OPT_COPYABLE_P(expr_ptr))) {
+ ZVAL_COPY_VALUE(&new_expr, expr_ptr);
+ zval_copy_ctor_func(&new_expr);
expr_ptr = &new_expr;
}
} else if (IS_TMP_VAR == IS_CV) {
zend_ulong hval;
add_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index;
- case IS_LONG:
- hval = Z_LVAL_P(offset);
-num_index:
- zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
- break;
- case IS_STRING:
- str = Z_STR_P(offset);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(str, hval)) {
- goto num_index;
- }
+ if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
+ str = Z_STR_P(offset);
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
}
+ }
str_index:
- zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
- break;
- case IS_NULL:
- str = STR_EMPTY_ALLOC();
- goto str_index;
- case IS_FALSE:
- hval = 0;
- goto num_index;
- case IS_TRUE:
- hval = 1;
- goto num_index;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto add_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
- /* do nothing */
- break;
+ zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
+ } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ hval = Z_LVAL_P(offset);
+num_index:
+ zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
+ } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
+ offset = Z_REFVAL_P(offset);
+ goto add_again;
+ } else if (Z_TYPE_P(offset) == IS_NULL) {
+ str = STR_EMPTY_ALLOC();
+ goto str_index;
+ } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_FALSE) {
+ hval = 0;
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_TRUE) {
+ hval = 1;
+ goto num_index;
+ } else {
+ zend_error(E_WARNING, "Illegal offset type");
+ zval_ptr_dtor(expr_ptr);
}
zval_ptr_dtor_nogc(free_op2);
} else {
SAVE_OPLINE();
if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) &&
- (opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
+ UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
} else {
expr_ptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&new_expr, expr_ptr);
- expr_ptr = &new_expr;
+ /* pass */
} else if (IS_VAR == IS_CONST) {
- if (!Z_IMMUTABLE_P(expr_ptr)) {
- ZVAL_DUP(&new_expr, expr_ptr);
+ if (UNEXPECTED(Z_OPT_COPYABLE_P(expr_ptr))) {
+ ZVAL_COPY_VALUE(&new_expr, expr_ptr);
+ zval_copy_ctor_func(&new_expr);
expr_ptr = &new_expr;
}
} else if (IS_VAR == IS_CV) {
zend_ulong hval;
add_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index;
- case IS_LONG:
- hval = Z_LVAL_P(offset);
-num_index:
- zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
- break;
- case IS_STRING:
- str = Z_STR_P(offset);
- if (IS_CONST != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(str, hval)) {
- goto num_index;
- }
+ if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
+ str = Z_STR_P(offset);
+ if (IS_CONST != IS_CONST) {
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
}
+ }
str_index:
- zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
- break;
- case IS_NULL:
- str = STR_EMPTY_ALLOC();
- goto str_index;
- case IS_FALSE:
- hval = 0;
- goto num_index;
- case IS_TRUE:
- hval = 1;
- goto num_index;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto add_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
- /* do nothing */
- break;
+ zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
+ } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ hval = Z_LVAL_P(offset);
+num_index:
+ zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
+ } else if ((IS_CONST & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
+ offset = Z_REFVAL_P(offset);
+ goto add_again;
+ } else if (Z_TYPE_P(offset) == IS_NULL) {
+ str = STR_EMPTY_ALLOC();
+ goto str_index;
+ } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_FALSE) {
+ hval = 0;
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_TRUE) {
+ hval = 1;
+ goto num_index;
+ } else {
+ zend_error(E_WARNING, "Illegal offset type");
+ zval_ptr_dtor(expr_ptr);
}
} else {
zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
- if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
if (IS_VAR != IS_UNUSED) {
zend_free_op free_op1;
- if (EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
/* Constants and temporary variables aren't yieldable by reference,
* but we still allow them with a notice. */
if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) {
value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
ZVAL_COPY_VALUE(&generator->value, value);
- if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
-
- /* Temporary variables don't need ctor copying */
- if (IS_VAR != IS_TMP_VAR) {
- zval_opt_copy_ctor(&generator->value);
+ if (IS_VAR != IS_CONST) {
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
}
} else {
zval *value_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
/* Consts, temporary variables and references need copying */
if (IS_VAR == IS_CONST) {
- ZVAL_DUP(&generator->value, value);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
} else if (IS_VAR == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_VAR == IS_CV || IS_VAR == IS_VAR) && Z_ISREF_P(value)) {
- ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
+ } else if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
zval_ptr_dtor_nogc(free_op1);
} else {
ZVAL_COPY_VALUE(&generator->value, value);
/* Consts, temporary variables and references need copying */
if (IS_CONST == IS_CONST) {
- ZVAL_DUP(&generator->key, key);
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) {
+ zval_copy_ctor_func(&generator->key);
+ }
} else if (IS_CONST == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && Z_ISREF_P(key)) {
- ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
+ } else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
} else {
ZVAL_COPY_VALUE(&generator->key, key);
zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
- if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
if (IS_VAR != IS_UNUSED) {
zend_free_op free_op1;
- if (EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
/* Constants and temporary variables aren't yieldable by reference,
* but we still allow them with a notice. */
if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) {
value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
ZVAL_COPY_VALUE(&generator->value, value);
- if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
-
- /* Temporary variables don't need ctor copying */
- if (IS_VAR != IS_TMP_VAR) {
- zval_opt_copy_ctor(&generator->value);
+ if (IS_VAR != IS_CONST) {
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
}
} else {
zval *value_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
/* Consts, temporary variables and references need copying */
if (IS_VAR == IS_CONST) {
- ZVAL_DUP(&generator->value, value);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
} else if (IS_VAR == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_VAR == IS_CV || IS_VAR == IS_VAR) && Z_ISREF_P(value)) {
- ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
+ } else if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
zval_ptr_dtor_nogc(free_op1);
} else {
ZVAL_COPY_VALUE(&generator->value, value);
/* Consts, temporary variables and references need copying */
if (IS_TMP_VAR == IS_CONST) {
- ZVAL_DUP(&generator->key, key);
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) {
+ zval_copy_ctor_func(&generator->key);
+ }
} else if (IS_TMP_VAR == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && Z_ISREF_P(key)) {
- ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
+ } else if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
} else {
ZVAL_COPY_VALUE(&generator->key, key);
zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
- if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
if (IS_VAR != IS_UNUSED) {
zend_free_op free_op1;
- if (EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
/* Constants and temporary variables aren't yieldable by reference,
* but we still allow them with a notice. */
if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) {
value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
ZVAL_COPY_VALUE(&generator->value, value);
- if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
-
- /* Temporary variables don't need ctor copying */
- if (IS_VAR != IS_TMP_VAR) {
- zval_opt_copy_ctor(&generator->value);
+ if (IS_VAR != IS_CONST) {
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
}
} else {
zval *value_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
/* Consts, temporary variables and references need copying */
if (IS_VAR == IS_CONST) {
- ZVAL_DUP(&generator->value, value);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
} else if (IS_VAR == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_VAR == IS_CV || IS_VAR == IS_VAR) && Z_ISREF_P(value)) {
- ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
+ } else if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
zval_ptr_dtor_nogc(free_op1);
} else {
ZVAL_COPY_VALUE(&generator->value, value);
/* Consts, temporary variables and references need copying */
if (IS_VAR == IS_CONST) {
- ZVAL_DUP(&generator->key, key);
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) {
+ zval_copy_ctor_func(&generator->key);
+ }
} else if (IS_VAR == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && Z_ISREF_P(key)) {
- ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
+ } else if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
zval_ptr_dtor_nogc(free_op2);
} else {
ZVAL_COPY_VALUE(&generator->key, key);
SAVE_OPLINE();
if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) &&
- (opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
+ UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
} else {
expr_ptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&new_expr, expr_ptr);
- expr_ptr = &new_expr;
+ /* pass */
} else if (IS_VAR == IS_CONST) {
- if (!Z_IMMUTABLE_P(expr_ptr)) {
- ZVAL_DUP(&new_expr, expr_ptr);
+ if (UNEXPECTED(Z_OPT_COPYABLE_P(expr_ptr))) {
+ ZVAL_COPY_VALUE(&new_expr, expr_ptr);
+ zval_copy_ctor_func(&new_expr);
expr_ptr = &new_expr;
}
} else if (IS_VAR == IS_CV) {
zend_ulong hval;
add_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index;
- case IS_LONG:
- hval = Z_LVAL_P(offset);
-num_index:
- zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
- break;
- case IS_STRING:
- str = Z_STR_P(offset);
- if (IS_UNUSED != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(str, hval)) {
- goto num_index;
- }
+ if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
+ str = Z_STR_P(offset);
+ if (IS_UNUSED != IS_CONST) {
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
}
+ }
str_index:
- zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
- break;
- case IS_NULL:
- str = STR_EMPTY_ALLOC();
- goto str_index;
- case IS_FALSE:
- hval = 0;
- goto num_index;
- case IS_TRUE:
- hval = 1;
- goto num_index;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto add_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
- /* do nothing */
- break;
+ zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
+ } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ hval = Z_LVAL_P(offset);
+num_index:
+ zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
+ } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
+ offset = Z_REFVAL_P(offset);
+ goto add_again;
+ } else if (Z_TYPE_P(offset) == IS_NULL) {
+ str = STR_EMPTY_ALLOC();
+ goto str_index;
+ } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_FALSE) {
+ hval = 0;
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_TRUE) {
+ hval = 1;
+ goto num_index;
+ } else {
+ zend_error(E_WARNING, "Illegal offset type");
+ zval_ptr_dtor(expr_ptr);
}
} else {
zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
- if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
if (IS_VAR != IS_UNUSED) {
zend_free_op free_op1;
- if (EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
/* Constants and temporary variables aren't yieldable by reference,
* but we still allow them with a notice. */
if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) {
value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
ZVAL_COPY_VALUE(&generator->value, value);
- if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
-
- /* Temporary variables don't need ctor copying */
- if (IS_VAR != IS_TMP_VAR) {
- zval_opt_copy_ctor(&generator->value);
+ if (IS_VAR != IS_CONST) {
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
}
} else {
zval *value_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
/* Consts, temporary variables and references need copying */
if (IS_VAR == IS_CONST) {
- ZVAL_DUP(&generator->value, value);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
} else if (IS_VAR == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_VAR == IS_CV || IS_VAR == IS_VAR) && Z_ISREF_P(value)) {
- ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
+ } else if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
zval_ptr_dtor_nogc(free_op1);
} else {
ZVAL_COPY_VALUE(&generator->value, value);
/* Consts, temporary variables and references need copying */
if (IS_UNUSED == IS_CONST) {
- ZVAL_DUP(&generator->key, key);
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) {
+ zval_copy_ctor_func(&generator->key);
+ }
} else if (IS_UNUSED == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_UNUSED == IS_VAR || IS_UNUSED == IS_CV) && Z_ISREF_P(key)) {
- ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
+ } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
} else {
ZVAL_COPY_VALUE(&generator->key, key);
SAVE_OPLINE();
if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) &&
- (opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
+ UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
} else {
expr_ptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&new_expr, expr_ptr);
- expr_ptr = &new_expr;
+ /* pass */
} else if (IS_VAR == IS_CONST) {
- if (!Z_IMMUTABLE_P(expr_ptr)) {
- ZVAL_DUP(&new_expr, expr_ptr);
+ if (UNEXPECTED(Z_OPT_COPYABLE_P(expr_ptr))) {
+ ZVAL_COPY_VALUE(&new_expr, expr_ptr);
+ zval_copy_ctor_func(&new_expr);
expr_ptr = &new_expr;
}
} else if (IS_VAR == IS_CV) {
zend_ulong hval;
add_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index;
- case IS_LONG:
- hval = Z_LVAL_P(offset);
-num_index:
- zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
- break;
- case IS_STRING:
- str = Z_STR_P(offset);
- if (IS_CV != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(str, hval)) {
- goto num_index;
- }
+ if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
+ str = Z_STR_P(offset);
+ if (IS_CV != IS_CONST) {
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
}
+ }
str_index:
- zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
- break;
- case IS_NULL:
- str = STR_EMPTY_ALLOC();
- goto str_index;
- case IS_FALSE:
- hval = 0;
- goto num_index;
- case IS_TRUE:
- hval = 1;
- goto num_index;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto add_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
- /* do nothing */
- break;
+ zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
+ } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ hval = Z_LVAL_P(offset);
+num_index:
+ zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
+ offset = Z_REFVAL_P(offset);
+ goto add_again;
+ } else if (Z_TYPE_P(offset) == IS_NULL) {
+ str = STR_EMPTY_ALLOC();
+ goto str_index;
+ } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_FALSE) {
+ hval = 0;
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_TRUE) {
+ hval = 1;
+ goto num_index;
+ } else {
+ zend_error(E_WARNING, "Illegal offset type");
+ zval_ptr_dtor(expr_ptr);
}
} else {
zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
- if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
if (IS_VAR != IS_UNUSED) {
zend_free_op free_op1;
- if (EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
/* Constants and temporary variables aren't yieldable by reference,
* but we still allow them with a notice. */
if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) {
value = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
ZVAL_COPY_VALUE(&generator->value, value);
- if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
-
- /* Temporary variables don't need ctor copying */
- if (IS_VAR != IS_TMP_VAR) {
- zval_opt_copy_ctor(&generator->value);
+ if (IS_VAR != IS_CONST) {
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
}
} else {
zval *value_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
/* Consts, temporary variables and references need copying */
if (IS_VAR == IS_CONST) {
- ZVAL_DUP(&generator->value, value);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
} else if (IS_VAR == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_VAR == IS_CV || IS_VAR == IS_VAR) && Z_ISREF_P(value)) {
- ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
+ } else if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
zval_ptr_dtor_nogc(free_op1);
} else {
ZVAL_COPY_VALUE(&generator->value, value);
/* Consts, temporary variables and references need copying */
if (IS_CV == IS_CONST) {
- ZVAL_DUP(&generator->key, key);
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) {
+ zval_copy_ctor_func(&generator->key);
+ }
} else if (IS_CV == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_CV == IS_VAR || IS_CV == IS_CV) && Z_ISREF_P(key)) {
- ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
} else {
ZVAL_COPY_VALUE(&generator->key, key);
SAVE_OPLINE();
if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) &&
- (opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
+ UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
} else {
expr_ptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1);
if (IS_VAR == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&new_expr, expr_ptr);
- expr_ptr = &new_expr;
+ /* pass */
} else if (IS_VAR == IS_CONST) {
- if (!Z_IMMUTABLE_P(expr_ptr)) {
- ZVAL_DUP(&new_expr, expr_ptr);
+ if (UNEXPECTED(Z_OPT_COPYABLE_P(expr_ptr))) {
+ ZVAL_COPY_VALUE(&new_expr, expr_ptr);
+ zval_copy_ctor_func(&new_expr);
expr_ptr = &new_expr;
}
} else if (IS_VAR == IS_CV) {
zend_ulong hval;
add_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index;
- case IS_LONG:
- hval = Z_LVAL_P(offset);
-num_index:
- zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
- break;
- case IS_STRING:
- str = Z_STR_P(offset);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(str, hval)) {
- goto num_index;
- }
+ if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
+ str = Z_STR_P(offset);
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
}
+ }
str_index:
- zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
- break;
- case IS_NULL:
- str = STR_EMPTY_ALLOC();
- goto str_index;
- case IS_FALSE:
- hval = 0;
- goto num_index;
- case IS_TRUE:
- hval = 1;
- goto num_index;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto add_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
- /* do nothing */
- break;
+ zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
+ } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ hval = Z_LVAL_P(offset);
+num_index:
+ zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
+ } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
+ offset = Z_REFVAL_P(offset);
+ goto add_again;
+ } else if (Z_TYPE_P(offset) == IS_NULL) {
+ str = STR_EMPTY_ALLOC();
+ goto str_index;
+ } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_FALSE) {
+ hval = 0;
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_TRUE) {
+ hval = 1;
+ goto num_index;
+ } else {
+ zend_error(E_WARNING, "Illegal offset type");
+ zval_ptr_dtor(expr_ptr);
}
zval_ptr_dtor_nogc(free_op2);
} else {
zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
- if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
if (IS_UNUSED != IS_UNUSED) {
- if (EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
/* Constants and temporary variables aren't yieldable by reference,
* but we still allow them with a notice. */
if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) {
value = NULL;
ZVAL_COPY_VALUE(&generator->value, value);
- if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
-
- /* Temporary variables don't need ctor copying */
- if (IS_UNUSED != IS_TMP_VAR) {
- zval_opt_copy_ctor(&generator->value);
+ if (IS_UNUSED != IS_CONST) {
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
}
} else {
zval *value_ptr = NULL;
/* Consts, temporary variables and references need copying */
if (IS_UNUSED == IS_CONST) {
- ZVAL_DUP(&generator->value, value);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
} else if (IS_UNUSED == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_UNUSED == IS_CV || IS_UNUSED == IS_VAR) && Z_ISREF_P(value)) {
- ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
+ } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
} else {
ZVAL_COPY_VALUE(&generator->value, value);
/* Consts, temporary variables and references need copying */
if (IS_CONST == IS_CONST) {
- ZVAL_DUP(&generator->key, key);
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) {
+ zval_copy_ctor_func(&generator->key);
+ }
} else if (IS_CONST == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && Z_ISREF_P(key)) {
- ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
+ } else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
} else {
ZVAL_COPY_VALUE(&generator->key, key);
zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
- if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
if (IS_UNUSED != IS_UNUSED) {
- if (EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
/* Constants and temporary variables aren't yieldable by reference,
* but we still allow them with a notice. */
if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) {
value = NULL;
ZVAL_COPY_VALUE(&generator->value, value);
- if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
-
- /* Temporary variables don't need ctor copying */
- if (IS_UNUSED != IS_TMP_VAR) {
- zval_opt_copy_ctor(&generator->value);
+ if (IS_UNUSED != IS_CONST) {
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
}
} else {
zval *value_ptr = NULL;
/* Consts, temporary variables and references need copying */
if (IS_UNUSED == IS_CONST) {
- ZVAL_DUP(&generator->value, value);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
} else if (IS_UNUSED == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_UNUSED == IS_CV || IS_UNUSED == IS_VAR) && Z_ISREF_P(value)) {
- ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
+ } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
} else {
ZVAL_COPY_VALUE(&generator->value, value);
/* Consts, temporary variables and references need copying */
if (IS_TMP_VAR == IS_CONST) {
- ZVAL_DUP(&generator->key, key);
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) {
+ zval_copy_ctor_func(&generator->key);
+ }
} else if (IS_TMP_VAR == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && Z_ISREF_P(key)) {
- ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
+ } else if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
} else {
ZVAL_COPY_VALUE(&generator->key, key);
zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
- if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
if (IS_UNUSED != IS_UNUSED) {
- if (EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
/* Constants and temporary variables aren't yieldable by reference,
* but we still allow them with a notice. */
if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) {
value = NULL;
ZVAL_COPY_VALUE(&generator->value, value);
- if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
-
- /* Temporary variables don't need ctor copying */
- if (IS_UNUSED != IS_TMP_VAR) {
- zval_opt_copy_ctor(&generator->value);
+ if (IS_UNUSED != IS_CONST) {
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
}
} else {
zval *value_ptr = NULL;
/* Consts, temporary variables and references need copying */
if (IS_UNUSED == IS_CONST) {
- ZVAL_DUP(&generator->value, value);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
} else if (IS_UNUSED == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_UNUSED == IS_CV || IS_UNUSED == IS_VAR) && Z_ISREF_P(value)) {
- ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
+ } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
} else {
ZVAL_COPY_VALUE(&generator->value, value);
/* Consts, temporary variables and references need copying */
if (IS_VAR == IS_CONST) {
- ZVAL_DUP(&generator->key, key);
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) {
+ zval_copy_ctor_func(&generator->key);
+ }
} else if (IS_VAR == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && Z_ISREF_P(key)) {
- ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
+ } else if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
zval_ptr_dtor_nogc(free_op2);
} else {
ZVAL_COPY_VALUE(&generator->key, key);
zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
- if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
if (IS_UNUSED != IS_UNUSED) {
- if (EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
/* Constants and temporary variables aren't yieldable by reference,
* but we still allow them with a notice. */
if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) {
value = NULL;
ZVAL_COPY_VALUE(&generator->value, value);
- if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
-
- /* Temporary variables don't need ctor copying */
- if (IS_UNUSED != IS_TMP_VAR) {
- zval_opt_copy_ctor(&generator->value);
+ if (IS_UNUSED != IS_CONST) {
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
}
} else {
zval *value_ptr = NULL;
/* Consts, temporary variables and references need copying */
if (IS_UNUSED == IS_CONST) {
- ZVAL_DUP(&generator->value, value);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
} else if (IS_UNUSED == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_UNUSED == IS_CV || IS_UNUSED == IS_VAR) && Z_ISREF_P(value)) {
- ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
+ } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
} else {
ZVAL_COPY_VALUE(&generator->value, value);
/* Consts, temporary variables and references need copying */
if (IS_UNUSED == IS_CONST) {
- ZVAL_DUP(&generator->key, key);
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) {
+ zval_copy_ctor_func(&generator->key);
+ }
} else if (IS_UNUSED == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_UNUSED == IS_VAR || IS_UNUSED == IS_CV) && Z_ISREF_P(key)) {
- ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
+ } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
} else {
ZVAL_COPY_VALUE(&generator->key, key);
zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
- if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
if (IS_UNUSED != IS_UNUSED) {
- if (EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
/* Constants and temporary variables aren't yieldable by reference,
* but we still allow them with a notice. */
if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) {
value = NULL;
ZVAL_COPY_VALUE(&generator->value, value);
- if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
-
- /* Temporary variables don't need ctor copying */
- if (IS_UNUSED != IS_TMP_VAR) {
- zval_opt_copy_ctor(&generator->value);
+ if (IS_UNUSED != IS_CONST) {
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
}
} else {
zval *value_ptr = NULL;
/* Consts, temporary variables and references need copying */
if (IS_UNUSED == IS_CONST) {
- ZVAL_DUP(&generator->value, value);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
} else if (IS_UNUSED == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_UNUSED == IS_CV || IS_UNUSED == IS_VAR) && Z_ISREF_P(value)) {
- ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
+ } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
} else {
ZVAL_COPY_VALUE(&generator->value, value);
/* Consts, temporary variables and references need copying */
if (IS_CV == IS_CONST) {
- ZVAL_DUP(&generator->key, key);
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) {
+ zval_copy_ctor_func(&generator->key);
+ }
} else if (IS_CV == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_CV == IS_VAR || IS_CV == IS_CV) && Z_ISREF_P(key)) {
- ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
} else {
ZVAL_COPY_VALUE(&generator->key, key);
SAVE_OPLINE();
if ((IS_CV == IS_VAR || IS_CV == IS_CV) &&
- (opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
+ UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
} else {
expr_ptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
if (IS_CV == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&new_expr, expr_ptr);
- expr_ptr = &new_expr;
+ /* pass */
} else if (IS_CV == IS_CONST) {
- if (!Z_IMMUTABLE_P(expr_ptr)) {
- ZVAL_DUP(&new_expr, expr_ptr);
+ if (UNEXPECTED(Z_OPT_COPYABLE_P(expr_ptr))) {
+ ZVAL_COPY_VALUE(&new_expr, expr_ptr);
+ zval_copy_ctor_func(&new_expr);
expr_ptr = &new_expr;
}
} else if (IS_CV == IS_CV) {
zend_ulong hval;
add_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index;
- case IS_LONG:
- hval = Z_LVAL_P(offset);
-num_index:
- zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
- break;
- case IS_STRING:
- str = Z_STR_P(offset);
- if (IS_CONST != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(str, hval)) {
- goto num_index;
- }
+ if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
+ str = Z_STR_P(offset);
+ if (IS_CONST != IS_CONST) {
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
}
+ }
str_index:
- zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
- break;
- case IS_NULL:
- str = STR_EMPTY_ALLOC();
- goto str_index;
- case IS_FALSE:
- hval = 0;
- goto num_index;
- case IS_TRUE:
- hval = 1;
- goto num_index;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto add_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
- /* do nothing */
- break;
+ zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
+ } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ hval = Z_LVAL_P(offset);
+num_index:
+ zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
+ } else if ((IS_CONST & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
+ offset = Z_REFVAL_P(offset);
+ goto add_again;
+ } else if (Z_TYPE_P(offset) == IS_NULL) {
+ str = STR_EMPTY_ALLOC();
+ goto str_index;
+ } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_FALSE) {
+ hval = 0;
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_TRUE) {
+ hval = 1;
+ goto num_index;
+ } else {
+ zend_error(E_WARNING, "Illegal offset type");
+ zval_ptr_dtor(expr_ptr);
}
} else {
zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
- if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
if (IS_CV != IS_UNUSED) {
- if (EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
/* Constants and temporary variables aren't yieldable by reference,
* but we still allow them with a notice. */
if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) {
value = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
ZVAL_COPY_VALUE(&generator->value, value);
- if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
-
- /* Temporary variables don't need ctor copying */
- if (IS_CV != IS_TMP_VAR) {
- zval_opt_copy_ctor(&generator->value);
+ if (IS_CV != IS_CONST) {
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
}
} else {
zval *value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var);
/* Consts, temporary variables and references need copying */
if (IS_CV == IS_CONST) {
- ZVAL_DUP(&generator->value, value);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
} else if (IS_CV == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_CV == IS_CV || IS_CV == IS_VAR) && Z_ISREF_P(value)) {
- ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
} else {
ZVAL_COPY_VALUE(&generator->value, value);
/* Consts, temporary variables and references need copying */
if (IS_CONST == IS_CONST) {
- ZVAL_DUP(&generator->key, key);
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) {
+ zval_copy_ctor_func(&generator->key);
+ }
} else if (IS_CONST == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && Z_ISREF_P(key)) {
- ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
+ } else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
} else {
ZVAL_COPY_VALUE(&generator->key, key);
zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
- if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
if (IS_CV != IS_UNUSED) {
- if (EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
/* Constants and temporary variables aren't yieldable by reference,
* but we still allow them with a notice. */
if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) {
value = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
ZVAL_COPY_VALUE(&generator->value, value);
- if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
-
- /* Temporary variables don't need ctor copying */
- if (IS_CV != IS_TMP_VAR) {
- zval_opt_copy_ctor(&generator->value);
+ if (IS_CV != IS_CONST) {
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
}
} else {
zval *value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var);
/* Consts, temporary variables and references need copying */
if (IS_CV == IS_CONST) {
- ZVAL_DUP(&generator->value, value);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
} else if (IS_CV == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_CV == IS_CV || IS_CV == IS_VAR) && Z_ISREF_P(value)) {
- ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
} else {
ZVAL_COPY_VALUE(&generator->value, value);
/* Consts, temporary variables and references need copying */
if (IS_TMP_VAR == IS_CONST) {
- ZVAL_DUP(&generator->key, key);
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) {
+ zval_copy_ctor_func(&generator->key);
+ }
} else if (IS_TMP_VAR == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && Z_ISREF_P(key)) {
- ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
+ } else if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
} else {
ZVAL_COPY_VALUE(&generator->key, key);
zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
- if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
if (IS_CV != IS_UNUSED) {
- if (EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
/* Constants and temporary variables aren't yieldable by reference,
* but we still allow them with a notice. */
if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) {
value = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
ZVAL_COPY_VALUE(&generator->value, value);
- if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
-
- /* Temporary variables don't need ctor copying */
- if (IS_CV != IS_TMP_VAR) {
- zval_opt_copy_ctor(&generator->value);
+ if (IS_CV != IS_CONST) {
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
}
} else {
zval *value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var);
/* Consts, temporary variables and references need copying */
if (IS_CV == IS_CONST) {
- ZVAL_DUP(&generator->value, value);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
} else if (IS_CV == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_CV == IS_CV || IS_CV == IS_VAR) && Z_ISREF_P(value)) {
- ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
} else {
ZVAL_COPY_VALUE(&generator->value, value);
/* Consts, temporary variables and references need copying */
if (IS_VAR == IS_CONST) {
- ZVAL_DUP(&generator->key, key);
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) {
+ zval_copy_ctor_func(&generator->key);
+ }
} else if (IS_VAR == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && Z_ISREF_P(key)) {
- ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
+ } else if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
zval_ptr_dtor_nogc(free_op2);
} else {
ZVAL_COPY_VALUE(&generator->key, key);
SAVE_OPLINE();
if ((IS_CV == IS_VAR || IS_CV == IS_CV) &&
- (opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
+ UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
} else {
expr_ptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
if (IS_CV == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&new_expr, expr_ptr);
- expr_ptr = &new_expr;
+ /* pass */
} else if (IS_CV == IS_CONST) {
- if (!Z_IMMUTABLE_P(expr_ptr)) {
- ZVAL_DUP(&new_expr, expr_ptr);
+ if (UNEXPECTED(Z_OPT_COPYABLE_P(expr_ptr))) {
+ ZVAL_COPY_VALUE(&new_expr, expr_ptr);
+ zval_copy_ctor_func(&new_expr);
expr_ptr = &new_expr;
}
} else if (IS_CV == IS_CV) {
zend_ulong hval;
add_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index;
- case IS_LONG:
- hval = Z_LVAL_P(offset);
-num_index:
- zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
- break;
- case IS_STRING:
- str = Z_STR_P(offset);
- if (IS_UNUSED != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(str, hval)) {
- goto num_index;
- }
+ if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
+ str = Z_STR_P(offset);
+ if (IS_UNUSED != IS_CONST) {
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
}
+ }
str_index:
- zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
- break;
- case IS_NULL:
- str = STR_EMPTY_ALLOC();
- goto str_index;
- case IS_FALSE:
- hval = 0;
- goto num_index;
- case IS_TRUE:
- hval = 1;
- goto num_index;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto add_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
- /* do nothing */
- break;
+ zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
+ } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ hval = Z_LVAL_P(offset);
+num_index:
+ zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
+ } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
+ offset = Z_REFVAL_P(offset);
+ goto add_again;
+ } else if (Z_TYPE_P(offset) == IS_NULL) {
+ str = STR_EMPTY_ALLOC();
+ goto str_index;
+ } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_FALSE) {
+ hval = 0;
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_TRUE) {
+ hval = 1;
+ goto num_index;
+ } else {
+ zend_error(E_WARNING, "Illegal offset type");
+ zval_ptr_dtor(expr_ptr);
}
} else {
zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
- if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
if (IS_CV != IS_UNUSED) {
- if (EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
/* Constants and temporary variables aren't yieldable by reference,
* but we still allow them with a notice. */
if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) {
value = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
ZVAL_COPY_VALUE(&generator->value, value);
- if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
-
- /* Temporary variables don't need ctor copying */
- if (IS_CV != IS_TMP_VAR) {
- zval_opt_copy_ctor(&generator->value);
+ if (IS_CV != IS_CONST) {
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
}
} else {
zval *value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var);
/* Consts, temporary variables and references need copying */
if (IS_CV == IS_CONST) {
- ZVAL_DUP(&generator->value, value);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
} else if (IS_CV == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_CV == IS_CV || IS_CV == IS_VAR) && Z_ISREF_P(value)) {
- ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
} else {
ZVAL_COPY_VALUE(&generator->value, value);
/* Consts, temporary variables and references need copying */
if (IS_UNUSED == IS_CONST) {
- ZVAL_DUP(&generator->key, key);
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) {
+ zval_copy_ctor_func(&generator->key);
+ }
} else if (IS_UNUSED == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_UNUSED == IS_VAR || IS_UNUSED == IS_CV) && Z_ISREF_P(key)) {
- ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
+ } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
} else {
ZVAL_COPY_VALUE(&generator->key, key);
SAVE_OPLINE();
if ((IS_CV == IS_VAR || IS_CV == IS_CV) &&
- (opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
+ UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
} else {
expr_ptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
if (IS_CV == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&new_expr, expr_ptr);
- expr_ptr = &new_expr;
+ /* pass */
} else if (IS_CV == IS_CONST) {
- if (!Z_IMMUTABLE_P(expr_ptr)) {
- ZVAL_DUP(&new_expr, expr_ptr);
+ if (UNEXPECTED(Z_OPT_COPYABLE_P(expr_ptr))) {
+ ZVAL_COPY_VALUE(&new_expr, expr_ptr);
+ zval_copy_ctor_func(&new_expr);
expr_ptr = &new_expr;
}
} else if (IS_CV == IS_CV) {
zend_ulong hval;
add_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index;
- case IS_LONG:
- hval = Z_LVAL_P(offset);
-num_index:
- zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
- break;
- case IS_STRING:
- str = Z_STR_P(offset);
- if (IS_CV != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(str, hval)) {
- goto num_index;
- }
+ if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
+ str = Z_STR_P(offset);
+ if (IS_CV != IS_CONST) {
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
}
+ }
str_index:
- zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
- break;
- case IS_NULL:
- str = STR_EMPTY_ALLOC();
- goto str_index;
- case IS_FALSE:
- hval = 0;
- goto num_index;
- case IS_TRUE:
- hval = 1;
- goto num_index;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto add_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
- /* do nothing */
- break;
+ zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
+ } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ hval = Z_LVAL_P(offset);
+num_index:
+ zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
+ offset = Z_REFVAL_P(offset);
+ goto add_again;
+ } else if (Z_TYPE_P(offset) == IS_NULL) {
+ str = STR_EMPTY_ALLOC();
+ goto str_index;
+ } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_FALSE) {
+ hval = 0;
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_TRUE) {
+ hval = 1;
+ goto num_index;
+ } else {
+ zend_error(E_WARNING, "Illegal offset type");
+ zval_ptr_dtor(expr_ptr);
}
} else {
zend_generator *generator = zend_get_running_generator(execute_data);
SAVE_OPLINE();
- if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
+ if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot yield from finally in a force-closed generator");
if (IS_CV != IS_UNUSED) {
- if (EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE) {
+ if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
/* Constants and temporary variables aren't yieldable by reference,
* but we still allow them with a notice. */
if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) {
value = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
ZVAL_COPY_VALUE(&generator->value, value);
- if (Z_OPT_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
-
- /* Temporary variables don't need ctor copying */
- if (IS_CV != IS_TMP_VAR) {
- zval_opt_copy_ctor(&generator->value);
+ if (IS_CV != IS_CONST) {
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
}
} else {
zval *value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var);
/* Consts, temporary variables and references need copying */
if (IS_CV == IS_CONST) {
- ZVAL_DUP(&generator->value, value);
+ ZVAL_COPY_VALUE(&generator->value, value);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) {
+ zval_copy_ctor_func(&generator->value);
+ }
} else if (IS_CV == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->value, value);
- } else if ((IS_CV == IS_CV || IS_CV == IS_VAR) && Z_ISREF_P(value)) {
- ZVAL_DUP(&generator->value, Z_REFVAL_P(value));
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) {
+ ZVAL_COPY(&generator->value, Z_REFVAL_P(value));
} else {
ZVAL_COPY_VALUE(&generator->value, value);
/* Consts, temporary variables and references need copying */
if (IS_CV == IS_CONST) {
- ZVAL_DUP(&generator->key, key);
+ ZVAL_COPY_VALUE(&generator->key, key);
+ if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) {
+ zval_copy_ctor_func(&generator->key);
+ }
} else if (IS_CV == IS_TMP_VAR) {
ZVAL_COPY_VALUE(&generator->key, key);
- } else if ((IS_CV == IS_VAR || IS_CV == IS_CV) && Z_ISREF_P(key)) {
- ZVAL_DUP(&generator->key, Z_REFVAL_P(key));
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) {
+ ZVAL_COPY(&generator->key, Z_REFVAL_P(key));
} else {
ZVAL_COPY_VALUE(&generator->key, key);
SAVE_OPLINE();
if ((IS_CV == IS_VAR || IS_CV == IS_CV) &&
- (opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
+ UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) {
expr_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var);
if (IS_CV == IS_VAR && UNEXPECTED(expr_ptr == NULL)) {
zend_error(E_EXCEPTION | E_ERROR, "Cannot create references to/from string offsets");
} else {
expr_ptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var);
if (IS_CV == IS_TMP_VAR) {
- ZVAL_COPY_VALUE(&new_expr, expr_ptr);
- expr_ptr = &new_expr;
+ /* pass */
} else if (IS_CV == IS_CONST) {
- if (!Z_IMMUTABLE_P(expr_ptr)) {
- ZVAL_DUP(&new_expr, expr_ptr);
+ if (UNEXPECTED(Z_OPT_COPYABLE_P(expr_ptr))) {
+ ZVAL_COPY_VALUE(&new_expr, expr_ptr);
+ zval_copy_ctor_func(&new_expr);
expr_ptr = &new_expr;
}
} else if (IS_CV == IS_CV) {
zend_ulong hval;
add_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- goto num_index;
- case IS_LONG:
- hval = Z_LVAL_P(offset);
-num_index:
- zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
- break;
- case IS_STRING:
- str = Z_STR_P(offset);
- if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
- if (ZEND_HANDLE_NUMERIC(str, hval)) {
- goto num_index;
- }
+ if (EXPECTED(Z_TYPE_P(offset) == IS_STRING)) {
+ str = Z_STR_P(offset);
+ if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
}
+ }
str_index:
- zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
- break;
- case IS_NULL:
- str = STR_EMPTY_ALLOC();
- goto str_index;
- case IS_FALSE:
- hval = 0;
- goto num_index;
- case IS_TRUE:
- hval = 1;
- goto num_index;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto add_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type");
- zval_ptr_dtor(expr_ptr);
- /* do nothing */
- break;
+ zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
+ } else if (EXPECTED(Z_TYPE_P(offset) == IS_LONG)) {
+ hval = Z_LVAL_P(offset);
+num_index:
+ zend_hash_index_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), hval, expr_ptr);
+ } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && EXPECTED(Z_TYPE_P(offset) == IS_REFERENCE)) {
+ offset = Z_REFVAL_P(offset);
+ goto add_again;
+ } else if (Z_TYPE_P(offset) == IS_NULL) {
+ str = STR_EMPTY_ALLOC();
+ goto str_index;
+ } else if (Z_TYPE_P(offset) == IS_DOUBLE) {
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_FALSE) {
+ hval = 0;
+ goto num_index;
+ } else if (Z_TYPE_P(offset) == IS_TRUE) {
+ hval = 1;
+ goto num_index;
+ } else {
+ zend_error(E_WARNING, "Illegal offset type");
+ zval_ptr_dtor(expr_ptr);
}
zval_ptr_dtor_nogc(free_op2);
} else {