-
Notifications
You must be signed in to change notification settings - Fork 107
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Ошибка при рефлексии свойств у загруженного с контекстом сценария #1424
Comments
/CC @EvilBeaver @Mr-Rm |
Кажется, таких извращений рефлектор не предусматривает by design. Ну т.е. примерно понятно где ошибка, такое просто не предусмотрели. |
Дык в 1.8 работало, в 1.9 сломалось |
Даже так? Спасибо, посмотрю (но не знаю когда) |
Падает на
Сломалось в 1.8.1 |
К @Absolemus по PR #1242 |
Что-то я не помню, чтобы переданный контекст когда-то отдавался рефлектором (и не думаю, что должен). Это же просто символы, доступные для обращения, как имя модуля. |
По описанию метода "ЗагрузитьСценарий", да и фактически, передаваемый контекст - это полноценный набор глобальных переменных, экспортируемых в вызывающий модуль: Контекст = Новый Структура("Арг", 1);
ЗагрузитьСценарийИзСтроки("Арг=2;", Контекст);
Сообщить("Арг="+Контекст.Арг); Арг=2 И это несмотря на возникающую ошибку: |
По задумке - должен. Контекст это внешние видимые части объекта, как реквизиты в модуле документа, например. |
А это разве не "глобальный контекст" типа как "АргументыКоманднойСтроки" ? |
Передаваемый контекст перекрывает глобальный: Контекст = Новый Структура("АргументыКоманднойСтроки", "Перекрыто!");
ЗагрузитьСценарийИзСтроки("Cообщить(АргументыКоманднойСтроки)", Контекст); Перекрыто! То же для , например Контекст = Новый Структура("ЭтотОбъект", "Перекрыто!");
ЗагрузитьСценарийИзСтроки("Cообщить(ЭтотОбъект)", Контекст); {Модуль C:_lab\OneScript\OsReflectorBug\test.os / Ошибка в строке: 2 / Внешнее исключение (System.InvalidOperationException): Symbol already defined in the scope (ЭтотОбъект)} Замеченный выше баг со "Свойство недоступно для записи" воспроизвести не удалось. Значит, переданные через контекст свойства - всё же строго r/o (так ли задумывалось?) |
Странное с Рефлектором: Ст = Новый Структура("Поле1, Поле2", -1, -2);
ТСв=Рефлектор.ПолучитьТаблицуСвойств(Ст);
Сообщить("Т0:"+ТСв.Количество());
ТСв=Рефлектор.ПолучитьТаблицуСвойств(Ст, Истина); // <--
Сообщить("Т1:"+ТСв.Количество()); Т0:2 |
Нет. Передаваемый контекст доступен только для чтения, так и задумано. С перекрытием то же самое, перекрывать должен, как перекрывает Перем в методе |
Сейчас получается, что Это для v1. В v2 всё реализовано и работает по-другому, в т. ч. "System.NotImplementedException" в ряде случаев |
@nixel2007 @sfaqer вы основные клиенты рефлектора, подскажите, как правильно? Я полагал, что "все, включая приватные" |
@Mr-Rm там ужас что и давно бы пора навести там порядок со свойствами, полями, экспортными неэкспортными и тем, что выставляется в контекст. |
Полагаю так же, "все включая приватные", ей богу я был уверен что оно так и работает. |
Оно даже тестами вроде как покрыто.... |
Тесты покрывают не все типы объектов, а сосредоточены, в основном, на Сценариях - там всё работает. |
Отмечу здесь Ст = Новый Структура("Поле1, Поле2", -1, -2);
ТСв=Рефлектор.ПолучитьТаблицуСвойств(Ст);
Сообщить("КСт="+ТСв.Количество()); В v1 КСт=2, v2 падает с NotImplemented ФСт = Новый ФиксированнаяСтруктура("Поле1, Поле2", -1, -2);
ТСв=Рефлектор.ПолучитьТаблицуСвойств(ФСт);
Сообщить("КФСт="+ТСв.Количество()); Обе версии показывают КФСт=0, всегда. Причина - у |
Я от флага "включая приватные" ожидаю, что будут возвращены все, включая приватные :) |
Опишите ошибку
В случае если в сценарий, который был загружен через ЗагрузитьСценарий() с передачей во втором параметре контекст, попробую себе отрефлексировать таблицу свойств через ЭтотОбъект, будет получена ошибка:
Воспроизведение ошибки
Ожидаемое поведение
В ошибку не падает
Окружение
Дополнительная информация
OsReflectorBug.zip
The text was updated successfully, but these errors were encountered: