mirror of
https://github.com/php/php-src.git
synced 2025-08-17 22:48:57 +02:00
Fixed ZEND_CAST related optimizations (now it returns IS_VAR instead of IS_TMP_VAR)
This commit is contained in:
parent
dfaf8b6d28
commit
c92dd8eedf
2 changed files with 12 additions and 3 deletions
|
@ -683,7 +683,7 @@ static void zend_optimize_block(zend_code_block *block, zend_op_array *op_array,
|
|||
|
||||
/* T = CAST(X, String), ECHO(T) => NOP, ECHO(X) */
|
||||
if ((opline->opcode == ZEND_ECHO || opline->opcode == ZEND_PRINT) &&
|
||||
ZEND_OP1_TYPE(opline) == IS_TMP_VAR &&
|
||||
ZEND_OP1_TYPE(opline) & (IS_TMP_VAR|IS_VAR) &&
|
||||
VAR_SOURCE(opline->op1) &&
|
||||
VAR_SOURCE(opline->op1)->opcode == ZEND_CAST &&
|
||||
VAR_SOURCE(opline->op1)->extended_value == IS_STRING) {
|
||||
|
@ -1118,6 +1118,10 @@ static void zend_optimize_block(zend_code_block *block, zend_op_array *op_array,
|
|||
opline->opcode = ZEND_CONCAT;
|
||||
literal_dtor(&ZEND_OP2_LITERAL(src)); /* will take care of empty_string too */
|
||||
MAKE_NOP(src);
|
||||
//??? This optimization can't work anymore because ADD_VAR returns IS_TMP_VAR
|
||||
//??? and ZEND_CAST returns IS_VAR.
|
||||
//??? BTW: it wan't used for long time, because we don't use INIT_STRING
|
||||
#if 0
|
||||
} else if (opline->opcode == ZEND_ADD_VAR &&
|
||||
ZEND_OP1_TYPE(opline) == IS_TMP_VAR &&
|
||||
VAR_SOURCE(opline->op1) &&
|
||||
|
@ -1130,11 +1134,12 @@ static void zend_optimize_block(zend_code_block *block, zend_op_array *op_array,
|
|||
MAKE_NOP(src);
|
||||
opline->opcode = ZEND_CAST;
|
||||
opline->extended_value = IS_STRING;
|
||||
#endif
|
||||
} else if ((opline->opcode == ZEND_ADD_STRING ||
|
||||
opline->opcode == ZEND_ADD_CHAR ||
|
||||
opline->opcode == ZEND_ADD_VAR ||
|
||||
opline->opcode == ZEND_CONCAT) &&
|
||||
ZEND_OP1_TYPE(opline) == IS_TMP_VAR &&
|
||||
ZEND_OP1_TYPE(opline) == (IS_TMP_VAR|IS_VAR) &&
|
||||
VAR_SOURCE(opline->op1) &&
|
||||
VAR_SOURCE(opline->op1)->opcode == ZEND_CAST &&
|
||||
VAR_SOURCE(opline->op1)->extended_value == IS_STRING) {
|
||||
|
|
|
@ -102,7 +102,11 @@ if (ZEND_OPTIMIZER_PASS_1 & OPTIMIZATION_LEVEL) {
|
|||
literal_dtor(&ZEND_OP1_LITERAL(opline));
|
||||
MAKE_NOP(opline);
|
||||
|
||||
replace_tmp_by_const(op_array, opline + 1, tv, &res TSRMLS_CC);
|
||||
if (opline->result_type == IS_TMP_VAR) {
|
||||
replace_tmp_by_const(op_array, opline + 1, tv, &res TSRMLS_CC);
|
||||
} else /* if (opline->result_type == IS_VAR) */ {
|
||||
replace_var_by_const(op_array, opline + 1, tv, &res TSRMLS_CC);
|
||||
}
|
||||
} else if (opline->extended_value == IS_BOOL) {
|
||||
/* T = CAST(X, IS_BOOL) => T = BOOL(X) */
|
||||
opline->opcode = ZEND_BOOL;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue