@@ -3905,6 +3905,34 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_QM_ASSIGN_NOREF_SP
3905
3905
ZEND_VM_NEXT_OPCODE();
3906
3906
}
3907
3907
3908
+ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_SIMPLE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3909
+ {
3910
+ USE_OPLINE
3911
+ zval *value, *arg;
3912
+
3913
+
3914
+ value = RT_CONSTANT(opline, opline->op1);
3915
+ arg = ZEND_CALL_VAR(EX(call), opline->result.var);
3916
+ ZVAL_COPY_VALUE(arg, value);
3917
+ ZEND_VM_NEXT_OPCODE();
3918
+ }
3919
+
3920
+ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3921
+ {
3922
+ USE_OPLINE
3923
+ zval *value, *arg;
3924
+
3925
+ uint32_t arg_num = opline->op2.num;
3926
+
3927
+ if (QUICK_ARG_MUST_BE_SENT_BY_REF(EX(call)->func, arg_num)) {
3928
+ ZEND_VM_TAIL_CALL(zend_cannot_pass_by_ref_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
3929
+ }
3930
+ value = RT_CONSTANT(opline, opline->op1);
3931
+ arg = ZEND_CALL_VAR(EX(call), opline->result.var);
3932
+ ZVAL_COPY_VALUE(arg, value);
3933
+ ZEND_VM_NEXT_OPCODE();
3934
+ }
3935
+
3908
3936
static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3909
3937
{
3910
3938
USE_OPLINE
@@ -54618,6 +54646,8 @@ ZEND_API void execute_ex(zend_execute_data *ex)
54618
54646
(void*)&&ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_LABEL,
54619
54647
(void*)&&ZEND_NULL_LABEL,
54620
54648
(void*)&&ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_LABEL,
54649
+ (void*)&&ZEND_SEND_VAL_SIMPLE_SPEC_CONST_LABEL,
54650
+ (void*)&&ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST_LABEL,
54621
54651
(void*)&&ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED_LABEL,
54622
54652
(void*)&&ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED_LABEL,
54623
54653
(void*)&&ZEND_NULL_LABEL
@@ -55143,6 +55173,14 @@ ZEND_API void execute_ex(zend_execute_data *ex)
55143
55173
VM_TRACE(ZEND_QM_ASSIGN_NOREF_SPEC_CONST)
55144
55174
ZEND_QM_ASSIGN_NOREF_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
55145
55175
HYBRID_BREAK();
55176
+ HYBRID_CASE(ZEND_SEND_VAL_SIMPLE_SPEC_CONST):
55177
+ VM_TRACE(ZEND_SEND_VAL_SIMPLE_SPEC_CONST)
55178
+ ZEND_SEND_VAL_SIMPLE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
55179
+ HYBRID_BREAK();
55180
+ HYBRID_CASE(ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST):
55181
+ VM_TRACE(ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST)
55182
+ ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
55183
+ HYBRID_BREAK();
55146
55184
HYBRID_CASE(ZEND_ADD_SPEC_CONST_CONST):
55147
55185
VM_TRACE(ZEND_ADD_SPEC_CONST_CONST)
55148
55186
ZEND_ADD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
@@ -64143,6 +64181,8 @@ void zend_vm_init(void)
64143
64181
ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR_HANDLER,
64144
64182
ZEND_NULL_HANDLER,
64145
64183
ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV_HANDLER,
64184
+ ZEND_SEND_VAL_SIMPLE_SPEC_CONST_HANDLER,
64185
+ ZEND_SEND_VAL_EX_SIMPLE_SPEC_CONST_HANDLER,
64146
64186
ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED_HANDLER,
64147
64187
ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED_HANDLER,
64148
64188
ZEND_NULL_HANDLER
@@ -64347,7 +64387,7 @@ void zend_vm_init(void)
64347
64387
3019,
64348
64388
3020 | SPEC_RULE_ISSET,
64349
64389
3022 | SPEC_RULE_OP1 | SPEC_RULE_OP2,
64350
- 3938
64390
+ 3940
64351
64391
};
64352
64392
#if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID)
64353
64393
zend_opcode_handler_funcs = labels;
@@ -64670,7 +64710,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
64670
64710
case ZEND_QM_ASSIGN:
64671
64711
if (op1_info == MAY_BE_DOUBLE) {
64672
64712
spec = 3891 | SPEC_RULE_OP1;
64673
- } else if (!( op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)))) {
64713
+ } else if ((op->op1_type == IS_CONST) ? !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1)) : (!( op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE) )))) {
64674
64714
spec = 3896 | SPEC_RULE_OP1;
64675
64715
}
64676
64716
break;
@@ -64715,14 +64755,19 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
64715
64755
spec = 3047;
64716
64756
}
64717
64757
break;
64758
+ case ZEND_SEND_VAL:
64759
+ if (op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) {
64760
+ spec = 3936;
64761
+ }
64762
+ break;
64718
64763
case ZEND_SEND_VAR_EX:
64719
64764
if (op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
64720
64765
spec = 3931 | SPEC_RULE_OP1;
64721
64766
}
64722
64767
break;
64723
64768
case ZEND_FE_FETCH_R:
64724
64769
if (op->op2_type == IS_CV && (op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_ARRAY) {
64725
- spec = 3936 | SPEC_RULE_RETVAL;
64770
+ spec = 3938 | SPEC_RULE_RETVAL;
64726
64771
}
64727
64772
break;
64728
64773
case ZEND_FETCH_DIM_R:
@@ -64733,6 +64778,11 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t
64733
64778
spec = 3901 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
64734
64779
}
64735
64780
break;
64781
+ case ZEND_SEND_VAL_EX:
64782
+ if (op->op2.num <= MAX_ARG_FLAG_NUM && op->op1_type == IS_CONST && !Z_REFCOUNTED_P(RT_CONSTANT(op, op->op1))) {
64783
+ spec = 3937;
64784
+ }
64785
+ break;
64736
64786
case ZEND_SEND_VAR:
64737
64787
if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) {
64738
64788
spec = 3926 | SPEC_RULE_OP1;
0 commit comments