Skip to content

Commit b96e3c0

Browse files
committed
fixup! JIT support
1 parent 9ccd300 commit b96e3c0

File tree

3 files changed

+32
-24
lines changed

3 files changed

+32
-24
lines changed

ext/opcache/jit/zend_jit_internal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ void ZEND_FASTCALL zend_jit_copy_extra_args_helper(EXECUTE_DATA_D);
234234
void ZEND_FASTCALL zend_jit_copy_extra_args_helper_no_skip_recv(EXECUTE_DATA_D);
235235
bool ZEND_FASTCALL zend_jit_deprecated_helper(OPLINE_D);
236236
bool ZEND_FASTCALL zend_jit_nodiscard_helper(OPLINE_D);
237+
bool ZEND_FASTCALL zend_jit_deprecated_nodiscard_helper(OPLINE_D);
237238
void ZEND_FASTCALL zend_jit_undefined_long_key(EXECUTE_DATA_D);
238239
void ZEND_FASTCALL zend_jit_undefined_long_key_ex(zend_long key EXECUTE_DATA_DC);
239240
void ZEND_FASTCALL zend_jit_undefined_string_key(EXECUTE_DATA_D);

ext/opcache/jit/zend_jit_ir.c

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10179,37 +10179,23 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
1017910179
if (opline->opcode == ZEND_DO_FCALL || opline->opcode == ZEND_DO_FCALL_BY_NAME) {
1018010180
if (!func) {
1018110181
if (!trace) {
10182-
ir_ref if_deprecated, ret;
10182+
ir_ref if_deprecated_nodiscard, ret;
1018310183

10184-
if_deprecated = ir_IF(ir_AND_U32(
10184+
uint32_t no_discard = RETURN_VALUE_USED(opline) ? 0 : ZEND_ACC_NODISCARD;
10185+
10186+
if_deprecated_nodiscard = ir_IF(ir_AND_U32(
1018510187
ir_LOAD_U32(ir_ADD_OFFSET(func_ref, offsetof(zend_op_array, fn_flags))),
10186-
ir_CONST_U32(ZEND_ACC_DEPRECATED)));
10187-
ir_IF_TRUE_cold(if_deprecated);
10188+
ir_CONST_U32(ZEND_ACC_DEPRECATED|no_discard)));
10189+
ir_IF_TRUE_cold(if_deprecated_nodiscard);
1018810190

10191+
ir_ref helper = ir_CONST_FC_FUNC(no_discard ? zend_jit_deprecated_nodiscard_helper : zend_jit_deprecated_helper);
1018910192
if (GCC_GLOBAL_REGS) {
10190-
ret = ir_CALL(IR_BOOL, ir_CONST_FC_FUNC(zend_jit_deprecated_helper));
10193+
ret = ir_CALL(IR_BOOL, helper);
1019110194
} else {
10192-
ret = ir_CALL_1(IR_BOOL, ir_CONST_FC_FUNC(zend_jit_deprecated_helper), rx);
10195+
ret = ir_CALL_1(IR_BOOL, helper, rx);
1019310196
}
1019410197
ir_GUARD(ret, jit_STUB_ADDR(jit, jit_stub_exception_handler));
10195-
ir_MERGE_WITH_EMPTY_FALSE(if_deprecated);
10196-
10197-
if (!RETURN_VALUE_USED(opline)) {
10198-
ir_ref if_nodiscard, ret;
10199-
10200-
if_nodiscard = ir_IF(ir_AND_U32(
10201-
ir_LOAD_U32(ir_ADD_OFFSET(func_ref, offsetof(zend_op_array, fn_flags))),
10202-
ir_CONST_U32(ZEND_ACC_NODISCARD)));
10203-
ir_IF_TRUE_cold(if_nodiscard);
10204-
10205-
if (GCC_GLOBAL_REGS) {
10206-
ret = ir_CALL(IR_BOOL, ir_CONST_FC_FUNC(zend_jit_nodiscard_helper));
10207-
} else {
10208-
ret = ir_CALL_1(IR_BOOL, ir_CONST_FC_FUNC(zend_jit_nodiscard_helper), rx);
10209-
}
10210-
ir_GUARD(ret, jit_STUB_ADDR(jit, jit_stub_exception_handler));
10211-
ir_MERGE_WITH_EMPTY_FALSE(if_nodiscard);
10212-
}
10198+
ir_MERGE_WITH_EMPTY_FALSE(if_deprecated_nodiscard);
1021310199
}
1021410200
} else {
1021510201
if (func->common.fn_flags & ZEND_ACC_DEPRECATED) {

ext/opcache/jit/zend_jit_vm_helpers.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,27 @@ bool ZEND_FASTCALL zend_jit_nodiscard_helper(OPLINE_D)
232232
return 1;
233233
}
234234

235+
bool ZEND_FASTCALL zend_jit_deprecated_nodiscard_helper(OPLINE_D)
236+
{
237+
zend_execute_data *call = (zend_execute_data *) opline;
238+
const zend_op *actual_opline = call->opline;
239+
zend_function *fbc = call->func;
240+
241+
if ((fbc->common.fn_flags & ZEND_ACC_DEPRECATED)) {
242+
if (zend_jit_deprecated_helper(OPLINE_C) == 0) {
243+
return 0;
244+
}
245+
}
246+
247+
if ((fbc->common.fn_flags & ZEND_ACC_NODISCARD)) {
248+
if (zend_jit_nodiscard_helper(OPLINE_C) == 0) {
249+
return 0;
250+
}
251+
}
252+
253+
return 1;
254+
}
255+
235256
void ZEND_FASTCALL zend_jit_undefined_long_key(EXECUTE_DATA_D)
236257
{
237258
const zend_op *opline = EX(opline);

0 commit comments

Comments
 (0)