Fix off by one in short_circuiting optimization

This commit is contained in:
Bob Weinand 2015-06-14 17:08:39 +02:00
parent b7e477a8f9
commit 37c91b8d03

View File

@ -5842,7 +5842,7 @@ void zend_compile_short_circuiting(znode *result, zend_ast *ast) /* {{{ */
if (left_node.op_type == IS_CONST) {
if ((ast->kind == ZEND_AST_AND && !zend_is_true(&left_node.u.constant))
|| (ast->kind == ZEND_AST_OR && zend_is_true(&left_node.u.constant))) {
|| (ast->kind == ZEND_AST_OR && zend_is_true(&left_node.u.constant))) {
result->op_type = IS_CONST;
ZVAL_BOOL(&result->u.constant, zend_is_true(&left_node.u.constant));
} else {
@ -5875,9 +5875,9 @@ void zend_compile_short_circuiting(znode *result, zend_ast *ast) /* {{{ */
zend_compile_expr(&right_node, right_ast);
if (right_node.op_type == IS_CONST && opnum_jmpz == CG(active_op_array)->last) {
if (right_node.op_type == IS_CONST && opnum_jmpz == get_next_op_number(CG(active_op_array)) - 1) {
if ((ast->kind == ZEND_AST_AND && !zend_is_true(&right_node.u.constant))
|| (ast->kind == ZEND_AST_OR && zend_is_true(&right_node.u.constant))) {
|| (ast->kind == ZEND_AST_OR && zend_is_true(&right_node.u.constant))) {
CG(active_op_array)->last--;
result->op_type = IS_CONST;
ZVAL_BOOL(&result->u.constant, zend_is_true(&right_node.u.constant));