Geo::Coordinates::OSGB 2.20 fails on constant hash-reference dereferences
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 58/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Active
- Domain
- compilers, testing-qa
Research direction
Start with jperl t/02-known.t and jperl --interpreter t/02-known.t, then inspect Geo::Coordinates::OSGB.pm and the JVM and interpreter handling of constant hash-reference dereferences. Use the affected tests, including t/02-known.t, t/03-format.t, t/05-random.t, t/06-osgb-grid-to-ll.t, t/06-osgb-ll-to-grid.t, t/08-out_of_range.t, and t/13-edge-and-at-sea.t. Done means a focused regression test covers exists and array dereferences, both backends pass all 360 upstream tests, and ordinary variables and constant return types remain intact.
Written by the indexing model from the issue text.
Description
Summary
Geo::Coordinates::OSGB v2.20 fails most of its upstream test suite under PerlOnJava when code dereferences the hash reference returned by a use constant declaration:
use constant ELLIPSOIDS => { ... };
my $shape = ...;
my ($a, $b, $f, $e2) = @{ ELLIPSOIDS->{$shape} };
This was observed in CPAN random tester run 20260914-160652-26153.
Reproduction
The upstream suite passes completely under system Perl:
- 10 test programs
- 360 tests
- all tests successful
Under PerlOnJava, the failure reproduces on both execution backends. Focused reproductions are:
jperl t/02-known.t
jperl --interpreter t/02-known.t
Observed failures
JVM backend:
Global symbol "@ELLIPSOIDS" requires explicit package name (did you forget to declare "my @ELLIPSOIDS"?)
The error is reported from Geo::Coordinates::OSGB.pm at the ELLIPSOIDS->{$shape} dereference.
Interpreter backend:
Can't use string ("0") as a HASH ref while "strict refs" in use
The affected upstream programs include:
t/02-known.tt/03-format.tt/05-random.tt/06-osgb-grid-to-ll.tt/06-osgb-ll-to-grid.tt/08-out_of_range.tt/13-edge-and-at-sea.t
Some tests that do not exercise the affected coordinate-conversion paths pass, including t/01-load.t, t/04-parsing.t, and t/07-maps.t.
Expected behavior
Perl treats the value declared by use constant ELLIPSOIDS => { ... } as a hash reference. The expression ELLIPSOIDS->{$shape} must resolve the constant value and perform a normal hash lookup under both PerlOnJava backends, matching system Perl.
Technical evidence and diagnosis
The distribution is pure Perl and has no XS, native-library, network, display, or platform-specific prerequisite involved in the failing tests. System Perl passes all 360 upstream tests, while PerlOnJava fails deterministically during compilation/execution on both backends.
The relevant source contains:
use constant ELLIPSOIDS => {
WGS84 => [ ... ],
ETRS89 => [ ... ],
GRS80 => [ ... ],
OSGB36 => [ ... ],
};
and repeatedly uses expressions such as:
exists ELLIPSOIDS->{$shape}
@{ ELLIPSOIDS->{$shape} }
The JVM frontend appears to parse the bareword constant as a package variable and performs strict-vars validation against an array symbol named @ELLIPSOIDS. The interpreter instead evaluates the constant call incorrectly and attempts to dereference the string value "0" as a hash reference. This suggests a shared semantic gap in constant subroutine resolution or bareword/hash-dereference handling, with backend-specific failure paths.
Acceptance criteria
- All 10 upstream test programs and 360 tests pass on the JVM backend.
- The same suite passes on the interpreter backend.
- Add a project-owned focused regression test for hash-reference constants used through bareword dereference syntax, including
exists CONSTANT->{key}and@{ CONSTANT->{key} }cases. - Preserve behavior for ordinary package variables and other constant return types.
Environment
- PerlOnJava CPAN run:
20260914-160652-26153 - Distribution:
Geo-Coordinates-OSGB-2.20 - System Perl: full upstream suite passes
- Affected backends: JVM and interpreter
- Dominant language
- Perl
- Stars
- 64
- Forks
- 6
- Avg merge
- 5h 25m
- Merged PRs (30d)
- 157
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from fglock/PerlOnJava
-
area:cpan-port area:unicode bug
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
fglock/PerlOnJava#1341 ·
-
area:cpan-port bug
Difficulty 4/5 3-5 days Newbie friendliness 44/100
fglock/PerlOnJava#1459 ·
-
area:cpan-port bug
Difficulty 3/5 1-2 days Newbie friendliness 72/100
fglock/PerlOnJava#1457 ·
-
bug high-impact
Difficulty 3/5 1-2 days Newbie friendliness 67/100
fglock/PerlOnJava#1456 · 1 comment ·
-
bug
Difficulty 4/5 3-5 days Newbie friendliness 72/100
fglock/PerlOnJava#1455 ·
All issues in fglock/PerlOnJava
Similar issues
-
1.severity: security
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
api7/lua-resty-saml#63 ·
-
Difficulty 1/5 Under an hour Newbie friendliness 68/100
-
Difficulty 1/5 Under an hour Newbie friendliness 82/100
-
Difficulty 1/5 Under an hour Newbie friendliness 72/100