Skip to content

Commit a00e4a3

Browse files
committed
Merge branch 'PHP-8.2'
2 parents 897b13a + ce2000d commit a00e4a3

File tree

5 files changed

+74
-10
lines changed

5 files changed

+74
-10
lines changed

ext/opcache/jit/zend_jit_arm64.dasc

+9-5
Original file line numberDiff line numberDiff line change
@@ -9586,13 +9586,17 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
95869586

95879587
zend_jit_reset_last_valid_opline();
95889588

9589-
| // fbc->internal_function.handler(call, ret);
9589+
| // (zend_execute_internal ? zend_execute_internal : fbc->internal_function.handler)(call, ret);
95909590
| mov FCARG1x, RX
9591-
if (func) {
9592-
| EXT_CALL func->internal_function.handler, REG0
9591+
if (zend_execute_internal) {
9592+
| EXT_CALL zend_execute_internal, REG0
95939593
} else {
9594-
| ldr TMP1, [REG0, #offsetof(zend_internal_function, handler)]
9595-
| blr TMP1
9594+
if (func) {
9595+
| EXT_CALL func->internal_function.handler, REG0
9596+
} else {
9597+
| ldr TMP1, [REG0, #offsetof(zend_internal_function, handler)]
9598+
| blr TMP1
9599+
}
95969600
}
95979601

95989602
if (ZEND_OBSERVER_ENABLED) {

ext/opcache/jit/zend_jit_x86.dasc

+16-5
Original file line numberDiff line numberDiff line change
@@ -10294,12 +10294,23 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
1029410294

1029510295
zend_jit_reset_last_valid_opline();
1029610296

10297-
| // fbc->internal_function.handler(call, ret);
10298-
| mov FCARG1a, RX
10299-
if (func) {
10300-
| EXT_CALL func->internal_function.handler, r0
10297+
| // (zend_execute_internal ? zend_execute_internal : fbc->internal_function.handler)(call, ret);
10298+
if (zend_execute_internal) {
10299+
|.if X64
10300+
| // CARG2 and FCARG2a are identical
10301+
| mov CARG1, RX
10302+
|.else
10303+
| mov aword A2, FCARG2a
10304+
| mov aword A1, RX
10305+
|.endif
10306+
| EXT_CALL zend_execute_internal, r0
1030110307
} else {
10302-
| call aword [r0 + offsetof(zend_internal_function, handler)]
10308+
| mov FCARG1a, RX
10309+
if (func) {
10310+
| EXT_CALL func->internal_function.handler, r0
10311+
} else {
10312+
| call aword [r0 + offsetof(zend_internal_function, handler)]
10313+
}
1030310314
}
1030410315

1030510316
if (ZEND_OBSERVER_ENABLED) {

ext/zend_test/observer.c

+27
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,27 @@ void declared_class_observer(zend_class_entry *ce, zend_string *name) {
268268
}
269269
}
270270

271+
static void (*zend_test_prev_execute_internal)(zend_execute_data *execute_data, zval *return_value);
272+
static void zend_test_execute_internal(zend_execute_data *execute_data, zval *return_value) {
273+
zend_function *fbc = execute_data->func;
274+
275+
if (fbc->common.function_name) {
276+
if (fbc->common.scope) {
277+
php_printf("%*s<!-- internal enter %s::%s() -->\n", 2 * ZT_G(observer_nesting_depth), "", ZSTR_VAL(fbc->common.scope->name), ZSTR_VAL(fbc->common.function_name));
278+
} else {
279+
php_printf("%*s<!-- internal enter %s() -->\n", 2 * ZT_G(observer_nesting_depth), "", ZSTR_VAL(fbc->common.function_name));
280+
}
281+
} else {
282+
php_printf("%*s<!-- internal enter '%s' -->\n", 2 * ZT_G(observer_nesting_depth), "", ZSTR_VAL(fbc->op_array.filename));
283+
}
284+
285+
if (zend_test_prev_execute_internal) {
286+
zend_test_prev_execute_internal(execute_data, return_value);
287+
} else {
288+
fbc->internal_function.handler(execute_data, return_value);
289+
}
290+
}
291+
271292
static ZEND_INI_MH(zend_test_observer_OnUpdateCommaList)
272293
{
273294
zend_array **p = (zend_array **) ZEND_INI_GET_ADDR();
@@ -323,6 +344,7 @@ PHP_INI_BEGIN()
323344
STD_PHP_INI_BOOLEAN("zend_test.observer.fiber_init", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_fiber_init, zend_zend_test_globals, zend_test_globals)
324345
STD_PHP_INI_BOOLEAN("zend_test.observer.fiber_switch", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_fiber_switch, zend_zend_test_globals, zend_test_globals)
325346
STD_PHP_INI_BOOLEAN("zend_test.observer.fiber_destroy", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_fiber_destroy, zend_zend_test_globals, zend_test_globals)
347+
STD_PHP_INI_BOOLEAN("zend_test.observer.execute_internal", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_execute_internal, zend_zend_test_globals, zend_test_globals)
326348
PHP_INI_END()
327349

328350
void zend_test_observer_init(INIT_FUNC_ARGS)
@@ -351,6 +373,11 @@ void zend_test_observer_init(INIT_FUNC_ARGS)
351373
zend_observer_function_declared_register(declared_function_observer);
352374
zend_observer_class_linked_register(declared_class_observer);
353375
}
376+
377+
if (ZT_G(observer_execute_internal)) {
378+
zend_test_prev_execute_internal = zend_execute_internal;
379+
zend_execute_internal = zend_test_execute_internal;
380+
}
354381
}
355382

356383
void zend_test_observer_shutdown(SHUTDOWN_FUNC_ARGS)

ext/zend_test/php_test.h

+1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ ZEND_BEGIN_MODULE_GLOBALS(zend_test)
4949
int observer_fiber_init;
5050
int observer_fiber_switch;
5151
int observer_fiber_destroy;
52+
int observer_execute_internal;
5253
HashTable global_weakmap;
5354
int replace_zend_execute_ex;
5455
int register_passes;
+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
--TEST--
2+
Test zend_execute_internal being called
3+
--EXTENSIONS--
4+
zend_test
5+
--INI--
6+
zend_test.observer.execute_internal=1
7+
--FILE--
8+
<?php
9+
10+
function f($a) {
11+
var_dump(array_sum($a));
12+
}
13+
14+
f(time() > 0 ? [1, 2, 3] : []);
15+
16+
?>
17+
--EXPECT--
18+
<!-- internal enter time() -->
19+
<!-- internal enter array_sum() -->
20+
<!-- internal enter var_dump() -->
21+
int(6)

0 commit comments

Comments
 (0)