Описание
Модуль с директивой #native, содержащий оператор ВызватьСобытие, не компилируется:
процесс падает с Stack overflow из-за бесконечной рекурсии в
OneScript.Native.Compiler.ExpressionHelpers.ConvertToType.
Падение происходит на этапе компиляции, целиком убивает процесс и не перехватывается
Попытка/Исключение.
Воспроизведение
Классы/МинимальныйПример.os:
#native
Процедура Стрельнуть() Экспорт
ВызватьСобытие("Событие", Новый Массив());
КонецПроцедуры
Процедура Событие() Экспорт
КонецПроцедуры
Процедура ПриСозданииОбъекта()
КонецПроцедуры
запуск.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
ФабрикаЖелудей — центральный класс создания компонентов, то есть именно тот, который
выиграл бы от нативной компиляции больше всего
Описание
Модуль с директивой
#native, содержащий операторВызватьСобытие, не компилируется:процесс падает с
Stack overflowиз-за бесконечной рекурсии вOneScript.Native.Compiler.ExpressionHelpers.ConvertToType.Падение происходит на этапе компиляции, целиком убивает процесс и не перехватывается
Попытка/Исключение.Воспроизведение
Классы/МинимальныйПример.os:запуск.os:Фактическое поведение
Достаточно самого наличия
ВызватьСобытиев модуле: метод даже не обязательно вызывать,падение происходит при компиляции модуля.
Ожидаемое поведение
Модуль компилируется и событие работает так же, как в стековом режиме. Если вызов
события из native не поддерживается — нужна внятная ошибка компиляции вместо падения
процесса.
Окружение
Воспроизводится одинаково на:
Влияние
Обхода на уровне языка нет: событие принадлежит самому объекту, делегировать
ВызватьСобытиедругому классу нельзя. Любой класс-источник событий обязан оставатьсястековым.
В autumn из-за этого не переводится на
#nativeФабрикаЖелудей— центральный класс создания компонентов, то есть именно тот, которыйвыиграл бы от нативной компиляции больше всего