Skip to content

Commit 1015f1f

Browse files
committed
Add test, fix x86 JIT
Signed-off-by: Bob Weinand <[email protected]>
1 parent c53e8d3 commit 1015f1f

File tree

4 files changed

+57
-1
lines changed

4 files changed

+57
-1
lines changed

ext/opcache/jit/zend_jit_x86.dasc

+8-1
Original file line numberDiff line numberDiff line change
@@ -10395,10 +10395,17 @@ static int zend_jit_do_fcall(dasm_State **Dst, const zend_op *opline, const zend
1039510395
zend_jit_reset_last_valid_opline();
1039610396

1039710397
| // (zend_execute_internal ? zend_execute_internal : fbc->internal_function.handler)(call, ret);
10398-
| mov FCARG1a, RX
1039910398
if (zend_execute_internal) {
10399+
|.if X64
10400+
| // CARG2 and FCARG2a are identical
10401+
| mov CARG1, RX
10402+
|.else
10403+
| mov aword A2, FCARG2a
10404+
| mov aword A1, RX
10405+
|.endif
1040010406
| EXT_CALL zend_execute_internal, r0
1040110407
} else {
10408+
| mov FCARG1a, RX
1040210409
if (func) {
1040310410
| EXT_CALL func->internal_function.handler, r0
1040410411
} else {

ext/zend_test/observer.c

+27
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,27 @@ static void fiber_suspend_observer(zend_fiber_context *from, zend_fiber_context
256256
}
257257
}
258258

259+
static void (*zend_test_prev_execute_internal)(zend_execute_data *execute_data, zval *return_value);
260+
static void zend_test_execute_internal(zend_execute_data *execute_data, zval *return_value) {
261+
zend_function *fbc = execute_data->func;
262+
263+
if (fbc->common.function_name) {
264+
if (fbc->common.scope) {
265+
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));
266+
} else {
267+
php_printf("%*s<!-- internal enter %s() -->\n", 2 * ZT_G(observer_nesting_depth), "", ZSTR_VAL(fbc->common.function_name));
268+
}
269+
} else {
270+
php_printf("%*s<!-- internal enter '%s' -->\n", 2 * ZT_G(observer_nesting_depth), "", ZSTR_VAL(fbc->op_array.filename));
271+
}
272+
273+
if (zend_test_prev_execute_internal) {
274+
zend_test_prev_execute_internal(execute_data, return_value);
275+
} else {
276+
fbc->internal_function.handler(execute_data, return_value);
277+
}
278+
}
279+
259280
static ZEND_INI_MH(zend_test_observer_OnUpdateCommaList)
260281
{
261282
zend_array **p = (zend_array **) ZEND_INI_GET_ADDR();
@@ -291,6 +312,7 @@ PHP_INI_BEGIN()
291312
STD_PHP_INI_BOOLEAN("zend_test.observer.fiber_init", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_fiber_init, zend_zend_test_globals, zend_test_globals)
292313
STD_PHP_INI_BOOLEAN("zend_test.observer.fiber_switch", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_fiber_switch, zend_zend_test_globals, zend_test_globals)
293314
STD_PHP_INI_BOOLEAN("zend_test.observer.fiber_destroy", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_fiber_destroy, zend_zend_test_globals, zend_test_globals)
315+
STD_PHP_INI_BOOLEAN("zend_test.observer.execute_internal", "0", PHP_INI_SYSTEM, OnUpdateBool, observer_execute_internal, zend_zend_test_globals, zend_test_globals)
294316
PHP_INI_END()
295317

296318
void zend_test_observer_init(INIT_FUNC_ARGS)
@@ -316,6 +338,11 @@ void zend_test_observer_init(INIT_FUNC_ARGS)
316338
zend_observer_fiber_switch_register(fiber_suspend_observer);
317339
zend_observer_fiber_destroy_register(fiber_destroy_observer);
318340
}
341+
342+
if (ZT_G(observer_execute_internal)) {
343+
zend_test_prev_execute_internal = zend_execute_internal;
344+
zend_execute_internal = zend_test_execute_internal;
345+
}
319346
}
320347

321348
void zend_test_observer_shutdown(SHUTDOWN_FUNC_ARGS)

ext/zend_test/php_test.h

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ ZEND_BEGIN_MODULE_GLOBALS(zend_test)
4848
int observer_fiber_init;
4949
int observer_fiber_switch;
5050
int observer_fiber_destroy;
51+
int observer_execute_internal;
5152
HashTable global_weakmap;
5253
int replace_zend_execute_ex;
5354
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)