Показать сообщение отдельно
Старый 25.03.2018, 19:59   #34  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,874 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Интересно, что поведение ядра изменилось при передаче параметров.
Раньше оно не приводило типы (и даже ошибочно написанный X++ код мог корректно срабатывать), а теперь приводит типы и код который работал раньше - теперь не работает.

Опасно, где это еще вылезет.

Для иллюстрации набросал джобик
X++:
static void Job3015(Args _args)
{
    DictEnum    dictEnum;
    anytype     a;
    
    boolean test(boolean _parm)
    {
        ;
        
        dictEnum = new DictEnum(DictEnum::value2id(_parm));
        info(strfmt("%1; %2; %3; %4",
            typeOf(_parm),
            any2int(_parm),
            DictEnum::value2id(_parm),
            dictEnum ? dictEnum.name() : '-'
            ));

        return 3;
    }
    ;
    
    a = test(3);
    dictEnum = new DictEnum(DictEnum::value2id(a));
    info(strfmt("%1; %2; %3; %4",
        typeOf(a),
        any2int(a),
        DictEnum::value2id(a),
        dictEnum ? dictEnum.name() : '-'
        ));
    info("");
}
В новом билде (как минимум после 1600.2967) джобик выведет
Цитата:
Enum; 1; 61440; boolean
Enum; 1; 0; -
первая строка соответствует преобразованию типов при передаче параметров в метод, а вторая - при возвращении результатов.

В старом билде (RU8) результат такой:
Цитата:
Enum; 3; 61440; boolean
Enum; 1; 0; -
т.е. значение не приводилось к нужному типу и баг в X++ коде не проявлялся.

P.S. Но конечно радует, что это не баг ядра как думали в начале, а всего лишь кривой X++ код.

Последний раз редактировалось Logger; 25.03.2018 в 20:07.
За это сообщение автора поблагодарили: gl00mie (3).