JSON boolean sentinel $JSON::true becomes undef on both backends
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 55/100
Research direction
Start with the JSON/JSON::PP loading and package-variable handling paths, using t/children.t tests 8-9 and the minimal reproducer as the behavioral reference. Compare results under system Perl, the JVM backend, and the interpreter. Done means $JSON::true and $JSON::false retain standard values and decoded booleans compare correctly, with a permanent project-owned regression test.
Written by the indexing model from the issue text.
Description
Summary
PerlOnJava mishandles the package variable $JSON::true when a JSON boolean is
decoded. The decoded value is a JSON::PP::Boolean, but $JSON::true becomes
undef in both execution backends. This breaks standard Perl identity/equality
semantics and causes upstream CPAN tests to fail.
CPAN evidence
- Distribution:
Net-Google-Drive-Simplev3.02 - CPAN run:
20260915-125610-17469 - Failure record:
FAIL Net::Google::Drive::Simple Net::Google::Drive::Simple - Failing test:
t/children.t, tests 8-9 - PerlOnJava result: 93/95 assertions pass; 2 fail in 1/12 test programs
- System Perl: the equivalent JSON boolean comparison passes
- Environment: pure-Perl target distribution; no target XS/native code
- Backends: reproduced on both the JVM backend and the interpreter
The failing upstream assertion is:
ok $JSON::true;
is $first_file->copyable, $JSON::true, "copyable is true";
The first assertion fails because $JSON::true is false/undefined. The second
reports an actual JSON::PP::Boolean object but an expected undef value.
Minimal reproducer
use JSON;
use Test2::V0;
my $json = JSON->new;
my $value = $json->decode('{"copyable":true}');
ok $JSON::true;
is $value->{copyable}, $JSON::true, 'JSON true';
done_testing;
Expected under standard Perl:
ok 1
ok 2 - JSON true
1..2
Observed on both PerlOnJava backends:
not ok 1
not ok 2 - JSON true
GOT: JSON::PP::Boolean=SCALAR(...)
CHECK: undef
1..2
Impact
Code using JSON's documented boolean sentinels can incorrectly treat true as
false or undefined. This affects API clients, configuration readers, feature
flags, permission checks, and any CPAN module that compares decoded JSON
booleans with $JSON::true or $JSON::false. In this distribution it causes
the copyable property of a decoded Google Drive item to be reported
incorrectly by its test suite.
Likely ownership
The failure is not caused by Net::Google::Drive::Simple: the same JSON
boolean semantics pass under system Perl, and the distribution's other 11 test
programs pass on PerlOnJava. The behavior points to package-variable handling
or JSON boolean initialization/runtime state in PerlOnJava. It is shared by
the JVM and interpreter backends.
Expected fix
Preserve the standard Perl behavior of $JSON::true and $JSON::false after
loading JSON/JSON::PP, including comparisons against decoded boolean
values. Add a permanent project-owned regression test for the reproducer and
run it under system Perl, the JVM backend, and the interpreter backend.
Deduplication
I searched all GitHub issues for JSON::true, JSON::PP::Boolean,
package variable undef boolean, and Net::Google::Drive::Simple.
- No existing issue directly covers this
$JSON::true/JSON boolean failure. - #1352 concerns incorrect
IOK/NOKflags for large floating-point values;
it is adjacent scalar-typing work but has a different reproducer and impact. - #1260, #1262, and #1308 concern other scalar typing or dual-value cases and
do not cover JSON boolean package variables.
This issue is therefore not a duplicate.
- Dominant language
- Perl
- Stars
- 64
- Forks
- 6
- Avg merge
- 5h 11m
- Merged PRs (30d)
- 168
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:backend area:runtime enhancement
Difficulty 4/5 3-5 days Newbie friendliness 45/100
fglock/PerlOnJava#1494 ·
-
area:backend area:runtime enhancement
Difficulty 4/5 3-5 days Newbie friendliness 45/100
fglock/PerlOnJava#1492 ·
-
area:parser bug
Difficulty 3/5 1-2 days Newbie friendliness 65/100
fglock/PerlOnJava#1491 ·
-
Difficulty 4/5 3-5 days Newbie friendliness 45/100
fglock/PerlOnJava#1487 ·
All issues in fglock/PerlOnJava
Similar issues
-
documentation Needs Triage
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
trizen/youtube-viewer#456 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
-
connectivity Open
Difficulty 1/5 Under an hour Newbie friendliness 80/100
-
Common US ingredient names are not recognized, so about 12.4k US products miss an allergen warning Open
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
openfoodfacts/openfoodfacts-server#14657 · 4 comments ·