php-src/ext/pcre/tests/preg_replace_callback_array_trampoline.phpt
Gina Peter Banyard d6cc31cf95
ext/pcre: Refactor preg_replace_callback(_array)() to not pass a useless FCI (#17365)
* ext/pcre: Refactor php_pcre_replace_func_impl() to not rely on an FCI

* ext/pcre: Refactor populate_subpat_array() to take subject as a HashTable*

This makes the assumption the zval is always an array explicit

* ext/pcre: Refactor php_pcre_replace_func_impl()

We don't need the FCI any more, and we always have the subject as a zend_string.

* ext/pcre: Refactor php_pcre_replace_func()

We don't need the FCI any more

* ext/pcre: Refactor php_replace_in_subject_func()

We don't need the FCI any more
Make the Hashtable param const
Throw exception on non string entries

* ext/pcre: Refactor preg_replace_func_impl()

We don't need the FCI anymore
Make the Hashtable params const
Rename function to indicate it is a PHP pcre function

* ext/pcre: Add trampoline tests for preg_replace_callback(_array)()

* ext/pcre: Handle trampolines properly for preg_replace_callback(_array)()

* Revert FCI passing removal
2025-01-08 18:05:06 +00:00

112 lines
2.9 KiB
PHP

--TEST--
preg_replace_callback_array() with a trampoline
--FILE--
<?php
class TrampolineTest {
public function __call(string $name, array $arguments): string {
echo 'Trampoline for ', $name, PHP_EOL;
if ($name === 'trampolineThrow') {
throw new Exception('boo');
}
return "'" . $arguments[0][0] . "'";
}
}
$o = new TrampolineTest();
$callback = [$o, 'trampoline'];
$callbackThrow = [$o, 'trampolineThrow'];
$regexesToTest = [
[
'@\b\w{1,2}\b@' => $callback,
'~\A.~' => $callback,
],
[
'@\b\w{1,2}\b@' => $callback,
'~\A.~' => $callbackThrow,
],
[
'@\b\w{1,2}\b@' => $callback,
'~\A.~' => new stdClass(),
],
];
$subjectsToTest = [
[
'a b3 bcd',
'v' => 'aksfjk',
12 => 'aa bb',
['xyz'],
],
'a b3 bcd',
[
new stdClass(),
],
new stdClass(),
];
foreach ($regexesToTest as $regex) {
foreach ($subjectsToTest as $subject) {
try {
$matches = preg_replace_callback_array($regex, $subject);
var_dump($matches);
} catch (Throwable $e) {
echo $e::class, ': ', $e->getMessage(), PHP_EOL;
}
}
}
?>
--EXPECTF--
Trampoline for trampoline
Trampoline for trampoline
Trampoline for trampoline
Trampoline for trampoline
Warning: Array to string conversion in %s on line %d
Trampoline for trampoline
Trampoline for trampoline
Trampoline for trampoline
Trampoline for trampoline
array(4) {
[0]=>
string(14) "'''a' 'b3' bcd"
["v"]=>
string(8) "'a'ksfjk"
[12]=>
string(11) "'''aa' 'bb'"
[13]=>
string(7) "'A'rray"
}
Trampoline for trampoline
Trampoline for trampoline
Trampoline for trampoline
string(14) "'''a' 'b3' bcd"
Error: Object of class stdClass could not be converted to string
TypeError: preg_replace_callback_array(): Argument #2 ($subject) must be of type array|string, stdClass given
Trampoline for trampoline
Trampoline for trampoline
Trampoline for trampoline
Trampoline for trampoline
Warning: Array to string conversion in %s on line %d
Trampoline for trampolineThrow
Exception: boo
Trampoline for trampoline
Trampoline for trampoline
Trampoline for trampolineThrow
Exception: boo
Error: Object of class stdClass could not be converted to string
TypeError: preg_replace_callback_array(): Argument #2 ($subject) must be of type array|string, stdClass given
Trampoline for trampoline
Trampoline for trampoline
Trampoline for trampoline
Trampoline for trampoline
Warning: Array to string conversion in %s on line %d
TypeError: preg_replace_callback_array(): Argument #1 ($pattern) must contain only valid callbacks
Trampoline for trampoline
Trampoline for trampoline
TypeError: preg_replace_callback_array(): Argument #1 ($pattern) must contain only valid callbacks
Error: Object of class stdClass could not be converted to string
TypeError: preg_replace_callback_array(): Argument #2 ($subject) must be of type array|string, stdClass given