case ZEND_SEND_VAR_EX:
case ZEND_SEND_VAR_NO_REF:
case ZEND_SEND_VAR_NO_REF_EX:
+ case ZEND_SEND_FUNC_ARG:
if ((opline->opcode == ZEND_SEND_VAR_EX
|| opline->opcode == ZEND_SEND_VAR_NO_REF_EX)
&& opline->op2.num > MAX_ARG_FLAG_NUM) {
case ZEND_SEND_VAR_EX:
case ZEND_SEND_VAR_NO_REF:
case ZEND_SEND_VAR_NO_REF_EX:
+ case ZEND_SEND_FUNC_ARG:
if (tssa->ops[idx].op1_use >= 0 && op1_type != IS_UNKNOWN) {
zend_ssa_var_info *info = &ssa_var_info[ssa_ops[idx].op1_use];
if ((info->type & (MAY_BE_ANY|MAY_BE_UNDEF)) != (1 << op1_type)) {
ssa_var_info[v].type = MAY_BE_UNDEF;
}
}
- if (i < op_array->num_args) {
+ if (!(op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS)
+ && i < op_array->num_args) {
/* Propagate argument type */
ssa_var_info[v].type &= frame->stack[i];
}
case ZEND_SEND_VAR_EX:
case ZEND_SEND_VAR_NO_REF:
case ZEND_SEND_VAR_NO_REF_EX:
+ case ZEND_SEND_FUNC_ARG:
if ((opline->opcode == ZEND_SEND_VAR_EX
|| opline->opcode == ZEND_SEND_VAR_NO_REF_EX)
&& opline->op2.num > MAX_ARG_FLAG_NUM) {
}
if (frame->call
&& frame->call->func->type == ZEND_USER_FUNCTION) {
- if (opline->opcode == ZEND_SEND_VAR_EX
+ if ((opline->opcode == ZEND_SEND_VAR_EX
+ || opline->opcode == ZEND_SEND_FUNC_ARG)
&& ARG_SHOULD_BE_SENT_BY_REF(frame->call->func, opline->op2.num)) {
// TODO: this may require invalidation, if caller is changed ???
goto done;
| jmp >7
}
+ |.code
+ }
+ } else if (opline->opcode == ZEND_SEND_FUNC_ARG) {
+ if (zend_jit_trigger == ZEND_JIT_ON_HOT_TRACE
+ && JIT_G(current_frame)
+ && JIT_G(current_frame)->call
+ && JIT_G(current_frame)->call->func) {
+ if (ARG_SHOULD_BE_SENT_BY_REF(JIT_G(current_frame)->call->func, arg_num)) {
+ if (!zend_jit_send_ref(Dst, opline, op_array, op1_info, 0)) {
+ return 0;
+ }
+ return 1;
+ }
+ } else {
+ | test dword [RX + offsetof(zend_execute_data, This.u1.type_info)], ZEND_CALL_SEND_ARG_BY_REF
+ | jnz >1
+ |.cold_code
+ |1:
+ if (!zend_jit_send_ref(Dst, opline, op_array, op1_info, 1)) {
+ return 0;
+ }
+ | jmp >7
|.code
}
}
return 0;
}
}
- } else if (op1_info & (MAY_BE_ANY|MAY_BE_REF)) {
+ } else {
if (op1_info & MAY_BE_REF) {
if (opline->op1_type == IS_CV) {
zend_jit_addr val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1a, 0);