parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Проблемы с контекстом или изменения в process в Parser 3.4.6

nkostya 24.11 18:28 / 24.11 18:28

Здравствуйте.

Все еще периодически пытаюсь свой фреймворк догнать до версии, совместимой с Parser 3.4.6.

Сейчас наткнулся на такую странность.

Ранее у меня был код, который делал примерно следующее:
Из шаблона вызывался ^render[...], а из метода ^render[...] вызывался ^_render[...]

Все это происходит внутри объекта, которые имеет свой "контекст".
И в методе ^_render[] - последний вызванный происходило сохранение ссылки на "контекст" вызова:

$self._context[$caller.caller.self] - так было в 3.4.4 и все работало

Обращение к переменным происходило через прокидывание GET_DEFAULT в "родительский контекст". Таким образом можно было получить доступ к локальным переменным, объявленным в шаблоне.

На версии 3.4.6 судя по всему эта логика поменялась. И по предварительным разборам получается что $caller.caller.self (проверка происходила обращением к переменной $caller.caller.self.var) - хранит ссылку не на "контекст вызова метода", а кажется что на сам "объект", где никаких локальных переменных из места вызова-то и нет.

Если обратиться к $caller.caller.var - переменная доступна.

Если в объявлении класса убрать @OPTIONS locals - переменная становится доступна через caller.caller.self

При этом "шаблон" комплириуется в Класс по запросу путем ^process[$CLASS]{...}

Получается что либо изменилась логика определения "контекста" по caller, либо компиляция метода через process теперь использует OPTIONS, заданные для класса, а ранее не использовал.
И нету опции в process чтобы как-то управлять эти поведением.

Есть ли в этом изменении специальный замысел?

Я больше склоняют к варианту, что изменилось поведение process. Поэтому было бы хорошо хотябы иметь возможность в process опцией добавить что-нибудь типа:
locals
- false = все переменные по-умолчанию не локальные
- true = все переменные по-умолчанию локальные
- без значения = наследуем от Класса, в который встроили