JSON::XS::BooleanオブジェクトをData::Cloneしようとすると死ぬ

表題のとおり。以下のバージョンで確認。

  • perl 5.14.2
  • Data::Clone 0.003
  • JSON::XS 2.33
  • JSON::PP 2.27200

rt.CPANhttps://rt.cpan.org/Ticket/Display.html?id=82584

以下のようなテストをやってみると、

use strict;
use warnings;
use JSON::XS ();
use JSON::PP ();
use Data::Clone;
use Test::More;
use Test::Exception;

foreach my $class (qw(JSON::PP JSON::XS)) {
    my ($true, $false) = eval qq{ (${class}::true, ${class}::false) };
    my $clone_true;
    lives_ok { $clone_true = clone($true) } "${class}::true: clone OK";
    ok($clone_true, "${class}::true is true");
    my $clone_false;
    lives_ok { $clone_false = clone($false) } "${class}::false: clone OK";
    ok(!$clone_false, "${class}::false is false");
}

done_testing();

結果はこうなった。

ok 1 - JSON::PP::true: clone OK
ok 2 - JSON::PP::true is true
ok 3 - JSON::PP::false: clone OK
ok 4 - JSON::PP::false is false
not ok 5 - JSON::XS::true: clone OK
#   Failed test 'JSON::XS::true: clone OK'
#   at clone_json.pl line 12.
# died: Modification of a read-only value attempted at clone_json.pl line 12.
not ok 6 - JSON::XS::true is true
#   Failed test 'JSON::XS::true is true'
#   at clone_json.pl line 13.
not ok 7 - JSON::XS::false: clone OK
#   Failed test 'JSON::XS::false: clone OK'
#   at clone_json.pl line 15.
# died: Modification of a read-only value attempted at clone_json.pl line 15.
ok 8 - JSON::XS::false is false
1..8
# Looks like you failed 3 tests of 8.

JSON::PPは平気なんだけど、JSON::XSはダメ。不思議。JSON::XSのせいなのかな?

JSONからデコードしたオブジェクトをクローンしようとしたらいきなり死んだので焦った。何が起こってるんだろう?

あ、ちなみにData::Cloneでclone()メソッドのないオブジェクトをクローンする場合はshallow copyになるらしいけど、ここではそれを承知で使ってみている。(JSON::**::Booleanはどうせ擬似的に普通のスカラとして扱われるオブジェクトだし)