AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.01.2020, 23:06   #1  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
672 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
call stack parsing as condition for logic
столкнулся тут с необходимостью переписывать кучу стандартных классов, которые через private методы вызывают один public табличный метод, который я легко могу перекрыть. но! в этом методе отсутствует нужный мне аргумент, чтобы определять контекст. и пришла мне в голову шальная мысль, а что если анализировать call stack внутри этого табличного метода, вместо переписывания кучи классов?

X++:
...
        container myCallStack;
        int i;
        str whatToWrite;
        myCallStack = xSession::xppCallStack();
        for( i=1; i<=conlen(myCallStack); i++)
        {
            whatToWrite += conpeek(myCallStack, i);
        }

        if(callStackContainWhatINeed(whatToWrite))
        {
            doMyWhim();
        }
...
кто-нибудь делал такое? какие подводные камни?

с новым годом, кстати, всех, кто уже очнулся!
__________________
Felix nihil admirari
Старый 03.01.2020, 23:26   #2  
axm2017 is offline
axm2017
Участник
 
1,748 / 292 (13) ++++++
Регистрация: 15.05.2017
Не делал. По виду идеи какой то изврат и не очень понятно зачем так.
XppCallStack по виду в IL разве будет корректно работать?

С наступившим. Всех благ и здоровья вам +близким!
Старый 04.01.2020, 01:33   #3  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2922 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Ещё варианты:.

https://community.dynamics.com/365/f...hod-signatures
За это сообщение автора поблагодарили: gl00mie (5).
Старый 04.01.2020, 17:26   #4  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
672 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
нет, это не совсем то. моя проблема не в том, что я не могу перекрыть конечный метод - он как раз открыт всем ветрам, а в том, что не могу влезть во все вызывающие его private методы.

но считай, что "иронию судьбы" ты всё-таки посмотрел, потому что я опирался на твой собственный пример из этого топика

X++:
boolean isApplicableTo(AnyType _value)
    {
        #localMacro.runningUnitTestsClient
        '(C)\\Classes\\SysTestSuite\\run'
        #endmacro
        #localMacro.runningUnitTestsServer
        '(s)\\Classes\\SysTestSuite\\run'
        #endmacro
        container callStack;
        if (_value && typeOf(_value) == Types::Class)
        {
            callStack = xSession::xppCallStack();
            if (conFind(callStack, #runningUnitTestsClient) ||
                conFind(callStack, #runningUnitTestsServer))
            {
                return AOTResourceTemplateProviderTestHelper_RU::applicable();
            }
        }
        return false;
    }
__________________
Felix nihil admirari
Старый 04.01.2020, 17:27   #5  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
672 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от axm2017 Посмотреть сообщение
XppCallStack по виду в IL разве будет корректно работать?
поясни, плиз, что там может некорректно работать?
__________________
Felix nihil admirari
Старый 04.01.2020, 22:06   #6  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
699 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Была старая дискуссия на яммере о использовании CallContext и все были посланы использовать disposable context из блога выше. Мы его (disposable) частенько используем, работает как часы.
За это сообщение автора поблагодарили: Logger (3).
Старый 04.01.2020, 23:11   #7  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
672 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Так его же надо инициализировать как раз там, где у меня полный приват. То есть это не решение проблемы.

Мне не нужен дополнительный аргумент - мне как раз нужно его заполнять
__________________
Felix nihil admirari
Старый 04.01.2020, 23:18   #8  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
672 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от wojzeh Посмотреть сообщение
кто-нибудь делал такое?
ага! нашёл, кто такое делал! вот же оно!

Нажмите на изображение для увеличения
Название: MicrosoftTeams-image.png
Просмотров: 284
Размер:	182.9 Кб
ID:	12529
__________________
Felix nihil admirari
Старый 05.01.2020, 01:40   #9  
AlexSD is offline
AlexSD
Microsoft Dynamics
Сотрудники Microsoft Dynamics
 
257 / 302 (11) ++++++
Регистрация: 14.10.2003
+1 за disposable из блога. Тоже использую по мере надобности не только в кустомерских модификациях, но и для кода написанного для МСа. Code review этот подход проходит.
Старый 05.01.2020, 03:15   #10  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
672 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
интересно, и что будет, если таких контекстов будет определено несколько, например, через те же расширения в методе insert? throw error('nesting is not supported')?
__________________
Felix nihil admirari
Старый 05.01.2020, 03:26   #11  
AlexSD is offline
AlexSD
Microsoft Dynamics
Сотрудники Microsoft Dynamics
 
257 / 302 (11) ++++++
Регистрация: 14.10.2003
Цитата:
Сообщение от wojzeh Посмотреть сообщение
интересно, и что будет, если таких контекстов будет определено несколько, например, через те же расширения в методе insert? throw error('nesting is not supported')?
Если речь идет о разных контекстах, то ничего такого не будет. Код, который находится ниже по стеку вызовов, знает только о своем контексте. Если об одном и том же контексте, то небольшая доработка (MyContext parentContext позволяет иметь вложенные контексты. И тут уже в вашей воле реализовать необходимый функционал, типа, какой приоритет имеют поля в вашем контексте.
За это сообщение автора поблагодарили: wojzeh (5).
Старый 07.01.2020, 15:53   #12  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2922 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Парзинг стека приводит к тому, что вызываемый код начинает зависеть от вызывающего - если нужно будет второе место, из которого надо, определить то же поведение, придется в вызываемую функцию добавлять дополнительную логику.

И disposable context и парзинг стека не позволяет распознать ситуацию, когда чужой код вдруг стал вызывать ту же функцию на каком-то промежуточном уровне еще раз ожидая прежнего поведения.

Еще не знаю как Dyn365FO, а в Ax2012, ЕМНИП, xppCallstack не работал из IL - и там пришлось бы пользоваться System.Environmen::get_Stacktrace()

Последний раз редактировалось belugin; 07.01.2020 в 15:56.
За это сообщение автора поблагодарили: trud (3).
Старый 07.01.2020, 18:49   #13  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
672 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
как раз тот случай у меня, когда мне всё равно на другие случаи вызова моего кода, увы, праздник продолжался недолго.

столкнулся с другой проблемой: в стеке я вижу абстрактный класс, а не конкретный экземпляр дочернего класса...

Нажмите на изображение для увеличения
Название: callstack.png
Просмотров: 205
Размер:	216.0 Кб
ID:	12533
__________________
Felix nihil admirari
Старый 10.01.2020, 03:55   #14  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от wojzeh Посмотреть сообщение
Так его же надо инициализировать как раз там, где у меня полный приват.
Обычно в таких случаях пишется "обертка" для стандартного класса, которая где-то выше по стеку вызовов инициализирует disposable context, а ниже по стеку отрабатывают стандартные private или какие угодно методы, вызывающие нужный код, и этот нужный код "видит", что его вызывают в определенном контексте, если так можно выразиться. Мне кажется, стоит все же посмотреть в сторону disposable context, а анализ стека вызовов, по-моему, - тупиковая ветвь развития, так вы заставите свой вызываемый код, как уже отмечалось, слишком много знать про вызывающий. Потом добавят какие-нить lambda-функции, которые в стеке вызовов будут выглядеть иначе, - и всё у вас сломается.
За это сообщение автора поблагодарили: trud (1), wojzeh (3).
Старый 15.01.2020, 23:35   #15  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
396 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Кстати про парсинг стека: кто-нибудь в курсе, нужно ли использовать Code Access Permission, или в D365FO все эти "new ExecutePermission().assert()" стали чем-то вроде рудиментов тазовых костей у китов? Если не ошибаюсь, эта фича использовала стек?
Старый 16.01.2020, 06:46   #16  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2922 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Не нужно
За это сообщение автора поблагодарили: Stitch_MS (3).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: Finding the X++ call stack that caused a crash Blog bot DAX Blogs 2 14.01.2020 13:20
daxrunbase: Add call stack to InfoLog messages Blog bot DAX Blogs 0 05.08.2017 19:30
emeadaxsupport: Enabling the new Call Center Channel User Functionality in AX 2012 R3 Blog bot DAX Blogs 0 02.09.2014 18:11
bojensen: Stack trace: Invalid attempt to call WinAPI::findFirstFile running in CIL on the client. Blog bot DAX Blogs 0 21.07.2013 21:11
msdynamicsax: How to get the current call stack in X++ Blog bot DAX Blogs 0 16.01.2009 18:05
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:00.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.