Skip to content

Commit 5d7a15f

Browse files
committed
Merge branch 'PHP-8.5'
* PHP-8.5: Fix incorrect trace stop type
2 parents 631c366 + 6872432 commit 5d7a15f

3 files changed

Lines changed: 130 additions & 0 deletions

File tree

ext/opcache/jit/zend_jit_vm_helpers.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1095,6 +1095,8 @@ zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *ex,
10951095
if (UNEXPECTED(!jit_extension)
10961096
|| UNEXPECTED(!(jit_extension->func_info.flags & ZEND_FUNC_JIT_ON_HOT_TRACE))) {
10971097
if (execute_data->prev_execute_data != prev_execute_data) {
1098+
stop = ZEND_JIT_TRACE_STOP_RETURN;
1099+
} else {
10981100
stop = ZEND_JIT_TRACE_STOP_INTERPRETER;
10991101
}
11001102
break;

ext/opcache/tests/jit/gh21746.inc

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
return function (mixed $in = null, array $options = []) {
3+
$a = null;
4+
$b = '';
5+
$c = '';
6+
$d = fn() => '';
7+
$e = fn() => '';
8+
$f = fn() => '';
9+
$g = fn() => '';
10+
return ''
11+
.LR::p(null, '', null, [], '')
12+
.LR::hbbch([null], $d)
13+
.LR::hbbch([null], $e)
14+
.LR::hbbch([null], $f)
15+
.LR::hbbch([null], $g);
16+
};

ext/opcache/tests/jit/gh21746.phpt

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
--TEST--
2+
GH-21746: Segfault with tracing JIT on 2nd call of eval'd closure
3+
--CREDITS--
4+
theodorejb
5+
--EXTENSIONS--
6+
opcache
7+
--INI--
8+
opcache.jit=tracing
9+
--FILE--
10+
<?php
11+
12+
final class LR {
13+
public static function p(mixed $cx, string $name, mixed $context, array $hash, string $indent): string {
14+
try { $result = ''; } finally {}
15+
$lines = explode("\n", $result);
16+
foreach ($lines as $i => $_) { if ($i === 0) break; }
17+
return $result;
18+
}
19+
public static function hbbch(array $positional, ?\Closure $cb): string {
20+
if ($cb && is_array($positional[0] ?? null)) foreach ($positional[0] as $v) $cb($v);
21+
return '';
22+
}
23+
}
24+
25+
$renderFile = __DIR__ . '/gh21746.inc';
26+
27+
// prevent JITing $renderFile
28+
ini_set('opcache.file_update_protection', 100);
29+
touch($renderFile);
30+
31+
$renderer = require $renderFile;
32+
33+
for ($r = 0; $r < 70; $r++) {
34+
echo "Render $r...";
35+
$renderer();
36+
echo "OK\n";
37+
}
38+
39+
?>
40+
==DONE==
41+
--EXPECT--
42+
Render 0...OK
43+
Render 1...OK
44+
Render 2...OK
45+
Render 3...OK
46+
Render 4...OK
47+
Render 5...OK
48+
Render 6...OK
49+
Render 7...OK
50+
Render 8...OK
51+
Render 9...OK
52+
Render 10...OK
53+
Render 11...OK
54+
Render 12...OK
55+
Render 13...OK
56+
Render 14...OK
57+
Render 15...OK
58+
Render 16...OK
59+
Render 17...OK
60+
Render 18...OK
61+
Render 19...OK
62+
Render 20...OK
63+
Render 21...OK
64+
Render 22...OK
65+
Render 23...OK
66+
Render 24...OK
67+
Render 25...OK
68+
Render 26...OK
69+
Render 27...OK
70+
Render 28...OK
71+
Render 29...OK
72+
Render 30...OK
73+
Render 31...OK
74+
Render 32...OK
75+
Render 33...OK
76+
Render 34...OK
77+
Render 35...OK
78+
Render 36...OK
79+
Render 37...OK
80+
Render 38...OK
81+
Render 39...OK
82+
Render 40...OK
83+
Render 41...OK
84+
Render 42...OK
85+
Render 43...OK
86+
Render 44...OK
87+
Render 45...OK
88+
Render 46...OK
89+
Render 47...OK
90+
Render 48...OK
91+
Render 49...OK
92+
Render 50...OK
93+
Render 51...OK
94+
Render 52...OK
95+
Render 53...OK
96+
Render 54...OK
97+
Render 55...OK
98+
Render 56...OK
99+
Render 57...OK
100+
Render 58...OK
101+
Render 59...OK
102+
Render 60...OK
103+
Render 61...OK
104+
Render 62...OK
105+
Render 63...OK
106+
Render 64...OK
107+
Render 65...OK
108+
Render 66...OK
109+
Render 67...OK
110+
Render 68...OK
111+
Render 69...OK
112+
==DONE==

0 commit comments

Comments
 (0)