Согласен, что перекрывает, но здесь JSON::XS создан с методом
convert_blessed, который говорит, что переданный обхект должен иметь метод
TO_JSON. Объект модуля boolean имеет данный метод.

$  perl -MData::Printer -MCpanel::JSON::XS -Mboolean=-truth -E '$j =
Cpanel::JSON::XS->new->convert_blessed; $b = (0 == 1); say
$j->encode({false => $b}); p$b'
{"false":false}
boolean  {
      Parents       Exporter
      public methods (9) : boolean, false, import, isBoolean, isFalse,
isTrue, TO_JSON, true, truth
      private methods (1) : __ANON__
      internals: 0
}

$  perl -MData::Printer -MJSON::XS -Mboolean=-truth -E '$j =
JSON::XS->new->convert_blessed; $b = (0 == 1); say $j->encode({false =>
$b}); p $b'
Modification of a read-only value attempted at -e line 1.

Насколько я понял, эта ошибка связана с приведением к строке булевых
значений (Boolean stringify) в модуле boolean.

Данная ошибка была скорее всего исправлена в Cpanel::JSON::XS начиная с версии 2.3311 -
https://github.com/rurban/Cpanel-JSON-XS/commit/a42d7b7ec05c9aad18ba9b0ef12c721c31a47317

Victor Efimov <[email protected]> писал(а) в своём письме Fri, 28 Nov 2014
20:44:50 +0300:

28 ноября 2014 г., 18:41 пользователь TheAthlete <[email protected]> написал:
Неделя багов в JSON::XS! :)

Почему это баг JSON::XS ?

use strict; use warnings;
use Test::More tests => 3;
use boolean -truth;
use JSON::XS;
my $json = JSON::XS->new;
is($json->encode({"hey" => !!0}), 'abc',  'JSON false works');

тоже фейлится. если

use boolean -truth;

закоментировать, то работает норм.

Это потому что опция

-truth

You can specify the -truth option to override truth operators to
return boolean values.

use boolean -truth;
print ref("hello" eq "world"), "\n";


перекрывает операторы Perl, чтобы они возвращали объект. Почему
считается что JSON::XS должен с этим работать ? Почему это не баг в
"boolean" ?


Тоже столкнулся с багом в JSON::XS - при установке модуля boolean, который
в зависимостях у Test::DBIx::Class, не был пройден тест json.t.
Заглянув в issue данного модуля на github, нашел такой тикет:

json.t fails on many Linux systems -
https://github.com/ingydotnet/boolean-pm/issues/5

Там некоторые советуют установить Cpanel::JSON::XS - установил и все
заработало, хотя не у всех падает при установленном JSON::XS.

Если модифицировать тест:

use strict; use warnings;
use Test::More tests => 3;
use boolean -truth;
my $HAVE_JSON = eval { require JSON::MaybeXS };
SKIP: {
      skip "JSON is missing", 3 unless $HAVE_JSON;
      eval{
          my $json = JSON::MaybeXS->new->convert_blessed();
          is($json->encode({false => (0 == 1)}), '{"false":false}',
              'JSON false works');
        is($json->encode({true  => (1 == 1)}), '{"true":true}',
            'JSON true works');
        is(ref(boolean::TO_JSON(true)), 'SCALAR',
            'Make sure we can call boolean::TO_JSON($b)');
        }
};

в следующий:

use strict; use warnings;
use Test::More tests => 3;
use boolean -truth;
my $HAVE_JSON = eval { require JSON::XS };
SKIP: {
      skip "JSON is missing", 3 unless $HAVE_JSON;
      my $json = JSON::XS->new->convert_blessed();
      is($json->encode({false => (0 == 1)}), '{"false":false}',
        'JSON false works');
      is($json->encode({true  => (1 == 1)}), '{"true":true}',
        'JSON true works');
      is(ref(boolean::TO_JSON(true)), 'SCALAR',
        'Make sure we can call boolean::TO_JSON($b)');
};

и запустить, то тест сваливается с ошибкой "Modification of a read-only
value attempted at test/json.t line 9"

Если заменить на Cpanel::JSON::XS или JSON::PP, то все ок

Вадим Власов <[email protected]> писал(а) в своём письме Wed, 26 Nov
2014 20:01:33 +0300:

Исследуя новый сериализатор в JSON::XS наткнулся:

$ echo 'use strict;
use warnings;
use feature "say";

use JSON::XS;
my $j=JSON::XS->new->allow_tags;

say "JSON::XS: $JSON::XS::VERSION";
say "Types::Serialiser: $Types::Serialiser::VERSION";

my $t = $j->encode( Foo->new );
say $t;

my @t = $j->encode( Foo->new );

package Foo;
sub new { bless {}, $_[0]; }
sub FREEZE { ( 123, 456 ); }' | perl
*JSON::XS: 3.01*
*Types::Serialiser: 1.0*
*("Foo")[123,456]*
*panic: attempt to copy freed scalar c37a18 to c37a00 at - line 14.*

$ perl -MJSON::XS -wE 'say JSON::XS->new->allow_tags->encode( bless {},
Foo
); package Foo; sub FREEZE{ return 123 }'
*Use of uninitialized value in say at -e line 1.*
*("Foo")[123]*

$ perl -MJSON::XS -wE 'say scalar( JSON::XS->new->allow_tags->encode(
bless
{}, Foo )); package Foo; sub FREEZE{ return 123 }'
*("Foo")[123]*

Проверили на разных машинах и на разных версиях perl-а - одно и то же.



--
Написано в почтовом клиенте браузера Opera: http://www.opera.com/mail/

--
Moscow.pm mailing list
[email protected] | http://moscow.pm.org


--
Написано в почтовом клиенте браузера Opera: http://www.opera.com/mail/
--
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить