Fix package-stash copy losing methods in Class::Hook
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
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
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.
- Lenguaje dominante
- Perl
- Estrellas
- 64
- Forks
- 6
- Merge medio
- 5 h
- PR fusionados (30 d)
- 161
Preparar el entorno
- Incluye un Dockerfile o un archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de fglock/PerlOnJava
-
area:cpan-port area:unicode bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
fglock/PerlOnJava#1341 ·
Los mantenedores suelen responder en 2 días
-
area:backend area:cpan-port bug
Dificultad 4/5 3-5 días Aptitud para principiantes 48/100
fglock/PerlOnJava#1548 ·
Los mantenedores suelen responder en 2 días
-
bug
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
fglock/PerlOnJava#1541 ·
Los mantenedores suelen responder en 2 días
-
area:backend area:cpan-port area:parser area:runtime bug
Dificultad 3/5 1-2 días Aptitud para principiantes 78/100
fglock/PerlOnJava#1528 ·
Los mantenedores suelen responder en 2 días
-
Dificultad 3/5 1-2 días Aptitud para principiantes 74/100
fglock/PerlOnJava#1524 ·
Los mantenedores suelen responder en 2 días
Todos los issues de fglock/PerlOnJava
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 86/100
openfoodfacts/openfoodfacts-server#14724 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
rubocop/ruby-style-guide#982 ·
-
Strange loop in AgentTicketBulkAbiertoquestion
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 75/100