Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

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

Abierto
#1,523 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 2 días

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
65/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
java, perl

Línea de trabajo

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.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

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.

Lenguaje dominante
Perl
Estrellas
64
Forks
6
Merge medio
5 h
PR fusionados (30 d)
161

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de fglock/PerlOnJava

Todos los issues de fglock/PerlOnJava

Issues similares

Más issues de Perl

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.