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

TheAthlete theathlet на yandex.ru
Пт Ноя 28 23:42:05 PST 2014


Согласен, что перекрывает, но здесь 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 <victor на vsespb.ru> писал(а) в своём письме Fri, 28 Nov 2014
20:44:50 +0300:

> 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


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


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