Skip to content

Magic v2: Viral value magic#24508

Open
leonerd wants to merge 13 commits into
Perl:bleadfrom
leonerd:magic-v2-phase2
Open

Magic v2: Viral value magic#24508
leonerd wants to merge 13 commits into
Perl:bleadfrom
leonerd:magic-v2-phase2

Conversation

@leonerd

@leonerd leonerd commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

(This is a dependent PR that requires first that #24547 be merged)

A currently-draft PR that builds on top of the general "Magic v2" to add viral value magic; as outlined in PPC0036.

Note this PR currently includes all of the commits included in the first phase PR as well, so that the the actual result makes sense. I'll have to rebase it on top of blead once #24547 is merged. For review purposes, it likely makes sense to filter this PR down and look at only the final 3 commits:

  • Define a new interpreter var for viral hook annotations
  • Add TAINT_IF_SV() helper macro
  • Create viral value magic

@leonerd leonerd added the defer-next-dev This PR should not be merged yet, but await the next development cycle label Jun 25, 2026
@leonerd leonerd changed the title Magic v2 phase2 Magic v2: Viral value magic Jun 25, 2026
@leonerd leonerd force-pushed the magic-v2-phase2 branch 3 times, most recently from f6f60ec to e7256b0 Compare June 26, 2026 14:13
Comment thread perl.h Outdated
Comment thread op.c
@tonycoz

tonycoz commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

look at only the final 3 commits

There's a few commits before those that aren't in #24163 (I wondered where the op.c change came from.)

Comment thread util.c Outdated
}

SV *ex = vmess(pat, args);
PERL_ARGS_ASSERT_VWARN;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The assert should be above the vmess() call, it's pointless below it.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh oops. I don't recall moving that but maybe that was a recent(ish) blead fix that has been broken by some rebase operation over the past few months. I shall fix that.

@leonerd

leonerd commented Jun 29, 2026

Copy link
Copy Markdown
Contributor Author

look at only the final 3 commits

There's a few commits before those that aren't in #24163 (I wondered where the op.c change came from.)

Ahyes, those are some post-phase1 fixups to other files to use the new magic system in static locations, just as a demonstration that it works. I intend to submit those as little fixes after the first branch is merged, before this one. github doesn't easily allow me to make even a draft PR between two moving points in a branch, so that was the best I could do. Those will be out of this PR by the time it becomes ready.

@leonerd

leonerd commented Jul 8, 2026

Copy link
Copy Markdown
Contributor Author

Since it seems nobody's going to review this while it's drafted I shall undraft it. I don't imagine there's a danger anyone will accidentally merge it ahead of time anyway. ;)

@leonerd leonerd added the do not merge Don't merge this PR, at least for now label Jul 8, 2026
@leonerd leonerd marked this pull request as ready for review July 8, 2026 17:45
leonerd added 4 commits July 10, 2026 16:26
The existing `MAGIC` and `MGVTBL` structures are insufficiently
extensible, because they lack any embedded type information, or any
version numbering by which new abilities can be added in a
backwards-compatible way. Commit 6d97c86 managed to free a single bit
in the `mg_flags` field; it is this bit that we use to indicate that the
`MAGIC` structure refers to version 2 of Magic.

The new structures are defined in a way that should be much easier to
permit updates in future; primarily by the presence of a version number
in the `ver` field, and the set of trigger functions in the `shape`
field. In this way, we hope to be able to extend the abilities of magic
in the future by adding new structure shapes as well as new trigger
functions.
leonerd added 6 commits July 13, 2026 12:27
Currently unused by the rest of the code.

This commit is extracted separately simply so it can be placed at the
very start of the branch. A full rebuild is needed either side of this
commit, so by being at the beginning this makes rebase, bisect, and
other operations easier as now you don't have to `make clean`.
leonerd added 3 commits July 13, 2026 12:27
Rather than put `-Wno-missing-field-initializers` in the compile flags
for everything, it seems safer to ignore it just around the locations
that need it.
Adds a new SVs_VMG flag + associated macros; use the SvVMAGICAL flag to
fast-path sv_has_valuemagic() if appropriate

Use the sv_has_valuemagic() function to know whether to call
mg_propagate() in sv_setsv_flags()
Much like -DNO_TAINT_SUPPORT, this is optional and not default, but will
disable value magic support in exchange for getting that little extra
performance boost by not having to worry about it.
@leonerd

leonerd commented Jul 13, 2026

Copy link
Copy Markdown
Contributor Author

Are there any reviewers for this?

Comment thread doio.c
Comment on lines 1281 to +1282
/* ideally we could just remove the magic from the SV but we don't get the SV here */
SvREFCNT_dec(mg->mg_obj);
mg->mg_obj = NULL;

return 0;
MgAUXSV_set(mg, NULL);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

comment out of date

Comment on lines +59 to +65
GCC_DIAG_IGNORE_DECL(-Wmissing-field-initializers);
static const struct MagicFunctions magicfuncs_perlencoding = {
.ver = 2,
.shape = MGv2s_BASE,
.debug_name = "PerlIO::encoding/tag",
};
GCC_DIAG_RESTORE_DECL;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Given the discussion I'm not sure this still needs to be here,

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

defer-next-dev This PR should not be merged yet, but await the next development cycle do not merge Don't merge this PR, at least for now

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants