Skip to content

Commit 960f922

Browse files
committed
Fixed odd ROPE_ADD instruction placement.
1 parent d0092c2 commit 960f922

File tree

1 file changed

+32
-3
lines changed

1 file changed

+32
-3
lines changed

Zend/zend_compile.c

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7616,6 +7616,23 @@ void zend_compile_class_name(znode *result, zend_ast *ast) /* {{{ */
76167616
}
76177617
/* }}} */
76187618

7619+
static zend_op *zend_compile_rope_add_ex(zend_op *opline, znode *result, uint32_t num, znode *elem_node) /* {{{ */
7620+
{
7621+
if (num == 0) {
7622+
result->op_type = IS_TMP_VAR;
7623+
result->u.op.var = -1;
7624+
opline->opcode = ZEND_ROPE_INIT;
7625+
} else {
7626+
opline->opcode = ZEND_ROPE_ADD;
7627+
SET_NODE(opline->op1, result);
7628+
}
7629+
SET_NODE(opline->op2, elem_node);
7630+
SET_NODE(opline->result, result);
7631+
opline->extended_value = num;
7632+
return opline;
7633+
}
7634+
/* }}} */
7635+
76197636
static zend_op *zend_compile_rope_add(znode *result, uint32_t num, znode *elem_node) /* {{{ */
76207637
{
76217638
zend_op *opline = get_next_op();
@@ -7642,6 +7659,7 @@ static void zend_compile_encaps_list(znode *result, zend_ast *ast) /* {{{ */
76427659
zend_op *opline = NULL, *init_opline;
76437660
znode elem_node, last_const_node;
76447661
zend_ast_list *list = zend_ast_get_list(ast);
7662+
uint32_t reserved_op_number = -1;
76457663

76467664
ZEND_ASSERT(list->children > 0);
76477665

@@ -7661,14 +7679,23 @@ static void zend_compile_encaps_list(znode *result, zend_ast *ast) /* {{{ */
76617679
} else {
76627680
last_const_node.op_type = IS_CONST;
76637681
ZVAL_COPY_VALUE(&last_const_node.u.constant, &elem_node.u.constant);
7682+
/* Reserve place for ZEND_ROPE_ADD instruction */
7683+
reserved_op_number = get_next_op_number();
7684+
opline = get_next_op();
7685+
opline->opcode = ZEND_NOP;
76647686
}
76657687
continue;
76667688
} else {
76677689
if (j == 0) {
7668-
rope_init_lineno = get_next_op_number();
7690+
if (last_const_node.op_type == IS_CONST) {
7691+
rope_init_lineno = reserved_op_number;
7692+
} else {
7693+
rope_init_lineno = get_next_op_number();
7694+
}
76697695
}
76707696
if (last_const_node.op_type == IS_CONST) {
7671-
zend_compile_rope_add(result, j++, &last_const_node);
7697+
opline = &CG(active_op_array)->opcodes[reserved_op_number];
7698+
zend_compile_rope_add_ex(opline, result, j++, &last_const_node);
76727699
last_const_node.op_type = IS_UNUSED;
76737700
}
76747701
opline = zend_compile_rope_add(result, j++, &elem_node);
@@ -7683,9 +7710,11 @@ static void zend_compile_encaps_list(znode *result, zend_ast *ast) /* {{{ */
76837710
ZVAL_EMPTY_STRING(&result->u.constant);
76847711
/* empty string */
76857712
}
7713+
CG(active_op_array)->last = reserved_op_number - 1;
76867714
return;
76877715
} else if (last_const_node.op_type == IS_CONST) {
7688-
opline = zend_compile_rope_add(result, j++, &last_const_node);
7716+
opline = &CG(active_op_array)->opcodes[reserved_op_number];
7717+
opline = zend_compile_rope_add_ex(opline, result, j++, &last_const_node);
76897718
}
76907719
init_opline = CG(active_op_array)->opcodes + rope_init_lineno;
76917720
if (j == 1) {

0 commit comments

Comments
 (0)