summaryrefslogtreecommitdiff
path: root/Zend/zend_compile.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2007-05-18 13:12:05 +0000
committerDmitry Stogov <dmitry@php.net>2007-05-18 13:12:05 +0000
commit80d2409fd8fe382ea14d6b45c528a452fa796905 (patch)
tree44778367be88f63311c5877535370652e3d82946 /Zend/zend_compile.c
parent6d41d020dfd2f84618357909232007c6ab3451f1 (diff)
downloadphp-git-80d2409fd8fe382ea14d6b45c528a452fa796905.tar.gz
Improved compilation of heredocs and interpolated strings. (Matt, Dmitry)
Diffstat (limited to 'Zend/zend_compile.c')
-rw-r--r--Zend/zend_compile.c54
1 files changed, 18 insertions, 36 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index a505eefae1..3fc7a6dac5 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -941,24 +941,25 @@ void zend_do_init_string(znode *result TSRMLS_DC)
}
-void zend_do_add_char(znode *result, znode *op1, znode *op2 TSRMLS_DC)
-{
- zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
-
- opline->opcode = ZEND_ADD_CHAR;
- opline->op1 = *op1;
- opline->op2 = *op2;
- opline->op2.op_type = IS_CONST;
- opline->result = opline->op1;
- *result = opline->result;
-}
-
-
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 *opline;
+
+ if (Z_STRLEN(op2->u.constant) > 1) {
+ opline = get_next_op(CG(active_op_array) TSRMLS_CC);
+ opline->opcode = ZEND_ADD_STRING;
+ } else if (Z_STRLEN(op2->u.constant) == 1) {
+ int ch = *Z_STRVAL(op2->u.constant);
- opline->opcode = ZEND_ADD_STRING;
+ /* Free memory and use ZEND_ADD_CHAR in case of 1 character strings */
+ efree(Z_STRVAL(op2->u.constant));
+ ZVAL_LONG(&op2->u.constant, ch);
+ opline = get_next_op(CG(active_op_array) TSRMLS_CC);
+ opline->opcode = ZEND_ADD_CHAR;
+ } else { /* String can be empty after a variable at the end of a heredoc */
+ efree(Z_STRVAL(op2->u.constant));
+ return;
+ }
opline->op1 = *op1;
opline->op2 = *op2;
opline->op2.op_type = IS_CONST;
@@ -3930,24 +3931,6 @@ void zend_do_declare_end(znode *declare_token TSRMLS_DC)
}
-void zend_do_end_heredoc(TSRMLS_D)
-{
- int opline_num = get_next_op_number(CG(active_op_array))-1;
- zend_op *opline = &CG(active_op_array)->opcodes[opline_num];
-
- if (opline->opcode != ZEND_ADD_STRING) {
- return;
- }
-
- opline->op2.u.constant.value.str.val[(opline->op2.u.constant.value.str.len--)-1] = 0;
- if (opline->op2.u.constant.value.str.len>0) {
- if (opline->op2.u.constant.value.str.val[opline->op2.u.constant.value.str.len-1]=='\r') {
- opline->op2.u.constant.value.str.val[(opline->op2.u.constant.value.str.len--)-1] = 0;
- }
- }
-}
-
-
void zend_do_exit(znode *result, znode *message TSRMLS_DC)
{
zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
@@ -4136,12 +4119,12 @@ int zendlex(znode *zendlval TSRMLS_DC)
{
int retval;
-again:
if (CG(increment_lineno)) {
CG(zend_lineno)++;
CG(increment_lineno) = 0;
}
+again:
Z_TYPE(zendlval->u.constant) = IS_LONG;
retval = lex_scan(&zendlval->u.constant TSRMLS_CC);
switch (retval) {
@@ -4152,8 +4135,7 @@ again:
goto again;
case T_CLOSE_TAG:
- if (LANG_SCNG(yy_text)[LANG_SCNG(yy_leng)-1]=='\n'
- || (LANG_SCNG(yy_text)[LANG_SCNG(yy_leng)-2]=='\r' && LANG_SCNG(yy_text)[LANG_SCNG(yy_leng)-1])) {
+ if (LANG_SCNG(yy_text)[LANG_SCNG(yy_leng)-1] != '>') {
CG(increment_lineno) = 1;
}
retval = ';'; /* implicit ; */