@@ -3756,6 +3756,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_CONST_HANDLER(ZEND_OP
37563756 zval *result;
37573757 zend_function *constructor;
37583758 zend_class_entry *ce;
3759+ zend_execute_data *call;
37593760
37603761 SAVE_OPLINE();
37613762 if (IS_CONST == IS_CONST) {
@@ -3784,21 +3785,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_CONST_HANDLER(ZEND_OP
37843785
37853786 constructor = Z_OBJ_HT_P(result)->get_constructor(Z_OBJ_P(result));
37863787 if (constructor == NULL) {
3787- ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
3788+ /* If there are no arguments, skip over the DO_FCALL opcode. We check if the next
3789+ * opcode is DO_FCALL in case EXT instructions are used. */
3790+ if (EXPECTED(opline->extended_value == 0 && (opline+1)->opcode == ZEND_DO_FCALL)) {
3791+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
3792+ }
3793+
3794+ /* Perform a dummy function call */
3795+ call = zend_vm_stack_push_call_frame(
3796+ ZEND_CALL_FUNCTION, (zend_function *) &zend_pass_function,
3797+ opline->extended_value, NULL, NULL);
37883798 } else {
37893799 /* We are not handling overloaded classes right now */
3790- zend_execute_data * call = zend_vm_stack_push_call_frame(
3800+ call = zend_vm_stack_push_call_frame(
37913801 ZEND_CALL_FUNCTION | ZEND_CALL_RELEASE_THIS | ZEND_CALL_CTOR,
37923802 constructor,
37933803 opline->extended_value,
37943804 ce,
37953805 Z_OBJ_P(result));
3796- call->prev_execute_data = EX(call);
3797- EX(call) = call;
37983806 Z_ADDREF_P(result);
3799-
3800- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
38013807 }
3808+
3809+ call->prev_execute_data = EX(call);
3810+ EX(call) = call;
3811+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
38023812}
38033813
38043814static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -16484,6 +16494,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_VAR_HANDLER(ZEND_OPCO
1648416494 zval *result;
1648516495 zend_function *constructor;
1648616496 zend_class_entry *ce;
16497+ zend_execute_data *call;
1648716498
1648816499 SAVE_OPLINE();
1648916500 if (IS_VAR == IS_CONST) {
@@ -16512,21 +16523,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_VAR_HANDLER(ZEND_OPCO
1651216523
1651316524 constructor = Z_OBJ_HT_P(result)->get_constructor(Z_OBJ_P(result));
1651416525 if (constructor == NULL) {
16515- ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
16526+ /* If there are no arguments, skip over the DO_FCALL opcode. We check if the next
16527+ * opcode is DO_FCALL in case EXT instructions are used. */
16528+ if (EXPECTED(opline->extended_value == 0 && (opline+1)->opcode == ZEND_DO_FCALL)) {
16529+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
16530+ }
16531+
16532+ /* Perform a dummy function call */
16533+ call = zend_vm_stack_push_call_frame(
16534+ ZEND_CALL_FUNCTION, (zend_function *) &zend_pass_function,
16535+ opline->extended_value, NULL, NULL);
1651616536 } else {
1651716537 /* We are not handling overloaded classes right now */
16518- zend_execute_data * call = zend_vm_stack_push_call_frame(
16538+ call = zend_vm_stack_push_call_frame(
1651916539 ZEND_CALL_FUNCTION | ZEND_CALL_RELEASE_THIS | ZEND_CALL_CTOR,
1652016540 constructor,
1652116541 opline->extended_value,
1652216542 ce,
1652316543 Z_OBJ_P(result));
16524- call->prev_execute_data = EX(call);
16525- EX(call) = call;
1652616544 Z_ADDREF_P(result);
16527-
16528- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
1652916545 }
16546+
16547+ call->prev_execute_data = EX(call);
16548+ EX(call) = call;
16549+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
1653016550}
1653116551
1653216552static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -26780,6 +26800,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_UNUSED_HANDLER(ZEND_O
2678026800 zval *result;
2678126801 zend_function *constructor;
2678226802 zend_class_entry *ce;
26803+ zend_execute_data *call;
2678326804
2678426805 SAVE_OPLINE();
2678526806 if (IS_UNUSED == IS_CONST) {
@@ -26808,21 +26829,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_NEW_SPEC_UNUSED_HANDLER(ZEND_O
2680826829
2680926830 constructor = Z_OBJ_HT_P(result)->get_constructor(Z_OBJ_P(result));
2681026831 if (constructor == NULL) {
26811- ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2));
26832+ /* If there are no arguments, skip over the DO_FCALL opcode. We check if the next
26833+ * opcode is DO_FCALL in case EXT instructions are used. */
26834+ if (EXPECTED(opline->extended_value == 0 && (opline+1)->opcode == ZEND_DO_FCALL)) {
26835+ ZEND_VM_NEXT_OPCODE_EX(1, 2);
26836+ }
26837+
26838+ /* Perform a dummy function call */
26839+ call = zend_vm_stack_push_call_frame(
26840+ ZEND_CALL_FUNCTION, (zend_function *) &zend_pass_function,
26841+ opline->extended_value, NULL, NULL);
2681226842 } else {
2681326843 /* We are not handling overloaded classes right now */
26814- zend_execute_data * call = zend_vm_stack_push_call_frame(
26844+ call = zend_vm_stack_push_call_frame(
2681526845 ZEND_CALL_FUNCTION | ZEND_CALL_RELEASE_THIS | ZEND_CALL_CTOR,
2681626846 constructor,
2681726847 opline->extended_value,
2681826848 ce,
2681926849 Z_OBJ_P(result));
26820- call->prev_execute_data = EX(call);
26821- EX(call) = call;
2682226850 Z_ADDREF_P(result);
26823-
26824- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
2682526851 }
26852+
26853+ call->prev_execute_data = EX(call);
26854+ EX(call) = call;
26855+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
2682626856}
2682726857
2682826858static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
0 commit comments