Fix package-stash copy losing methods in Class::Hook
I maintainer di solito rispondono entro 2 giorni
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 65/100
Direzione di ricerca
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.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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.
- Lingua principale
- Perl
- Stelle
- 64
- Fork
- 6
- Merge medio
- 4h 53m
- PR unite (30g)
- 165
Preparare l'ambiente
- Include un Dockerfile o un file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di fglock/PerlOnJava
-
area:cpan-port area:unicode bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
fglock/PerlOnJava#1341 ·
I maintainer di solito rispondono entro 2 giorni
-
area:backend area:cpan-port area:parser area:runtime bug
Difficoltà 3/5 1-2 giorni Idoneità per principianti 78/100
fglock/PerlOnJava#1528 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 74/100
fglock/PerlOnJava#1524 ·
I maintainer di solito rispondono entro 2 giorni
-
area:backend area:cpan-port bug
Difficoltà 3/5 1-2 giorni Idoneità per principianti 76/100
fglock/PerlOnJava#1522 ·
I maintainer di solito rispondono entro 2 giorni
-
area:backend area:io area:unicode bug
Difficoltà 4/5 3-5 giorni Idoneità per principianti 52/100
fglock/PerlOnJava#1520 ·
I maintainer di solito rispondono entro 2 giorni
Tutte le issue di fglock/PerlOnJava
Issue simili
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 86/100
openfoodfacts/openfoodfacts-server#14724 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
rubocop/ruby-style-guide#982 ·
-
question
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 75/100
-
Bug Priority
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
canonical/chisel-releases#1235 ·
I maintainer di solito rispondono entro 1 giorno