mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
Disable optimiser evaluation for numeric string errors
This commit is contained in:
parent
30ee954ed1
commit
d94c08852d
4 changed files with 11 additions and 1 deletions
|
@ -6237,7 +6237,7 @@ static zend_bool zend_try_ct_eval_magic_const(zval *zv, zend_ast *ast) /* {{{ */
|
|||
}
|
||||
/* }}} */
|
||||
|
||||
static inline zend_bool zend_binary_op_produces_numeric_string_error(uint32_t opcode, zval *op1, zval *op2) /* {{{ */
|
||||
ZEND_API zend_bool zend_binary_op_produces_numeric_string_error(uint32_t opcode, zval *op1, zval *op2) /* {{{ */
|
||||
{
|
||||
if (!(opcode == ZEND_ADD || opcode == ZEND_SUB || opcode == ZEND_MUL || opcode == ZEND_DIV
|
||||
|| opcode == ZEND_POW || opcode == ZEND_MOD || opcode == ZEND_SL || opcode == ZEND_SR
|
||||
|
|
|
@ -1023,6 +1023,8 @@ END_EXTERN_C()
|
|||
/* The default value for CG(compiler_options) during eval() */
|
||||
#define ZEND_COMPILE_DEFAULT_FOR_EVAL 0
|
||||
|
||||
ZEND_API zend_bool zend_binary_op_produces_numeric_string_error(uint32_t opcode, zval *op1, zval *op2);
|
||||
|
||||
#endif /* ZEND_COMPILE_H */
|
||||
|
||||
/*
|
||||
|
|
|
@ -683,9 +683,14 @@ optimize_constant_binary_op:
|
|||
} else if ((opline->opcode == ZEND_SL || opline->opcode == ZEND_SR) &&
|
||||
zval_get_long(&ZEND_OP2_LITERAL(opline)) < 0) {
|
||||
SET_VAR_SOURCE(opline);
|
||||
opline++;
|
||||
continue;
|
||||
} else if (zend_binary_op_produces_numeric_string_error(opline->opcode, &ZEND_OP1_LITERAL(opline), &ZEND_OP2_LITERAL(opline))) {
|
||||
SET_VAR_SOURCE(opline);
|
||||
opline++;
|
||||
continue;
|
||||
}
|
||||
printf("%d\n", opline->opcode);
|
||||
er = EG(error_reporting);
|
||||
EG(error_reporting) = 0;
|
||||
if (binary_op(&result, &ZEND_OP1_LITERAL(opline), &ZEND_OP2_LITERAL(opline)) == SUCCESS) {
|
||||
|
|
|
@ -84,6 +84,9 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx)
|
|||
zval_get_long(&ZEND_OP2_LITERAL(opline)) < 0) {
|
||||
/* shift by negative number */
|
||||
break;
|
||||
} else if (zend_binary_op_produces_numeric_string_error(opline->opcode, &ZEND_OP1_LITERAL(opline), &ZEND_OP2_LITERAL(opline))) {
|
||||
/* produces numeric string E_NOTICE/E_WARNING */
|
||||
break;
|
||||
}
|
||||
er = EG(error_reporting);
|
||||
EG(error_reporting) = 0;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue