Skip to content

Commit fbb7393

Browse files
committed
Handle other DO_FCALL opcodes in NEW live range calculation
Make this robust against the case where NEW is terminated by something other than DO_FCALL, e.g. DO_UCALL. This can't currently happen.
1 parent 74c0ede commit fbb7393

File tree

1 file changed

+20
-22
lines changed

1 file changed

+20
-22
lines changed

Zend/zend_opcode.c

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -751,31 +751,29 @@ static void emit_live_range(
751751
while (def_opline + 1 < use_opline) {
752752
def_opline++;
753753
start++;
754-
if (def_opline->opcode == ZEND_DO_FCALL) {
755-
if (level == 0) {
754+
switch (def_opline->opcode) {
755+
case ZEND_INIT_FCALL:
756+
case ZEND_INIT_FCALL_BY_NAME:
757+
case ZEND_INIT_NS_FCALL_BY_NAME:
758+
case ZEND_INIT_DYNAMIC_CALL:
759+
case ZEND_INIT_USER_CALL:
760+
case ZEND_INIT_METHOD_CALL:
761+
case ZEND_INIT_STATIC_METHOD_CALL:
762+
case ZEND_NEW:
763+
level++;
764+
break;
765+
case ZEND_DO_FCALL:
766+
case ZEND_DO_FCALL_BY_NAME:
767+
case ZEND_DO_ICALL:
768+
case ZEND_DO_UCALL:
769+
if (level == 0) {
770+
goto done;
771+
}
772+
level--;
756773
break;
757-
}
758-
level--;
759-
} else {
760-
switch (def_opline->opcode) {
761-
case ZEND_INIT_FCALL:
762-
case ZEND_INIT_FCALL_BY_NAME:
763-
case ZEND_INIT_NS_FCALL_BY_NAME:
764-
case ZEND_INIT_DYNAMIC_CALL:
765-
case ZEND_INIT_USER_CALL:
766-
case ZEND_INIT_METHOD_CALL:
767-
case ZEND_INIT_STATIC_METHOD_CALL:
768-
case ZEND_NEW:
769-
level++;
770-
break;
771-
case ZEND_DO_ICALL:
772-
case ZEND_DO_UCALL:
773-
case ZEND_DO_FCALL_BY_NAME:
774-
level--;
775-
break;
776-
}
777774
}
778775
}
776+
done:
779777
emit_live_range_raw(op_array, var_num, ZEND_LIVE_NEW, orig_start + 1, start + 1);
780778
if (start + 1 == end) {
781779
/* Trivial live-range, no need to store it. */

0 commit comments

Comments
 (0)