005_variation2.phpt creates files with special names, and
filesize_variation5.phpt checks for filesize of inexistent files with special
names. Create the files in a separate directory to avoid these tests clashing.
Closes GH-12692
In AArch64 function `zend_jit_set_veneer()`, some debug code calls two
other functions `ir_disasm_find_symbol()` and `ir_disasm_add_symbol()`
defined in `ir_disasm.c`. However, `ir_disasm.c` is compiled under the
condition that capstone is available. This causes an undefined symbol
issue while loading `opcache.so` when JIT is triggered if PHP is built
without `--with-capstone`.
We find this issue on MacOS 12.5 if we build PHP with Clang 14. It does
not appear immediately when using other versions of toolchains because
of lazy binding. To reproduce this with Linux/GCC, we can disable lazy
binding by `export LD_BIND_NOW=1` before building PHP.
This fixes the issue by making the debug code conditionally compile.
* Split function and use _new variant to avoid redundant checks
* Precompute better array size to avoid rehashing
* Use new function to add into array instead of merging into, preventing temporary memory allocations
* Convert to regex without separate copy + lowering
We're already doing a character-wise loop after lowering, so just lower
it character by character instead of looping over it twice and
allocating memory.
* Use HASH_MAP loop because htab can never be packed
This saves additional checks.
* Move destructor to more sensible place
* Remove now unused browscap_zval_copy_ctor
* Use zend_string_release_ex variant where possible
* Implement dedicated greedy wildcard matching algorithm
This avoids compiling, allocating and caching regexes and should run in
the same complexity.
* Cache previous length instead of repeatedly recomputing it
* Add additional optimization to wildcard * matching
* Move cheap checks to the callsite
The function prologue and epilogue have a stupidly high overhead for
those 2 simple checks at the start.
We can't always-inline the reg_compare function because it contains
alloca, and the alloca is really important for performance.
Instead, move those cheap checks to the call site.
* Use specialised loop to avoid unnecessary conversions and checks
* Optimize counting loop by taking into account the prefix
* Precompute the hash values of known keys
* [ci skip] UPGRADING
* Code style
* Add a note why we have the early-skip checks in the loop