Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

Fix package-stash copy losing methods in Class::Hook

Aperta
#1,523 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

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
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
java, perl
Ambito
backend, compilers

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

area:backend area:runtime bug

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-Hook 0.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 for local *$globref; this issue covers runtime
    method loss after a package-stash hash copy.
  • #1473's false CORE::try/CORE::catch warnings appear during the test run,
    but do not cause this failure.

Regression coverage

Add a project-owned focused, system-Perl-validated regression test covering:

  1. A package with a normal constructor or named method.
  2. Snapshotting its stash with %saved = %{"Package::"}.
  3. Restoring it with %{"Package::"} = %saved.
  4. Successful class-method dispatch after restoration, including the returned
    blessed value.
  5. 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

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di fglock/PerlOnJava

Tutte le issue di fglock/PerlOnJava

Issue simili

Altre issue su Perl

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.