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

TheAthlete theathlet на yandex.ru
Пт Ноя 28 07:41:11 PST 2014


Неделя багов в JSON::XS! :)
Тоже столкнулся с багом в 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