Index: zend_compile.c =================================================================== RCS file: /repository/ZendEngine2/zend_compile.c,v retrieving revision 1.647.2.27.2.33 diff -u -r1.647.2.27.2.33 zend_compile.c --- zend_compile.c 23 Mar 2007 12:46:16 -0000 1.647.2.27.2.33 +++ zend_compile.c 13 Oct 2007 21:49:28 -0000 @@ -956,7 +956,37 @@ void zend_do_add_string(znode *result, znode *op1, znode *op2 TSRMLS_DC) { - zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC); + zend_op *prevop = CG(active_op_array)->last > 0 ? + (&CG(active_op_array)->opcodes[CG(active_op_array)->last-1]) : + NULL; + zend_op *opline = NULL; + + if(prevop != NULL && + prevop->opcode == ZEND_ADD_STRING && + op2->u.constant.type == IS_STRING && + prevop->op2.op_type == IS_CONST && + prevop->op2.u.constant.type == IS_STRING && + (memcmp(&prevop->op1, op1, sizeof(znode)) == 0)) { + + int len = Z_STRLEN(op2->u.constant); + int prevlen = Z_STRLEN(prevop->op2.u.constant); + int newlen = prevlen + len; + + if(len > 0) { + + prevop->op2.u.constant.value.str.val = erealloc(prevop->op2.u.constant.value.str.val, newlen); + + memcpy(Z_STRVAL(prevop->op2.u.constant) + Z_STRLEN(prevop->op2.u.constant), + Z_STRVAL(op2->u.constant), + Z_STRLEN(op2->u.constant)); + + prevop->op2.u.constant.value.str.len = newlen; + } + + efree(Z_STRVAL(op2->u.constant)); + return; + } + opline = get_next_op(CG(active_op_array) TSRMLS_CC); opline->opcode = ZEND_ADD_STRING; opline->op1 = *op1;