View Issue Details

IDProjectCategoryView StatusLast Update
0000621Far Manager 1.7xMacropublic2008-11-06 10:29
ReporterHaRTAssigned Tovskirdin 
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionfixed 
Product Version1.71 
Target VersionFixed in Version1.71 
Summary0000621: Макрос из плагина не отрабатывает, если тот вызван через функцию eval
DescriptionNikolay писал(а):
Технически говоря, AdvControl с ACTL_KEYMACRO + MCMD_POSTMACROSTRING хотя и возвращает УСПЕХ, но не отрабатывает совсем, если вызов плагина произошёл через макрофункцию eval.
Steps To Reproduce0. Установлен и загружен плагин AltHistory 2.1.0; горячая клавиша - '@'.

Все последующие пункты подразумевают, что история вызвана из какого-нибудь стандартного диалога (например, доступного по ShiftF4).

1. Назначаю в диалогах такие макросы:
AltF11: $If ( %%AltHistoryDialogActive == 1 ) $AKey $Else F11 @ 2 $End
AltF12: $If ( %%AltHistoryDialogActive == 1 ) $AKey $Else F11 @ 3 $End
AltF8 : $If ( %%AltHistoryDialogActive == 1 ) $AKey $Else F11 @ 1 4 $End
Всё работает, как ожидалось, - из Истории можно переключаться в другие Истории с сохранением введённого фильтра.

2. Обрамляю каждый макрос в eval:
AltF11: eval ( "$If ( %%AltHistoryDialogActive == 1 ) $AKey $Else F11 @ 2 $End" )
AltF12: eval ( "$If ( %%AltHistoryDialogActive == 1 ) $AKey $Else F11 @ 3 $End" )
AltF8 : eval ( "$If ( %%AltHistoryDialogActive == 1 ) $AKey $Else F11 @ 1 4 $End" )
Переключение между Историями уже НЕ работает,

3. Если вызываю Историю по AltF12 и там нажимаю Ctrl. AltF11 Ctrl. Esc, то после этого переключение между Историями начинает работать (пока не закроешь Историю).
Additional Informationhttp://forum.farmanager.com/viewtopic.php?p=36045#p36045
TagsNo tags attached.
Build2446

Activities

vskirdin

2008-10-22 15:27

administrator   bugnote:0001885

На сколько я могу понять, переменную %%AltHistoryDialogActive выставляет плагин, так?
Это к тому, что если, например, Alt-F12 сделать без eval и ее вызвать первой, то дальше все работает нормально, иначе как ты и описал.
Видимо... ФАР где-то "глотает" %%AltHistoryDialogActive
(это мои домыслы :-))

HaRT

2008-10-22 15:29

reporter   bugnote:0001886

> переменную %%AltHistoryDialogActive выставляет плагин, так?
> Alt-F12 сделать без eval и ее вызвать первой, то дальше все работает нормально
Да и да.

vskirdin

2008-10-23 11:27

administrator   bugnote:0001887

Что-то я ума не дам как проблему решить.

Проблема в том, что %%AltHistoryDialogActive плагин выставляет в сеансе eval`а... Но потом происходит зачистка окружения и... в общем долгая история.
Ее решать надо... - долго думать и все такое 8-)

Кстати, первый вызов макроса без eval переменную выставляет, а последующие вызовы (с eval) только паразитируют на этом значении, херя в конце своей работы (когда из eval вышли) байткод для строки плагина "%%AltHistoryDialogActive=1;" (и, соответсвтенно, не выставляя эту переменную).

Пока могу предложить воркэраунд: ввести в строй MCMD_SETVAR, MCMD_GETVAR, MCMD_SETCONST, MCMD_GETCONST и соответствующую им структуру (в составе ActlKeyMacro):
    struct {
      const char *Name;
      union {
        const char *s;
        __int64 i;
      } Value;
    } MacroValue;
Эти команды позволят плагину манипулировать значениями из глобальных таблиц констант (макроконстанты неизменяемы только из макроса...) и переменных, минуя макро-очереди.

ы?

vskirdin

2008-10-23 11:29

administrator   bugnote:0001888

> AdvControl с ACTL_KEYMACRO + MCMD_POSTMACROSTRING хотя и возвращает УСПЕХ
Естественно AdvControl вернет успех - компиляция в байткод и помещение кода в рабочую область прошла успешно. Дело в другом (выше).

HaRT

2008-10-23 11:32

reporter   bugnote:0001889

Есть надежда, что проблема потеряет свою актуальность в ближайших версиях плагина AltHistory. Если не потеряет, тогда можно будет к ней вернуться.

vskirdin

2008-10-23 11:39

administrator   bugnote:0001890

Не в надежде дело а в реальном баге. AltHistory - это первая ласточка. Не все же будут переделывать свои плагины...

vskirdin

2008-10-23 13:19

administrator   bugnote:0001891

Кхе... оказалось все очень просто :-)
1. запускается макрос, код помещается в рабочую зону
2. срабатывает eval, делает новое рабочее окружение (push) и помещает новый код
3. доходит дело до плагина - добавляется новый код "%%AltHistoryDialogActive=1;" в туже зону
4. помещенный eval`ом код говорит "end" и происходит восстановление (pop) предыдущей рабочей зоны, несмотря на то, что в текущей зоне еще остался макрокод от плагина.
5. завершается основной код и...
...и все.

В общем не стояла проверка для п.4, т.е. теперь смотрим, что если что-то в рабочей зоне осталось, то не делаем pop, а пытаемся завершить все дела в этой текущей зоне.

проверям - http://ifolder.ru/8711009
проверять желательно _все_ макросы, особенно юзающие eval.

vskirdin

2008-10-24 10:16

administrator   bugnote:0001892

работает тестовый билд? решением ставим?

HaRT

2008-10-24 15:18

reporter   bugnote:0001894

Last edited: 2008-10-24 15:19

> работает тестовый билд?
Каких-то видимых поломок пока не замечено.
С формальным одобрением подожду до того момента, когда эти изменения войдут в публичную сборку.

sdindikov

2008-10-25 11:38

developer   bugnote:0001896

у меня тоже всё ok

vskirdin

2008-10-27 04:43

administrator   bugnote:0001899

после 576/2446

HaRT

2008-11-06 07:56

reporter   bugnote:0001932

Проверено на сборке 2449

Issue History

Date Modified Username Field Change
2008-10-22 07:34 HaRT New Issue
2008-10-22 07:34 HaRT Status new => assigned
2008-10-22 07:34 HaRT Assigned To => vskirdin
2008-10-22 15:27 vskirdin Note Added: 0001885
2008-10-22 15:29 HaRT Note Added: 0001886
2008-10-23 11:27 vskirdin Note Added: 0001887
2008-10-23 11:29 vskirdin Note Added: 0001888
2008-10-23 11:32 HaRT Note Added: 0001889
2008-10-23 11:39 vskirdin Note Added: 0001890
2008-10-23 13:19 vskirdin Note Added: 0001891
2008-10-24 10:16 vskirdin Note Added: 0001892
2008-10-24 10:16 vskirdin Status assigned => feedback
2008-10-24 15:18 HaRT Note Added: 0001894
2008-10-24 15:19 HaRT Note Edited: 0001894
2008-10-25 11:38 sdindikov Note Added: 0001896
2008-10-27 04:43 vskirdin Note Added: 0001899
2008-11-06 07:56 HaRT Status feedback => resolved
2008-11-06 07:56 HaRT Resolution open => fixed
2008-11-06 07:56 HaRT Note Added: 0001932
2008-11-06 10:29 vskirdin Build => 2446
2008-11-06 10:29 vskirdin Status resolved => closed
2008-11-06 10:29 vskirdin Fixed in Version => 1.71