Index: zend_compile.c =================================================================== RCS file: /repository/ZendEngine2/zend_compile.c,v retrieving revision 1.647.2.27.2.40 diff -u -r1.647.2.27.2.40 zend_compile.c --- zend_compile.c 18 May 2007 13:12:03 -0000 1.647.2.27.2.40 +++ zend_compile.c 7 Sep 2007 23:00:16 -0000 @@ -257,27 +257,63 @@ void zend_do_binary_op(zend_uchar op, znode *result, znode *op1, znode *op2 TSRMLS_DC) { - zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC); + /* optimize if both operators are constant */ + if (op1->op_type == IS_CONST && op2->op_type == IS_CONST) { + switch (op) { + case ZEND_BOOL_XOR: boolean_xor_function(&result->u.constant, &op1->u.constant, &op2->u.constant TSRMLS_CC); break; + case ZEND_BW_OR: bitwise_or_function(&result->u.constant, &op1->u.constant, &op2->u.constant TSRMLS_CC); break; + case ZEND_BW_AND: bitwise_and_function(&result->u.constant, &op1->u.constant, &op2->u.constant TSRMLS_CC); break; + case ZEND_BW_XOR: bitwise_xor_function(&result->u.constant, &op1->u.constant, &op2->u.constant TSRMLS_CC); break; + case ZEND_CONCAT: concat_function(&result->u.constant, &op1->u.constant, &op2->u.constant TSRMLS_CC); break; + case ZEND_ADD: add_function(&result->u.constant, &op1->u.constant, &op2->u.constant TSRMLS_CC); break; + case ZEND_SUB: sub_function(&result->u.constant, &op1->u.constant, &op2->u.constant TSRMLS_CC); break; + case ZEND_MUL: mul_function(&result->u.constant, &op1->u.constant, &op2->u.constant TSRMLS_CC); break; + case ZEND_DIV: div_function(&result->u.constant, &op1->u.constant, &op2->u.constant TSRMLS_CC); break; + case ZEND_MOD: mod_function(&result->u.constant, &op1->u.constant, &op2->u.constant TSRMLS_CC); break; + case ZEND_SL: shift_left_function(&result->u.constant, &op1->u.constant, &op2->u.constant TSRMLS_CC); break; + case ZEND_SR: shift_right_function(&result->u.constant, &op1->u.constant, &op2->u.constant TSRMLS_CC); break; + case ZEND_IS_IDENTICAL: is_identical_function(&result->u.constant, &op1->u.constant, &op2->u.constant TSRMLS_CC); break; + case ZEND_IS_NOT_IDENTICAL: is_not_identical_function(&result->u.constant, &op1->u.constant, &op2->u.constant TSRMLS_CC); break; + case ZEND_IS_EQUAL: is_equal_function(&result->u.constant, &op1->u.constant, &op2->u.constant TSRMLS_CC); break; + case ZEND_IS_NOT_EQUAL: is_not_equal_function(&result->u.constant, &op1->u.constant, &op2->u.constant TSRMLS_CC); break; + case ZEND_IS_SMALLER: is_smaller_function(&result->u.constant, &op1->u.constant, &op2->u.constant TSRMLS_CC); break; + case ZEND_IS_SMALLER_OR_EQUAL: is_smaller_or_equal_function(&result->u.constant, &op1->u.constant, &op2->u.constant TSRMLS_CC); break; + } - opline->opcode = op; - opline->result.op_type = IS_TMP_VAR; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - opline->op1 = *op1; - opline->op2 = *op2; - *result = opline->result; + result->op_type = IS_CONST; + + } else { + zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC); + opline->opcode = op; + opline->result.op_type = IS_TMP_VAR; + opline->result.u.var = get_temporary_variable(CG(active_op_array)); + opline->op1 = *op1; + opline->op2 = *op2; + *result = opline->result; + } } void zend_do_unary_op(zend_uchar op, znode *result, znode *op1 TSRMLS_DC) { - zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC); + /* optimize if operator is constant */ + if (op1->op_type == IS_CONST) { + switch (op) { + case ZEND_BOOL_NOT: boolean_not_function(&result->u.constant, &op1->u.constant TSRMLS_CC); break; + case ZEND_BW_NOT: bitwise_not_function(&result->u.constant, &op1->u.constant TSRMLS_CC); break; + } - opline->opcode = op; - opline->result.op_type = IS_TMP_VAR; - opline->result.u.var = get_temporary_variable(CG(active_op_array)); - opline->op1 = *op1; - *result = opline->result; - SET_UNUSED(opline->op2); + result->op_type = IS_CONST; + + } else { + zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC); + opline->opcode = op; + opline->result.op_type = IS_TMP_VAR; + opline->result.u.var = get_temporary_variable(CG(active_op_array)); + opline->op1 = *op1; + *result = opline->result; + SET_UNUSED(opline->op2); + } } #define MAKE_NOP(opline) { opline->opcode = ZEND_NOP; memset(&opline->result,0,sizeof(znode)); memset(&opline->op1,0,sizeof(znode)); memset(&opline->op2,0,sizeof(znode)); opline->result.op_type=opline->op1.op_type=opline->op2.op_type=IS_UNUSED; }