1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

2022 Commits

Author SHA1 Message Date
Tim Starling
605c0756c9 ext/zip: add ZipArchive::openString() method
Fixes to GH-14078:

* Rename ZipArchive::openBuffer() to ::openString().
* For consistency with ::open(), return int|bool, don't throw an
  exception on error. Provide error information via existing properties
  and accessors.
* Fix memory leak when ::openString() is called but ::close() is not
  called. Add test.
* Fix memory leak when a call to ::open() is followed by a call to
  ::openString(). Add test.
* Let libzip own the source, don't call zip_source_keep().
* Share buffer handling with ZipArchive::addFromString().

Elsewhere:

* If there is an error from zip_close() during a call to
  ZipArchive::open(), emit a warning but proceed to open the archive,
  don't return early. Add test.
* When buffers are saved by ZipArchive::addFromString(), release them
  in ZipArchive::close() and ::open(), don't accumulate buffers until
  the free_obj handler is called.
* Factor out buffer handling and reuse it in ZipArchive::openString()

Closes GH-21205.
Closes GH-14078.

Co-authored-by: Soner Sayakci <s.sayakci@shopware.com>
Co-authored-by: Ghaith Olabi <24876890+Gaitholabi@users.noreply.github.com>
2026-03-14 15:03:36 +01:00
Weilin Du
da1e89fd3d RFC: Add Form Feed in Trim Functions (#20788)
RFC: https://wiki.php.net/rfc/trim_form_feed

Resolves GH-20783.
2026-03-09 22:28:50 +01:00
Kamil Tekiela
eedbffec2e Empty some values of mysqli_get_charset() (#21361)
* Stop reporting unhelpful values in mysqli_get_charset

* Remove element "comment" as it has been undocumented
2026-03-07 22:09:02 +00:00
tekimen
7a1c2612c0 [RFC] Add grapheme_strrev function (#20949)
* [RFC] Add grapheme_strrev function

Add more tests Arabic for grapheme_strrev function.
2026-03-04 09:47:26 +09:00
Ilija Tovilo
be6038a35e [skip ci] Also add ReflectionProperty::is{Readable,Writable}() to NEWS
Also fix typo (missing and), and align message with rest of the doc.
2026-02-27 15:46:48 +01:00
Ilija Tovilo
e4f727d61e Implement ReflectionProperty::is{Readable,Writable}()
RFC: https://wiki.php.net/rfc/isreadable-iswriteable

Fixes GH-15309
Fixes GH-16175
Closes GH-16209
2026-02-27 14:26:06 +01:00
David Carlier
9b01f51701 ext/pcntl: Reject negative values in pcntl_alarm()
internal refactorings:

- pcntl_signal_get_handler() max signals handling simplification,
 reusing the num_signals global.
- pcntl_alarm() accepts a zend_long (signed) but passes it to alarm(),
which takes an unsigned int. Negative values silently wrap to large
unsigned values, scheduling an alarm far in the future instead of
raising an error. Also reject large values above unsigned long
max value.

close GH-21282
2026-02-26 18:06:40 +00:00
Louis-Arnaud
5bd1bbdc50 ext/pcre: Fix preg_grep() returning partial array instead of false on error (#21260)
When a PCRE execution error occurs (e.g. malformed UTF-8 with /u
modifier), preg_grep() was returning a partial result array containing
only the entries processed before the error. All other preg_* functions
return false on execution errors.

After the match loop, check PCRE_G(error_code) and if an error
occurred, destroy the partial array and return false instead.

Fixes GH-11936
2026-02-26 16:14:53 +00:00
Nicolas Grekas
42baffd2bf Add note about session behavior change in UPGRADE file (#21271) 2026-02-23 12:30:41 +00:00
Khaled Alam
0b4fbf2e70 ext/reflection: Add ReflectionConstant::inNamespace() method (#20902) 2026-02-16 21:28:32 -08:00
Gina Peter Banyard
45029f33be Update NEWS and UPGRADING for ext/session changes 2026-02-16 11:51:48 +00:00
Tim Düsterhus
ad83353a3d Fix line wrapping in NEWS/UPGRADING/UPGRADING.INTERNALS 2026-02-09 22:45:09 +01:00
Gina Peter Banyard
1041a47ed3 ext/standard: throw ValueError if argument contains null byte in session_module_name()
And fix error message to use 'must not' rather than 'cannot'
2026-02-09 10:49:59 +00:00
David Carlier
52e9436629 [ci skip] ext/posix: forgotten UPGRADING notes for posix_access()/posix_mkfifo(). 2026-02-06 12:56:29 +00:00
Ayesh Karunaratne
9dab2c99f9 ext/standard: add ARRAY_FILTER_USE_VALUE to UPGRADING
Closes GH-21100.
2026-02-01 10:35:15 +07:00
Jorg Adam Sowa
6d95a2238d ext/standard: validate mode in array_filter() (#15647)
And add the missing ARRAY_FILTER_USE_VALUE for the default case.
2026-01-26 16:02:15 +00:00
Kamil Tekiela
724ff60318 Add MYSQLI_OPT_COMPRESS (#20987) 2026-01-20 22:33:02 +00:00
David Carlier
44d6417bd7 ext/sockets: GH-20532 socket_addrinfo_lookup() sets EAI error code on resolution failures with a new optional argument.
close GH-20534
2026-01-20 20:58:52 +00:00
Tim Düsterhus
a3576bddc5 zend_compile: Optimize array_map() with callable convert callback into foreach (#20934)
* zend_compile: Optimize `array_map()` with callable convert callback into foreach

For:

    <?php

    function plus1($x) {
    	return $x + 1;
    }

    $array = array_fill(0, 100, 1);

    $count = 0;
    for ($i = 0; $i < 100_000; $i++) {
    	$count += count(array_map(plus1(...), $array));
    }

    var_dump($count);

This is ~1.1× faster:

    Benchmark 1: /tmp/test/before -d opcache.enable_cli=1 /tmp/test/test6.php
      Time (mean ± σ):     172.2 ms ±   0.5 ms    [User: 167.8 ms, System: 4.2 ms]
      Range (min … max):   171.6 ms … 173.1 ms    17 runs

    Benchmark 2: /tmp/test/after -d opcache.enable_cli=1 /tmp/test/test6.php
      Time (mean ± σ):     155.1 ms ±   1.3 ms    [User: 150.6 ms, System: 4.2 ms]
      Range (min … max):   154.2 ms … 159.3 ms    18 runs

    Summary
      /tmp/test/after -d opcache.enable_cli=1 /tmp/test/test6.php ran
        1.11 ± 0.01 times faster than /tmp/test/before -d opcache.enable_cli=1 /tmp/test/test6.php

With JIT it becomes ~1.7× faster:

    Benchmark 1: /tmp/test/before -d opcache.enable_cli=1 -d opcache.jit=tracing /tmp/test/test6.php
      Time (mean ± σ):     166.9 ms ±   0.6 ms    [User: 162.7 ms, System: 4.1 ms]
      Range (min … max):   166.1 ms … 167.9 ms    17 runs

    Benchmark 2: /tmp/test/after -d opcache.enable_cli=1 -d opcache.jit=tracing /tmp/test/test6.php
      Time (mean ± σ):      94.5 ms ±   2.7 ms    [User: 90.4 ms, System: 3.9 ms]
      Range (min … max):    92.5 ms … 103.1 ms    31 runs

    Summary
      /tmp/test/after -d opcache.enable_cli=1 -d opcache.jit=tracing /tmp/test/test6.php ran
        1.77 ± 0.05 times faster than /tmp/test/before -d opcache.enable_cli=1 -d opcache.jit=tracing /tmp/test/test6.php

* zend_compile: Skip `assert(...)` callbacks for array_map() optimization

* zend_compile: Remove `zend_eval_const_expr()` in array_map optimization

* zend_vm_def: Check simple types without loading the arginfo in ZEND_TYPE_ASSERT

* zend_vm_def: Handle references for ZEND_TYPE_ASSERT

* zend_compile: Fix handling of constant arrays for `array_map()`

* zend_compile: Fix leak of unused result in array_map() optimization

* zend_compile: Support static methods for `array_map()` optimization

* UPGRADING
2026-01-19 10:18:24 +01:00
David CARLIER
9b719cd4a3 ext/sockets: socket_addrinfo_lookup() allows AF_UNSPEC for ai_family. (#20658)
while still filtering out IPC like addresses and so on.

close GH-20658
2026-01-15 19:24:56 +00:00
Steve Wall
c1d2875a82 Implement GH-20310: No critical extension indication in openssl_x509_parse() output
This add criticalExtensions field to openssl_x509_parse() output that
provides name of all critical extensions.

Closes #20310
Closes #20311
2026-01-14 22:59:10 +01:00
Jakub Zelenka
8422224091 Update NEWS and UPGRADING with addition of JSON error locations 2026-01-03 18:40:57 +01:00
Niels Dossche
971728fe10 Fix GH-20679: finfo_file() doesn't work on remote resources (#20700)
The remote resources don't work because remote streams don't have a stat
method.
Since the check is only here for a best-effort check to return
"directory" instead of "empty", we can try the stat and still execute
the magic_stream() code even if it failed. Unfortunately we can't
distinguish between a failed stat and an unimplemented stat. If we
could, then this code could be even more robust.
2026-01-02 17:57:30 +01:00
Jakub Zelenka
e49be5f8e2 Allow filtered streams to be casted as fd for select
This removes the artificial limitation that is not necessary. The fact
that some streams can have some data buffered is not a problem because
the similar situation is already present for OpenSSL streams where
OpenSSL can internally buffer data for the unprocessed part of the
record.

Closes GH-20540
2026-01-01 20:51:23 +01:00
Jakub Zelenka
9582d8e6d7 Add stream socket keepalive context options
This adds so_keepalive, tcp_keepidle, tcp_keepintvl and tcp_keepcnt
stream socket context options that are used to set their upper case
C macro variants by setsockopt function.

The test requires sockets extension and just tests that the values are
being set. This is because a real test would be slow and difficult to
show that those options really work due to how they work internally.

Closes GH-20381
2025-12-30 16:52:22 +01:00
James Lucas
46e55dd97c ext/sockets: adding Linux's TCP_USER_TIMEOUT constant.
Set TCP_USER_TIMEOUT to cap (ms) how long TCP will wait for ACKs on in-flight data
before aborting the connection; prevents stuck/half-open sessions and
enables faster failover vs default retransmission timeouts.

Co-authored-by: David Carlier <devnexen@gmail.com>

close GH-20708
2025-12-19 07:38:10 +00:00
Kyle
06ea0e5df1 [RFC] Add clamp function (#19434)
* Implement clamp function

Co-authored-by: thinkverse <hallberg.kim@gmail.com>

* - Use a common function for normal and frameless implementations
- Add tests for null and not-comparable cases
- Fix object support for frameless clamp function
- Improve NAN handling

* Create tests triggering both frameless and dynamic variants

* Add changelog

* [Review] rephrase error messages to use "must not"

* Enable assert()

---------

Co-authored-by: thinkverse <hallberg.kim@gmail.com>
2025-12-18 20:27:30 +01:00
Niels Dossche
c9008f6dd8 Make buildFromIterator() work with custom SplFileInfo objects
While it is possible to return a custom SplFileInfo object in the
iterator used by buildFromIterator(), the data is not actually used from
that object, instead the data from the underlying internal structure is
used. This makes it impossible to override some metadata such as the
path name and modification time.

The main motivation comes from two reasons:
- Consistency. We expect our custom methods to be called when having a
  custom object.
- Support reproducibility. This is the original use case as requested in
  [1].

Add support for this by calling the getMTime() and getPathname() methods
if they're overriden by a user class.

[1] https://github.com/theseer/Autoload/issues/114.
2025-12-13 05:28:33 -08:00
Tobias Vorwachs
6b197ee4ed mbstring: fix missing copying of detect_order_list to current_detect_order_list on ini_set('mbstring.detect_order', string)
Closes GH-20523.
2025-12-01 20:47:57 +09:00
Niels Dossche
5bed2a8920 Avoid string copy in ZipArchive::addFromString() (#20497)
Instead of copying the data we increment the refcount of the string.
2025-11-16 14:57:00 +01:00
Niels Dossche
7b4270adf0 Update UPGRADING for array_map() performance 2025-11-08 23:29:24 +01:00
Niels Dossche
a09cc6ede6 standard: Optimize str_split() (#20419)
Three optimizations:
- If the entire string is returned, we don't need to duplicate it.
- Use packed filling logic.
- Use fast construction of strings. This is useful when splitting
  strings on length=1. In that case I get a 6x speedup in the code
  below.

Bench:
```php
$x = str_repeat('A', 100);
for ($i = 0; $i < 1000000; $i++)
    str_split($x, 10);
```

On an i7-4790:
```
Benchmark 1: ./sapi/cli/php x.php
  Time (mean ± σ):     160.1 ms ±   6.4 ms    [User: 157.3 ms, System: 1.8 ms]
  Range (min … max):   155.6 ms … 184.7 ms    18 runs

Benchmark 2: ./sapi/cli/php_old x.php
  Time (mean ± σ):     202.6 ms ±   4.0 ms    [User: 199.1 ms, System: 1.9 ms]
  Range (min … max):   197.4 ms … 209.2 ms    14 runs

Summary
  ./sapi/cli/php x.php  ran
    1.27 ± 0.06 times faster than ./sapi/cli/php_old x.php
```

The performance gain increases with smaller lengths.
2025-11-08 23:02:00 +01:00
Niels Dossche
0af87e9703 Improve performance of intval('+0b...', 2) and intval('0b...', 2)
For this benchmark:
```php
<?php

for ($i = 0; $i < 10000000; $i++) {
    intval('+0b11111111111100000000', 2);
}
```

On an i7-4790:
```
Benchmark 1: ./sapi/cli/php x.php
  Time (mean ± σ):     527.3 ms ±   8.1 ms    [User: 523.5 ms, System: 2.4 ms]
  Range (min … max):   515.4 ms … 545.1 ms    10 runs

Benchmark 2: ./sapi/cli/php_old x.php
  Time (mean ± σ):     629.3 ms ±   6.0 ms    [User: 625.9 ms, System: 1.8 ms]
  Range (min … max):   622.8 ms … 643.2 ms    10 runs

Summary
  ./sapi/cli/php x.php ran
    1.19 ± 0.02 times faster than ./sapi/cli/php_old x.php
```

Closes GH-20357.
2025-11-08 13:31:23 +01:00
Niels Dossche
db8c331d07 array_unshift: Add fast optimized case for packed arrays (#20353)
Packed arrays are likely common in this case, as with array_shift which
already has a similar optimization.

For the following benchmark:
```php
<?php

for ($i = 0; $i < 10000000; $i++) {
    $a = [0, 1, 2, 3, 4, 5];
    array_unshift($a, -3, -2, -1);
}
```

On an i7-4790:
```
Benchmark 1: ./sapi/cli/php x.php
  Time (mean ± σ):     753.8 ms ±  23.8 ms    [User: 749.8 ms, System: 2.1 ms]
  Range (min … max):   734.3 ms … 818.6 ms    10 runs

Benchmark 2: ./sapi/cli/php_old x.php
  Time (mean ± σ):     972.5 ms ±   5.0 ms    [User: 968.8 ms, System: 1.4 ms]
  Range (min … max):   967.8 ms … 984.3 ms    10 runs

Summary
  ./sapi/cli/php x.php  ran
    1.29 ± 0.04 times faster than ./sapi/cli/php_old x.php
```
2025-11-06 18:49:23 +01:00
Niels Dossche
3f8dc377a3 Improve performance of array_walk() (#20322)
We never need to use refcounted copies for arguments because the copy to
the call frame already increments the refcount.

For the following benchmark:
```php
$a = range(0, 10);
for ($i = 0; $i < 1000000; $i++)
    array_walk($a, fn ($val, $idx, $arg) => $val + $arg, 2);
```

On an i7-4790:
```
Benchmark 1: ./sapi/cli/php x.php
  Time (mean ± σ):     593.0 ms ±   5.4 ms    [User: 589.8 ms, System: 1.7 ms]
  Range (min … max):   583.3 ms … 600.9 ms    10 runs

Benchmark 2: ./sapi/cli/php_old x.php
  Time (mean ± σ):     637.8 ms ±   4.6 ms    [User: 633.9 ms, System: 2.2 ms]
  Range (min … max):   633.4 ms … 649.2 ms    10 runs

Summary
  ./sapi/cli/php x.php ran
    1.08 ± 0.01 times faster than ./sapi/cli/php_old x.php
```

On an i7-1185G7:
```
Benchmark 1: ./sapi/cli/php x.php
  Time (mean ± σ):     362.3 ms ±   2.0 ms    [User: 359.9 ms, System: 1.9 ms]
  Range (min … max):   359.6 ms … 367.1 ms    10 runs

Benchmark 2: ./sapi/cli/php_old x.php
  Time (mean ± σ):     385.5 ms ±   1.8 ms    [User: 383.2 ms, System: 1.9 ms]
  Range (min … max):   381.5 ms … 387.2 ms    10 runs

Summary
  ./sapi/cli/php x.php ran
    1.06 ± 0.01 times faster than ./sapi/cli/php_old x.php
```
2025-11-04 21:38:38 +01:00
Niels Dossche
7b6b233ce8 Optimize array_fill_keys() (#20347)
Move the refcount update outside of the loop.

For the following benchmark:
```php
$r = range(0, 1000);
$v = new stdClass();

for ($i = 0; $i < 100000; $i++) {
    array_fill_keys($r, $v);
}
```

On an i7-4790:
```
Benchmark 1: ./sapi/cli/php_old ../x.php
  Time (mean ± σ):     507.5 ms ±   4.8 ms    [User: 505.1 ms, System: 1.2 ms]
  Range (min … max):   501.2 ms … 518.4 ms    10 runs

Benchmark 2: ./sapi/cli/php ../x.php
  Time (mean ± σ):     479.8 ms ±   3.1 ms    [User: 476.8 ms, System: 1.8 ms]
  Range (min … max):   475.0 ms … 486.7 ms    10 runs

Summary
  ./sapi/cli/php ../x.php ran
    1.06 ± 0.01 times faster than ./sapi/cli/php_old ../x.php
```

On an i7-1185G7:
```
Benchmark 1: ./sapi/cli/php x.php
  Time (mean ± σ):     343.9 ms ±   3.1 ms    [User: 341.1 ms, System: 2.3 ms]
  Range (min … max):   337.9 ms … 347.8 ms    10 runs

Benchmark 2: ./sapi/cli/php_old x.php
  Time (mean ± σ):     357.8 ms ±   2.3 ms    [User: 355.7 ms, System: 1.6 ms]
  Range (min … max):   355.0 ms … 362.6 ms    10 runs

Summary
  ./sapi/cli/php x.php ran
    1.04 ± 0.01 times faster than ./sapi/cli/php_old x.php
```
2025-11-03 22:35:26 +01:00
Niels Dossche
540fd6e96b dom: Optimize splitText() (#20371)
This avoids duplicating the intermediate strings, by transferring
ownership.

It's hard to measure the improvement in a reliable way, as we have to
operate on the same node. The following benchmark shows a nice
improvement (although not perfect as a benchmark):
```php
<?php

$dom = new DOMDocument;
$dom->loadXML('<root>testabcdef</root>');
$text = $dom->documentElement->firstChild;

for ($i = 0; $i < 1000000; $i++) {
    $text2 = clone $text;
    $text2->splitText(5);
}
```

Only tested on my desktop i7-4790:
```
Benchmark 1: ./sapi/cli/php x.php
  Time (mean ± σ):     284.1 ms ±   2.8 ms    [User: 280.0 ms, System: 3.0 ms]
  Range (min … max):   281.4 ms … 291.3 ms    10 runs

Benchmark 2: ./sapi/cli/php_old x.php
  Time (mean ± σ):     314.0 ms ±   7.8 ms    [User: 309.2 ms, System: 2.9 ms]
  Range (min … max):   306.5 ms … 328.0 ms    10 runs

Summary
  ./sapi/cli/php x.php ran
    1.11 ± 0.03 times faster than ./sapi/cli/php_old x.php
```
2025-11-03 18:46:56 +01:00
Jakub Zelenka
aead67d0bb Add so_reuseaddr stream socket context option
This is to allow disabling of SO_REUSEADDR that is enabled by default.

To achieve better compatibility on Windows SO_EXCLUSIVEADDRUSE is set
if so_reuseaddr is false.

Closes GH-19967
2025-11-03 11:44:09 +01:00
David Carlier
6c1402031d ext/zip: code refactoring.
- change few helpers signatures.
- ZipArchive::extractTo now accepts only string entries for the files
  list.

close GH-20218
2025-10-27 21:19:52 +00:00
Tim Düsterhus
025e16cb54 zend_compile: Optimize arguments for ZEND_NEW (#20259)
* zend_compile: Add `is_func_accessible()` helper

* zend_compile: Use `zend_set_class_name_op1()` in `zend_compile_new()`

* zend_compile: Optimize arguments for ZEND_NEW

Apply the optimization for static method calls to `new` calls, since `new` is
effectively a static method for all intents and purposes.

For:

    <?php

    final class MyClass
    {
    	private function __construct(
    		private \Random\Engine $foo,
    		private int $bar = 0,
    	) {}

    	public static function new(int $bar): self
    	{
    		$engine = new \Random\Engine\Xoshiro256StarStar(seed: 123);
    		return new self(foo: $engine, bar: $bar);
    	}
    }

    for ($i = 0; $i < 3_000_000; $i++) {
    	MyClass::new($i);
    }

This is ~1.13 faster for a gcc 13.3 release build on a Intel(R) Core(TM)
i7-1365U.

    Benchmark 1: /tmp/bench/php.old /tmp/bench/test6.php
      Time (mean ± σ):     409.5 ms ±   1.9 ms    [User: 406.6 ms, System: 2.2 ms]
      Range (min … max):   407.4 ms … 414.0 ms    10 runs

    Benchmark 2: /tmp/bench/php.new /tmp/bench/test6.php
      Time (mean ± σ):     360.9 ms ±   1.7 ms    [User: 358.5 ms, System: 2.2 ms]
      Range (min … max):   359.2 ms … 365.0 ms    10 runs

    Summary
      /tmp/bench/php.new /tmp/bench/test6.php ran
        1.13 ± 0.01 times faster than /tmp/bench/php.old /tmp/bench/test6.php
2025-10-23 09:28:19 +02:00
Florian Engelhardt
26c96d38f4 re-use sprintf() optimisation for printf()
Closes GH-19658
2025-10-17 13:34:29 +02:00
Niels Dossche
aab5045a5b Add extra checks to Phar::mungServer() (#20141)
* Add extra checks to Phar::mungServer()

* [ci skip] NEWS/UPGRADING
2025-10-13 21:18:13 +02:00
Tim Düsterhus
50b3222d45 hash: Upgrade xxHash to 0.8.2 (#20064) 2025-10-08 21:04:18 +02:00
Niels Dossche
aaed3ccb47 Allow by-ref assign to WeakMap even if object is not yet in the map (#20097)
Previously this failed as the read_dimension which is invoked by
ref-assign does not contain the logic to add the key, so it was required
to first write the value using a normal assignment and then thereafter
use the reference assignment.
This solves it by adding the necessary logic to assign references
directly.
2025-10-08 17:37:24 +02:00
Tim Düsterhus
18d99ee4b7 json: Improve performance of php_json_encode_array() (#20092)
Instead of using a boolean flag to check for each element whether or not it is
the first, we just unconditionally append a comma after each element and then
remove the last comma at the end.

For:

    <?php

    $len = 0;
    for ($i = 0; $i < 3_000_000; $i++) {
    	$len += strlen(json_encode(array_fill(0, 20, [])));
    }
    var_dump($len);

This is ~1.06 faster for a gcc 13.3 release build on a Intel(R) Core(TM)
i7-1365U.

    Benchmark 1: /tmp/bench/before /tmp/bench/test6.php
      Time (mean ± σ):     819.6 ms ±   2.8 ms    [User: 816.4 ms, System: 2.4 ms]
      Range (min … max):   816.9 ms … 825.0 ms    10 runs

    Benchmark 2: /tmp/bench/after /tmp/bench/test6.php
      Time (mean ± σ):     770.8 ms ±   5.8 ms    [User: 766.6 ms, System: 2.9 ms]
      Range (min … max):   765.3 ms … 785.8 ms    10 runs

    Summary
      /tmp/bench/after /tmp/bench/test6.php ran
        1.06 ± 0.01 times faster than /tmp/bench/before /tmp/bench/test6.php
2025-10-08 10:10:16 +02:00
David Carlier
9731507b55 [ci skip] UPGRADING typo 2025-10-01 14:05:28 +01:00
David Carlier
4dc291c7bd [ci skip] UPGRADING 2025-10-01 12:54:43 +01:00
Bogdan Ungureanu
6ef4a87c18 ext/intl: Add IntlNumberRangeFormatter class.
to format an interval of two numbers with a given
skeleton, locale, collapse type and identity fallback

close GH-19232
2025-09-27 01:58:12 +01:00
Arnaud Le Blanc
0d4ff662e6 Expose the source of exit points in zend_jit_dump_exit_info()
This adds a new flag: ZEND_JIT_DEBUG_TRACE_EXIT_INFO_SRC. When the flag is set,
zend_jit_dump_exit_info() exposes the source of exit points, in debug builds.

Closes GH-19700
2025-09-24 09:26:14 +02:00
Daniel Scherzer
a4c712c379 master is now for PHP 8.6.0-dev 2025-09-23 14:59:55 -04:00