Skip to content

Fix ArrayNormalizer mutating the source array - #202

Merged
DavidBadura merged 1 commit into
1.24.xfrom
fix-array-normalizer
Sep 1, 2026
Merged

DavidBadura merged 1 commit into
1.24.xfrom
fix-array-normalizer

Conversation

@DavidBadura

Copy link
Copy Markdown
Member

normalize()/denormalize() iterated the input with foreach ($value as &$item) and wrote the result back in place. When the source array contained a reference element (e.g. a leftover &$row from an earlier foreach without unset), copy-on-write didn't kick in and the original array got mutated during extraction. Build a fresh result array instead of writing through references.

@DavidBadura DavidBadura added the bug Something isn't working label Sep 1, 2026
@DavidBadura DavidBadura added this to the 2.24.1 milestone Sep 1, 2026
@github-actions

github-actions Bot commented Sep 1, 2026 •

Copy link
Copy Markdown

Hello 👋

here is the most recent benchmark result:

HydratorWithLazyBench
=====================

+------------------------------------------+--------------------+--------------------+-----------------+------------+
|                                          | time (kde mode)                         | memory                       |
+------------------------------------------+--------------------+--------------------+-----------------+------------+
| subject                                  | Tag: <current>     | Tag: base          | Tag: <current>  | Tag: base  |
+------------------------------------------+--------------------+--------------------+-----------------+------------+
| benchHydrate1Object ()                   | 0.800μs (±0.00%)   | 0.600μs (±0.00%)   | 2.803mb         | 3.253mb    |
| benchHydrate1ObjectTriggerInit ()        | 3.400μs (±0.00%)   | 3.400μs (±0.00%)   | 2.803mb         | 3.253mb    |
| benchHydrate1000Objects ()               | 361.000μs (±0.00%) | 343.000μs (±0.00%) | 2.810mb         | 3.273mb    |
| benchHydrate1000ObjectsTriggerInit ()    | 2.873ms (±0.00%)   | 2.643ms (±0.00%)   | 2.813mb         | 3.317mb    |
| benchHydrate1000000Objects ()            | 229.901ms (±0.00%) | 216.061ms (±0.00%) | 2.810mb         | 3.273mb    |
| benchHydrate1000000ObjectsTriggerInit () | 1.695s (±0.00%)    | 1.737s (±0.00%)    | 2.812mb         | 2.812mb    |
+------------------------------------------+--------------------+--------------------+-----------------+------------+

HydratorWithCryptographyBench
=============================

+-------------------------------+--------------------+-------------------+-----------------+------------+
|                               | time (kde mode)                        | memory                       |
+-------------------------------+--------------------+-------------------+-----------------+------------+
| subject                       | Tag: <current>     | Tag: base         | Tag: <current>  | Tag: base  |
+-------------------------------+--------------------+-------------------+-----------------+------------+
| benchHydrate1Object ()        | 103.000μs (±0.00%) | 92.200μs (±0.00%) | 2.887mb         | 2.887mb    |
| benchExtract1Object ()        | 8.000μs (±0.00%)   | 8.400μs (±0.00%)  | 2.798mb         | 2.798mb    |
| benchHydrate1000Objects ()    | 3.505ms (±0.00%)   | 4.215ms (±0.00%)  | 3.082mb         | 3.077mb    |
| benchExtract1000Objects ()    | 4.704ms (±0.00%)   | 5.166ms (±0.00%)  | 2.984mb         | 2.975mb    |
| benchHydrate1000000Objects () | 1.981s (±0.00%)    | 2.034s (±0.00%)   | 3.082mb         | 3.077mb    |
| benchExtract1000000Objects () | 3.351s (±0.00%)    | 3.475s (±0.00%)   | 2.984mb         | 2.975mb    |
+-------------------------------+--------------------+-------------------+-----------------+------------+

StackHydratorBench
==================

+-------------------------------+-------------------+-------------------+-----------------+------------+
|                               | time (kde mode)                       | memory                       |
+-------------------------------+-------------------+-------------------+-----------------+------------+
| subject                       | Tag: <current>    | Tag: base         | Tag: <current>  | Tag: base  |
+-------------------------------+-------------------+-------------------+-----------------+------------+
| benchHydrate1Object ()        | 3.200μs (±0.00%)  | 3.000μs (±0.00%)  | 2.804mb         | 2.804mb    |
| benchExtract1Object ()        | 71.000μs (±0.00%) | 69.200μs (±0.00%) | 2.804mb         | 2.804mb    |
| benchHydrate1000Objects ()    | 2.385ms (±0.00%)  | 2.056ms (±0.00%)  | 3.018mb         | 3.011mb    |
| benchExtract1000Objects ()    | 2.069ms (±0.00%)  | 1.947ms (±0.00%)  | 2.940mb         | 2.935mb    |
| benchHydrate1000000Objects () | 1.146s (±0.00%)   | 1.217s (±0.00%)   | 3.018mb         | 3.012mb    |
| benchExtract1000000Objects () | 1.057s (±0.00%)   | 1.115s (±0.00%)   | 2.941mb         | 2.935mb    |
+-------------------------------+-------------------+-------------------+-----------------+------------+

HydratorBench
=============

+-------------------------------+------------------+------------------+-----------------+------------+
|                               | time (kde mode)                     | memory                       |
+-------------------------------+------------------+------------------+-----------------+------------+
| subject                       | Tag: <current>   | Tag: base        | Tag: <current>  | Tag: base  |
+-------------------------------+------------------+------------------+-----------------+------------+
| benchHydrate1Object ()        | 3.000μs (±0.00%) | 3.000μs (±0.00%) | 2.803mb         | 2.803mb    |
| benchExtract1Object ()        | 3.200μs (±0.00%) | 3.400μs (±0.00%) | 2.803mb         | 2.803mb    |
| benchHydrate1000Objects ()    | 2.117ms (±0.00%) | 2.403ms (±0.00%) | 2.936mb         | 2.869mb    |
| benchExtract1000Objects ()    | 1.994ms (±0.00%) | 2.137ms (±0.00%) | 2.838mb         | 2.829mb    |
| benchHydrate1000000Objects () | 1.080s (±0.00%)  | 1.122s (±0.00%)  | 2.936mb         | 2.869mb    |
| benchExtract1000000Objects () | 1.000s (±0.00%)  | 1.055s (±0.00%)  | 2.838mb         | 2.829mb    |
+-------------------------------+------------------+------------------+-----------------+------------+

StackHydratorWithCryptographyBench
==================================

+-------------------------------+------------------+------------------+-----------------+------------+
|                               | time (kde mode)                     | memory                       |
+-------------------------------+------------------+------------------+-----------------+------------+
| subject                       | Tag: <current>   | Tag: base        | Tag: <current>  | Tag: base  |
+-------------------------------+------------------+------------------+-----------------+------------+
| benchHydrate1Object ()        | 4.200μs (±0.00%) | 3.600μs (±0.00%) | 2.797mb         | 2.797mb    |
| benchExtract1Object ()        | 4.200μs (±0.00%) | 4.000μs (±0.00%) | 2.797mb         | 2.797mb    |
| benchHydrate1000Objects ()    | 3.201ms (±0.00%) | 3.163ms (±0.00%) | 2.977mb         | 2.964mb    |
| benchExtract1000Objects ()    | 2.802ms (±0.00%) | 2.897ms (±0.00%) | 2.977mb         | 2.977mb    |
| benchHydrate1000000Objects () | 1.723s (±0.00%)  | 1.857s (±0.00%)  | 3.088mb         | 3.085mb    |
| benchExtract1000000Objects () | 1.651s (±0.00%)  | 1.673s (±0.00%)  | 2.974mb         | 2.974mb    |
+-------------------------------+------------------+------------------+-----------------+------------+

This comment gets update everytime a new commit comes in!

@DavidBadura
DavidBadura merged commit 3e12685 into 1.24.x Sep 1, 2026
15 of 16 checks passed
@DavidBadura
DavidBadura deleted the fix-array-normalizer branch September 1, 2026 07:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants