Skip to content

Commit 6b1d905

Browse files
author
test@test.test
committed
Try this
1 parent 73af6b4 commit 6b1d905

File tree

4 files changed

+162
-211
lines changed

4 files changed

+162
-211
lines changed

Zend/zend_execute.c

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1540,33 +1540,20 @@ static zend_never_inline void zend_assign_to_object_dim(zend_object *obj, zval *
15401540
}
15411541
}
15421542

1543-
static void zend_frameless_observed_call_push(zend_execute_data *call, uint8_t arg, zval *zv, uint8_t op_type) {
1544-
ZVAL_COPY(ZEND_CALL_VAR_NUM(call, arg), zv);
1545-
if (op_type & (IS_TMP_VAR|IS_VAR)) {
1546-
zval_ptr_dtor_nogc(zv);
1547-
ZVAL_UNDEF(zv);
1548-
}
1549-
}
1550-
15511543
ZEND_API void zend_frameless_observed_call(EXECUTE_DATA_D OPLINE_DC)
15521544
{
15531545
uint8_t num_args = ZEND_FLF_NUM_ARGS(opline->opcode);
15541546
zend_function *fbc = ZEND_FLF_FUNC(opline);
15551547

15561548
zval *result = EX_VAR(opline->result.var);
1557-
ZVAL_NULL(result);
15581549

15591550
zend_execute_data *call = zend_vm_stack_push_call_frame_ex(zend_vm_calc_used_stack(num_args, fbc), ZEND_CALL_NESTED_FUNCTION, fbc, num_args, NULL);
15601551
call->prev_execute_data = execute_data;
15611552

15621553
switch (num_args) {
1563-
case 3: zend_frameless_observed_call_push(call, 2, get_op_data_zval_ptr_deref_r((opline+1)->op1_type, (opline+1)->op1), (opline+1)->op1_type); ZEND_FALLTHROUGH;
1564-
case 2: zend_frameless_observed_call_push(call, 1, get_zval_ptr_deref(opline->op2_type, opline->op2, BP_VAR_R), opline->op2_type); ZEND_FALLTHROUGH;
1565-
case 1: zend_frameless_observed_call_push(call, 0, get_zval_ptr_deref(opline->op1_type, opline->op1, BP_VAR_R), opline->op1_type);
1566-
1567-
if (EG(exception)) {
1568-
goto free_args;
1569-
}
1554+
case 3: ZVAL_COPY(ZEND_CALL_VAR_NUM(call, 2), zend_get_zval_ptr(opline+1, (opline+1)->op1_type, &(opline+1)->op1, execute_data)); ZEND_FALLTHROUGH;
1555+
case 2: ZVAL_COPY(ZEND_CALL_VAR_NUM(call, 1), zend_get_zval_ptr(opline, opline->op2_type, &opline->op2, execute_data)); ZEND_FALLTHROUGH;
1556+
case 1: ZVAL_COPY(ZEND_CALL_VAR_NUM(call, 0), zend_get_zval_ptr(opline, opline->op1_type, &opline->op1, execute_data));
15701557
}
15711558

15721559
EG(current_execute_data) = call;
@@ -1577,7 +1564,10 @@ ZEND_API void zend_frameless_observed_call(EXECUTE_DATA_D OPLINE_DC)
15771564

15781565
EG(current_execute_data) = execute_data;
15791566

1580-
free_args: ;
1567+
if (UNEXPECTED(EG(exception) != NULL)) {
1568+
zend_rethrow_exception(execute_data);
1569+
}
1570+
15811571
zend_vm_stack_free_args(call);
15821572

15831573
uint32_t call_info = ZEND_CALL_INFO(call);

Zend/zend_vm_def.h

Lines changed: 42 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -9599,39 +9599,23 @@ ZEND_VM_C_LABEL(try_again):
95999599
}
96009600
}
96019601

9602-
ZEND_VM_HELPER(zend_frameless_observed_call, ANY, ANY)
9603-
{
9604-
USE_OPLINE
9605-
9606-
zend_frameless_observed_call(EXECUTE_DATA_C OPLINE_CC);
9607-
9608-
if (UNEXPECTED(EG(exception) != NULL)) {
9609-
zend_rethrow_exception(execute_data);
9610-
HANDLE_EXCEPTION();
9611-
}
9612-
9613-
ZEND_VM_SET_OPCODE(opline + 1 + (opline->opcode == ZEND_FRAMELESS_ICALL_3));
9614-
ZEND_VM_CONTINUE();
9615-
}
9616-
96179602
ZEND_VM_HANDLER(204, ZEND_FRAMELESS_ICALL_0, UNUSED, UNUSED, SPEC(OBSERVER))
96189603
{
96199604
USE_OPLINE
96209605
SAVE_OPLINE();
96219606

9622-
#if !ZEND_VM_SPEC || ZEND_OBSERVER_ENABLED
9623-
if (ZEND_OBSERVER_ENABLED) {
9624-
zend_function *fbc = ZEND_FLF_FUNC(opline);
9625-
if (UNEXPECTED(zend_observer_handler_is_unobserved(ZEND_OBSERVER_DATA(fbc)) == false)) {
9626-
ZEND_VM_DISPATCH_TO_HELPER(zend_frameless_observed_call);
9627-
}
9628-
}
9629-
#endif
9630-
96319607
zval *result = EX_VAR(opline->result.var);
96329608
ZVAL_NULL(result);
9633-
zend_frameless_function_0 function = (zend_frameless_function_0)ZEND_FLF_HANDLER(opline);
9634-
function(EX_VAR(opline->result.var));
9609+
9610+
#if !ZEND_VM_SPEC || ZEND_OBSERVER_ENABLED
9611+
if (ZEND_OBSERVER_ENABLED && UNEXPECTED(zend_observer_handler_is_unobserved(ZEND_OBSERVER_DATA(ZEND_FLF_FUNC(opline))) == false)) {
9612+
zend_frameless_observed_call(EXECUTE_DATA_C OPLINE_CC);
9613+
} else
9614+
#endif
9615+
{
9616+
zend_frameless_function_0 function = (zend_frameless_function_0)ZEND_FLF_HANDLER(opline);
9617+
function(EX_VAR(opline->result.var));
9618+
}
96359619
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
96369620
}
96379621

@@ -9640,24 +9624,23 @@ ZEND_VM_HANDLER(205, ZEND_FRAMELESS_ICALL_1, ANY, UNUSED, SPEC(OBSERVER))
96409624
USE_OPLINE
96419625
SAVE_OPLINE();
96429626

9643-
#if !ZEND_VM_SPEC || ZEND_OBSERVER_ENABLED
9644-
if (ZEND_OBSERVER_ENABLED) {
9645-
zend_function *fbc = ZEND_FLF_FUNC(opline);
9646-
if (UNEXPECTED(zend_observer_handler_is_unobserved(ZEND_OBSERVER_DATA(fbc)) == false)) {
9647-
ZEND_VM_DISPATCH_TO_HELPER(zend_frameless_observed_call);
9648-
}
9649-
}
9650-
#endif
9651-
9652-
zend_frameless_function_1 function = (zend_frameless_function_1)ZEND_FLF_HANDLER(opline);
96539627
zval *result = EX_VAR(opline->result.var);
96549628
ZVAL_NULL(result);
96559629
zval *arg1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
96569630
if (UNEXPECTED(EG(exception) != NULL)) {
96579631
FREE_OP1();
96589632
HANDLE_EXCEPTION();
96599633
}
9660-
function(result, arg1);
9634+
9635+
#if !ZEND_VM_SPEC || ZEND_OBSERVER_ENABLED
9636+
if (ZEND_OBSERVER_ENABLED && UNEXPECTED(zend_observer_handler_is_unobserved(ZEND_OBSERVER_DATA(ZEND_FLF_FUNC(opline))) == false)) {
9637+
zend_frameless_observed_call(EXECUTE_DATA_C OPLINE_CC);
9638+
} else
9639+
#endif
9640+
{
9641+
zend_frameless_function_1 function = (zend_frameless_function_1)ZEND_FLF_HANDLER(opline);
9642+
function(result, arg1);
9643+
}
96619644
FREE_OP1();
96629645
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
96639646
}
@@ -9667,16 +9650,6 @@ ZEND_VM_HANDLER(206, ZEND_FRAMELESS_ICALL_2, ANY, ANY, SPEC(OBSERVER))
96679650
USE_OPLINE
96689651
SAVE_OPLINE();
96699652

9670-
#if !ZEND_VM_SPEC || ZEND_OBSERVER_ENABLED
9671-
if (ZEND_OBSERVER_ENABLED) {
9672-
zend_function *fbc = ZEND_FLF_FUNC(opline);
9673-
if (UNEXPECTED(zend_observer_handler_is_unobserved(ZEND_OBSERVER_DATA(fbc)) == false)) {
9674-
ZEND_VM_DISPATCH_TO_HELPER(zend_frameless_observed_call);
9675-
}
9676-
}
9677-
#endif
9678-
9679-
zend_frameless_function_2 function = (zend_frameless_function_2)ZEND_FLF_HANDLER(opline);
96809653
zval *result = EX_VAR(opline->result.var);
96819654
ZVAL_NULL(result);
96829655
zval *arg1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
@@ -9686,7 +9659,17 @@ ZEND_VM_HANDLER(206, ZEND_FRAMELESS_ICALL_2, ANY, ANY, SPEC(OBSERVER))
96869659
FREE_OP2();
96879660
HANDLE_EXCEPTION();
96889661
}
9689-
function(result, arg1, arg2);
9662+
9663+
#if !ZEND_VM_SPEC || ZEND_OBSERVER_ENABLED
9664+
if (ZEND_OBSERVER_ENABLED && UNEXPECTED(zend_observer_handler_is_unobserved(ZEND_OBSERVER_DATA(ZEND_FLF_FUNC(opline))) == false)) {
9665+
zend_frameless_observed_call(EXECUTE_DATA_C OPLINE_CC);
9666+
} else
9667+
#endif
9668+
{
9669+
zend_frameless_function_2 function = (zend_frameless_function_2)ZEND_FLF_HANDLER(opline);
9670+
function(result, arg1, arg2);
9671+
}
9672+
96909673
FREE_OP1();
96919674
/* Set OP1 to UNDEF in case FREE_OP2() throws. */
96929675
if (OP1_TYPE & (IS_VAR|IS_TMP_VAR)) {
@@ -9701,16 +9684,6 @@ ZEND_VM_HANDLER(207, ZEND_FRAMELESS_ICALL_3, ANY, ANY, SPEC(OBSERVER))
97019684
USE_OPLINE
97029685
SAVE_OPLINE();
97039686

9704-
#if !ZEND_VM_SPEC || ZEND_OBSERVER_ENABLED
9705-
if (ZEND_OBSERVER_ENABLED) {
9706-
zend_function *fbc = ZEND_FLF_FUNC(opline);
9707-
if (UNEXPECTED(zend_observer_handler_is_unobserved(ZEND_OBSERVER_DATA(fbc)) == false)) {
9708-
ZEND_VM_DISPATCH_TO_HELPER(zend_frameless_observed_call);
9709-
}
9710-
}
9711-
#endif
9712-
9713-
zend_frameless_function_3 function = (zend_frameless_function_3)ZEND_FLF_HANDLER(opline);
97149687
zval *result = EX_VAR(opline->result.var);
97159688
ZVAL_NULL(result);
97169689
zval *arg1 = GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R);
@@ -9722,7 +9695,17 @@ ZEND_VM_HANDLER(207, ZEND_FRAMELESS_ICALL_3, ANY, ANY, SPEC(OBSERVER))
97229695
FREE_OP_DATA();
97239696
HANDLE_EXCEPTION();
97249697
}
9725-
function(result, arg1, arg2, arg3);
9698+
9699+
#if !ZEND_VM_SPEC || ZEND_OBSERVER_ENABLED
9700+
if (ZEND_OBSERVER_ENABLED && UNEXPECTED(zend_observer_handler_is_unobserved(ZEND_OBSERVER_DATA(ZEND_FLF_FUNC(opline))) == false)) {
9701+
zend_frameless_observed_call(EXECUTE_DATA_C OPLINE_CC);
9702+
} else
9703+
#endif
9704+
{
9705+
zend_frameless_function_3 function = (zend_frameless_function_3)ZEND_FLF_HANDLER(opline);
9706+
function(result, arg1, arg2, arg3);
9707+
}
9708+
97269709
FREE_OP1();
97279710
/* Set to UNDEF in case FREE_OP2() throws. */
97289711
if (OP1_TYPE & (IS_VAR|IS_TMP_VAR)) {

0 commit comments

Comments
 (0)