[Moscow.pm] Баг в JSON::XS?

Victor Efimov victor на vsespb.ru
Пт Ноя 28 09:44:50 PST 2014


28 ноября 2014 г., 18:41 пользователь TheAthlete <theathlet на yandex.ru> написал:
> Неделя багов в 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, то все ок
>
> Вадим Власов <scripter.vrn на gmail.com> писал(а) в своём письме 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
> moscow-pm на pm.org | http://moscow.pm.org


Подробная информация о списке рассылки Moscow-pm