Branch: refs/heads/blead
Home: https://github.com/Perl/perl5
Commit: 94e539065d94fbbf604cff345c786d952c08d6b1
https://github.com/Perl/perl5/commit/94e539065d94fbbf604cff345c786d952c08d6b1
Author: Paul "LeoNerd" Evans <[email protected]>
Date: 2026-03-26 (Thu, 26 Mar 2026)
Changed paths:
M class.c
M hv.h
M regen/embed.pl
M t/class/inherit.t
Log Message:
-----------
Defer seal of subclass until superclass is done
Fixes https://github.com/Perl/perl5/issues/20890
The bug is that when you seal class that is a subclass of an existing one,
if that existing one was not yet sealed then a pointer access hasn't yet
been filled in, and a NULL deref occurs.
This is fixed by a reïmplementation of the same deferral logic that
Object::Pad has found to be good and stable. Namely, that each class
needs a flag that tracks whether it has been sealed. When attempting to
seal a class whose superclass isn't yet sealed, we defer the operation
until the superclass is sealed, instead just making a note within the
superclass that it should come back and seal this one later.
This deferral mechanism allows a variety of subclassing cases to work
which previously did not. As well as the original case described in
GH#20890, this also permits block-scoped sub-classes defined inside the
base class's scope. Such syntax may be useful for a new ability in
future.
To unsubscribe from these emails, change your notification settings at
https://github.com/Perl/perl5/settings/notifications