Repository navigation
Description
Описание
Модуль с директивой #native, содержащий оператор ВызватьСобытие, не компилируется:
процесс падает с Stack overflow из-за бесконечной рекурсии в
OneScript.Native.Compiler.ExpressionHelpers.ConvertToType.
Падение происходит на этапе компиляции, целиком убивает процесс и не перехватывается
Попытка/Исключение.
Воспроизведение
Классы/МинимальныйПример.os:
#native
Процедура Стрельнуть() Экспорт
ВызватьСобытие("Событие", Новый Массив());
КонецПроцедуры
Процедура Событие() Экспорт
КонецПроцедуры
Процедура ПриСозданииОбъекта()
КонецПроцедурызапуск.os:
#Использовать "."
Объект = Новый МинимальныйПример();oscript запуск.os
Фактическое поведение
Stack overflow.
at System.Linq.Expressions.Expression.Convert(System.Linq.Expressions.Expression, System.Type, System.Reflection.MethodInfo)
at OneScript.Native.Compiler.ExpressionHelpers.TryFindConversionOp(System.Linq.Expressions.Expression, System.Type)
at OneScript.Native.Compiler.ExpressionHelpers.ConvertToType(System.Linq.Expressions.Expression, System.Type)
at OneScript.Native.Compiler.ExpressionHelpers.ConvertToType(System.Linq.Expressions.Expression, System.Type)
at OneScript.Native.Compiler.ExpressionHelpers.ConvertToType(System.Linq.Expressions.Expression, System.Type)
... (рекурсия ConvertToType до переполнения стека)
Достаточно самого наличия ВызватьСобытие в модуле: метод даже не обязательно вызывать,
падение происходит при компиляции модуля.
Ожидаемое поведение
Модуль компилируется и событие работает так же, как в стековом режиме. Если вызов
события из native не поддерживается — нужна внятная ошибка компиляции вместо падения
процесса.
Окружение
Воспроизводится одинаково на:
- 2.2.0, linux-x64
- 2.3.0-dev+6 (ночная сборка), linux-x64
Влияние
Обхода на уровне языка нет: событие принадлежит самому объекту, делегировать
ВызватьСобытие другому классу нельзя. Любой класс-источник событий обязан оставаться
стековым.
В autumn из-за этого не переводится на #native
ФабрикаЖелудей — центральный класс создания компонентов, то есть именно тот, который
выиграл бы от нативной компиляции больше всего
Activity