mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
Merge branch 'PHP-8.3'
* PHP-8.3: Fixed GH-11917: primitives seem to be passed via reference instead of by value under some conditions when JIT is enabled on windows (#12451)
This commit is contained in:
commit
221b4fe246
2 changed files with 62 additions and 1 deletions
|
@ -5188,7 +5188,7 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
|
||||||
result_reg = ZREG_R0;
|
result_reg = ZREG_R0;
|
||||||
} else {
|
} else {
|
||||||
/* ASSIGN_DIM_OP */
|
/* ASSIGN_DIM_OP */
|
||||||
if (sizeof(void*) == 4
|
if (ZREG_FCARG1 == ZREG_RCX
|
||||||
&& (opcode == ZEND_SL || opcode == ZEND_SR)
|
&& (opcode == ZEND_SL || opcode == ZEND_SR)
|
||||||
&& Z_MODE(op2_addr) != IS_CONST_ZVAL) {
|
&& Z_MODE(op2_addr) != IS_CONST_ZVAL) {
|
||||||
result_reg = ZREG_R2;
|
result_reg = ZREG_R2;
|
||||||
|
|
61
ext/opcache/tests/jit/gh11917.phpt
Normal file
61
ext/opcache/tests/jit/gh11917.phpt
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
--TEST--
|
||||||
|
GH-11917: primitives seem to be passed via reference instead of by value under some conditions when JIT is enabled on windows
|
||||||
|
--INI--
|
||||||
|
opcache.enable=1
|
||||||
|
opcache.enable_cli=1
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
$a = [2147483647,2147483647,2147483647,3,0,0,32,2147483584,127];
|
||||||
|
echo crc32(json_encode(bitwise_small_split($a))) . "\n";
|
||||||
|
echo crc32(json_encode(bitwise_small_split($a))) . "\n";
|
||||||
|
echo crc32(json_encode(bitwise_small_split($a))) . "\n";
|
||||||
|
echo crc32(json_encode(bitwise_small_split($a))) . "\n";
|
||||||
|
|
||||||
|
function bitwise_small_split($val)
|
||||||
|
{
|
||||||
|
$split = 8;
|
||||||
|
$vals = [];
|
||||||
|
|
||||||
|
$mask = (1 << $split) - 1;
|
||||||
|
|
||||||
|
$i = $overflow = 0;
|
||||||
|
$len = count($val);
|
||||||
|
$val[] = 0;
|
||||||
|
$remaining = 31;
|
||||||
|
|
||||||
|
while ($i != $len) {
|
||||||
|
$digit = $val[$i] & $mask;
|
||||||
|
|
||||||
|
$val[$i] >>= $split;
|
||||||
|
if (!$overflow) {
|
||||||
|
$remaining -= $split;
|
||||||
|
$overflow = $split <= $remaining ? 0 : $split - $remaining;
|
||||||
|
|
||||||
|
if (!$remaining) {
|
||||||
|
$i++;
|
||||||
|
$remaining = 31;
|
||||||
|
$overflow = 0;
|
||||||
|
}
|
||||||
|
} elseif (++$i != $len) {
|
||||||
|
$tempmask = (1 << $overflow) - 1;
|
||||||
|
$digit |= ($val[$i] & $tempmask) << $remaining;
|
||||||
|
$val[$i] >>= $overflow;
|
||||||
|
$remaining = 31 - $overflow;
|
||||||
|
$overflow = $split <= $remaining ? 0 : $split - $remaining;
|
||||||
|
}
|
||||||
|
|
||||||
|
$vals[] = $digit;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ($vals[count($vals) - 1] == 0) {
|
||||||
|
unset($vals[count($vals) - 1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return array_reverse($vals);
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
48207660
|
||||||
|
48207660
|
||||||
|
48207660
|
||||||
|
48207660
|
Loading…
Add table
Add a link
Reference in a new issue