Skip to content

native: ВызватьСобытие роняет компилятор (Stack overflow) #1737

Description

@nixel2007

Описание

Модуль с директивой #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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    nativeКомпиляция в CLR в движке 2.0

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions