Reference runtime-defined functions from literals #5593
Closed
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Currently, we handle closures and conditionally defined functions by inserting them into the function table with an RTD key. There are two issues with this:
This patch addresses this by storing a direct reference to the function as CONST opcode literal. We add a small
zend_func_ref
wrapper to allow zval storage in a way that is integrated with the existing refcounting system.This naturally avoids RTD key collisions, because we no longer use an RTD key for this purpose. It partially avoids the memory leak as well. Most of the function structures will now get freed and we only leak the arena allocated parts. Avoiding arena-allocated parts for runtime-defined functions would be a followup.
There are still two problems here:
Unfortunately this approach will not extend to classes, because those are often not immutable...
@dstogov What do you think about this?