Fix package-stash copy losing methods in Class::Hook
Maintainer antworten meist innerhalb von 2 Tagen
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 65/100
Rechercherichtung
The issue identifies package stash/typeglob assignment and method dispatch as the entry points; start by tracing %{"FOO::"} = %saved through both JVM and interpreter backends. Add the focused project-owned regression described in the issue, validate it against system Perl, and run it on both backends. Done means the blessed value is returned and unchanged Class-Hook 0.06 t/original.t passes.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Summary
PerlOnJava loses a package method after a package stash is copied back through
the standard typeglob/stash assignment pattern. This breaks the pure-Perl
Class::Hook distribution: its hook restores a saved class namespace and then
calls FOO->new, but the call returns undef rather than the blessed FOO
object returned by standard Perl.
The failure reproduces on both execution backends. It is a shared runtime
compatibility defect in package stash/typeglob handling or in method dispatch
after that mutation, not a dependency, XS, service, display, or timeout issue.
CPAN evidence
- CPAN random tester run:
20260925-103132-20451 - Distribution:
Class-Hook0.06 - Failing upstream test:
t/original.t - PerlOnJava result: 2 of 5 executed subtests fail, then the test aborts with
Can't call method "bar" on an undefined value; its plan is 11 tests. - Both JVM and interpreter backends reproduce the same result.
The unmodified upstream suite passes under the system-Perl oracle:
t/original.t .. ok
All tests successful.
Files=1, Tests=11
Result: PASS
Class::Hook is pure Perl, so no native-module port or reverse-dependency
qualification is involved.
Failing upstream pattern
Class::Hook dynamically loads a class, snapshots its namespace, restores the
saved namespace before dispatch, then removes it again so later calls route
through UNIVERSAL::AUTOLOAD. Its relevant pattern is:
no strict 'refs';
require FOO;
my %saved = %{"FOO::"};
%{"FOO::"} = %saved;
my $object = FOO->new({});
FOO::new is an ordinary Perl subroutine which blesses and returns a hash
reference. Standard Perl retains the method and returns a FOO object.
Minimal reproducer
The following is self-contained apart from a FOO.pm defining an ordinary
FOO::new constructor:
no strict 'refs';
require FOO;
my %saved = %{"FOO::"};
%{"FOO::"} = %saved;
my $object = FOO->new({});
print defined($object) ? ref($object) : "undef", "\n";
Expected with system Perl:
FOO
Actual with PerlOnJava JVM backend:
undef
Actual with PerlOnJava interpreter backend:
undef
Expected behavior
Assigning a saved package stash back through %{"FOO::"} = %saved must retain
the effective CODE slots for later method lookup. FOO->new({}) must invoke
FOO::new and return its blessed object, matching Perl.
The implementation should preserve normal typeglob slot semantics rather than
special-casing Class::Hook; callers may use this pattern for methods, package
variables, and other glob-backed namespace entries.
Related issues
- #1305 is related typeglob work but is not a duplicate: it covers compilation
and dynamic-scope restoration forlocal *$globref; this issue covers runtime
method loss after a package-stash hash copy. - #1473's false
CORE::try/CORE::catchwarnings appear during the test run,
but do not cause this failure.
Regression coverage
Add a project-owned focused, system-Perl-validated regression test covering:
- A package with a normal constructor or named method.
- Snapshotting its stash with
%saved = %{"Package::"}. - Restoring it with
%{"Package::"} = %saved. - Successful class-method dispatch after restoration, including the returned
blessed value. - JVM and interpreter backend parity.
After the focused test passes, rerun Class-Hook 0.06's unchanged t/original.t
as integration coverage.
- Vorherrschende Sprache
- Perl
- Sterne
- 64
- Forks
- 6
- Ø Merge
- 5 Std.
- Gemergte PRs (30 T.)
- 161
Entwicklungsumgebung
- Enthält ein Dockerfile oder eine Docker-Compose-Datei
- Keine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus fglock/PerlOnJava
-
area:cpan-port area:unicode bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 88/100
fglock/PerlOnJava#1341 ·
Maintainer antworten meist innerhalb von 2 Tagen
-
area:backend area:cpan-port bug
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 48/100
fglock/PerlOnJava#1548 ·
Maintainer antworten meist innerhalb von 2 Tagen
-
bug
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 35/100
fglock/PerlOnJava#1541 ·
Maintainer antworten meist innerhalb von 2 Tagen
-
area:backend area:cpan-port area:parser area:runtime bug
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 78/100
fglock/PerlOnJava#1528 ·
Maintainer antworten meist innerhalb von 2 Tagen
-
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 74/100
fglock/PerlOnJava#1524 ·
Maintainer antworten meist innerhalb von 2 Tagen
Alle Issues in fglock/PerlOnJava
Ähnliche Issues
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 90/100
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 86/100
openfoodfacts/openfoodfacts-server#14724 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
rubocop/ruby-style-guide#982 ·
-
bug question
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
RotherOSS/otobo#6172 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag