OberonCore https://forum.oberoncore.ru/ |
|
Модуль и название процедуры из значения проц. переменной https://forum.oberoncore.ru/viewtopic.php?f=1&t=6097 |
Страница 1 из 1 |
Автор: | Иван Денисов [ Суббота, 12 Август, 2017 08:49 ] |
Заголовок сообщения: | Модуль и название процедуры из значения проц. переменной |
Очень нужно решить следующую проблему. При передаче инструкции параллельно работающему блэкбоксу требуется передать, какую процедуру ему необходимо выполнить для обработки данных. В виде строки я научился передавать и запускать с помощью Meta: https://gitlab.molpit.org/idenisov/Robu ... /Demo4.odc Код: ... Meta.LookupPath(c.pName, item); IF (item.obj = Meta.procObj) OR (item.obj = Meta.varObj) & (item.typ = Meta.procTyp) THEN item.GetVal(item0, ok); IF ok THEN c.p := item0.p END END ... Но как получить эту строку вида Модуль.Процедура, имея только процедурную переменную? |
Автор: | Пётр Кушнир [ Суббота, 12 Август, 2017 13:09 ] |
Заголовок сообщения: | Re: Модуль и название процедуры из значения проц. переменной |
Как-то возился с поиском адреса метода (тоже процедура), это не конкретное решение, но можно посмотреть куски кода viewtopic.php?f=127&t=4940&hilit=+%D0%BC%D0%B5%D1%82%D0%BE%D0%B4 вкратце, у каждого модуля есть список процедур, они в дескрипторе лежат, и адрес тела этой процедуры в памяти. Любая процедурная переменная тоже хранит этот адрес процедуры, можно пробежаться и сравнить. Модули как объекты разложенные в связный список, как они есть в памяти, лежат в Kernel.root кажется, не могу сейчас посмотреть точнее. |
Автор: | Иван Денисов [ Суббота, 12 Август, 2017 20:53 ] |
Заголовок сообщения: | Re: Модуль и название процедуры из значения проц. переменной |
Спасибо, Пётр, поглядел твои эксперименты. И потом еще DevDebug поизучал более настойчиво. Придумал решение: Код: c.pName := ""; (* получаем имя процедуры *) Kernel.SearchProcVar(SYSTEM.VAL(INTEGER, c.p), mod, adr); (* c.p = процедурная переменная *) IF mod # NIL THEN IF mod.refcnt >= 0 THEN ref := mod.refs; REPEAT Kernel.GetRefProc(ref, n, procName); UNTIL (n = 0) OR (n > adr); IF n > 0 THEN Kernel.GetModName(mod, modName); Strings.Utf8ToString(procName, name, res); (* записываем полное имя процедуры для передачи другому Блэкбоксу *) c.pName := modName + "." + name (* <===== результат *) END ELSE Log.String("module unloaded"); Log.Ln END; END; Файл с примером обновил тоже в хранилище. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |