OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 29 Сентябрь, 2023 16:31

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 440 ]  На страницу Пред.  1 ... 18, 19, 20, 21, 22  След.
Автор Сообщение
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Четверг, 03 Август, 2023 13:00 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1105
ещё настойчиво рекомендую в `HandleTrap()` сделать примерно вот так:
Код:
   PROCEDURE GetSigILLVal (pc: ADDRESS): INTEGER;
   VAR err, val: INTEGER;
   BEGIN
      err := 202; val := 0;
      IF platform.p.IsReadable(pc, pc + 4) THEN
         S.GET(pc, val);
         IF val MOD 100H = 8DH THEN   (* lea reg,reg *)
            IF val DIV 100H MOD 100H = 0F0H THEN
               err := val DIV 10000H MOD 100H   (* trap *)
            ELSIF val DIV 1000H MOD 10H = 0EH THEN
               err := 128 + val DIV 100H MOD 10H   (* run time error *)
            END
         END
      END;
      RETURN err
   END GetSigILLVal;

   (* check if we are inside a Kernel/HostKernel, or OS libraries *)
   PROCEDURE CheckPC (pc: ADDRESS): INTEGER;
   VAR
      res: INTEGER;
      mod: Kernel.Module;
   BEGIN
      mod := Kernel.modList;
      WHILE (mod # NIL) & ((pc < mod.code) OR (pc >= mod.code + mod.csize)) DO
         mod := mod.next
      END;
      IF mod # NIL THEN
         IF (mod.name = "Kernel") OR (mod.name = "HostKernel") THEN res := pcInKernel
         ELSE res := pcInModule
         END
      ELSE pc := pcInOSLibs
      END;
      RETURN res
   END CheckPC;

   PROCEDURE [cdecl] HandleTrap (sig: INTEGER; siginfo: Libc.Ptrsiginfo_t; context: Libc.Ptrucontext_t);
   VAR
      inSignalStack: BOOLEAN;
      oldpc, oldfp: ADDRESS;
      pcpos: INTEGER;
   BEGIN
      pcpos := CheckPC(context.uc_mcontext.gregs[14]); (* pc *)
      IF sig = Libc.SIGINT THEN
         (* ignore Ctrl+C if we are in some unsafe to break code *)
         IF pcpos # pcInModule THEN
            RETURN
         END;
      ELSE
         (* if we trapped inside a kernel, panic and exit, this should not happen!
            if we will not panic, recursive traps may occur.
            FIXME! *)
         IF pcpos = pcInKernel THEN
            (* FIXME: this is dangerous; i should find another way to allow asserts/halts in kernel! *)
            CASE sig OF
            | Libc.SIGILL:   (* this is either HALT or runtime error *)
               pcpos := GetSigILLVal(context.uc_mcontext.gregs[14]);
               IF pcpos >= 128 THEN   (* runtime error *)
                  log.String("FATAL: runtime error"):Int(pcpos - 128):
                     String(" in Kernel, PC="):Adr(oldpc):String(". Aborting immediately."):Ln;
                  Libc.exit(2)
               END
            | Libc.SIGSEGV:
               log.String("FATAL: segmentation fault in Kernel, PC="):Adr(oldpc):String(". Aborting immediately."):Ln;
               Libc.exit(2)
            ELSE END CASE
         END
      END;

      sp := context.uc_mcontext.gregs[7]; (* stack pointer *)
      fp := context.uc_mcontext.gregs[6]; (* frame pointer *)
      …и так далее…

ну, вы поняли идею. делать ^C в ядре нельзя, потому что мы можем быть посреди процесса сборки мусора, и в итоге память окажется порубаной в лапшу. виндоядро имеет такую охрану, а позикс-ядра нет, и в итоге в позиксах ^C — русская рулетка.

в общем, сделайте что-то по мотивам этого кода у себя.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Пятница, 04 Август, 2023 10:32 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3732
Пакет в Debian репозитории обновил.

Этот тест оказывается уже добавили в подситему Check. Модуль CheckKernel2.

Проверил ещё на OpenBSD и FreeBSD — работает исправление корректно.

Заодно починил в OpenBSD и FreeBSD переустановку сигналов для буфера обмена.

Внёс также (мы обсуждали в чате), чтобы для новичков поиск по справке F1 был без учёта регистра, а то не могут найти какие-то полезные вещи, так как галочка Ignore case не совсем очевидна.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Пятница, 04 Август, 2023 17:12 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1105
возьмите уже у меня нормальные регулярки. ;-) код там, конечно, адский жоп — зато работает. я TextCmds под регулярки адаптировал, удобно. в замене вдобавок есть приятные фичи типа «преобразовать в верхний/нижний регистр», «capitalise», и прочая. надо бы ещё вызов команды добавить — в смысле, вызывать команду для обработки subexpressions в заменяторе. положительно не понимаю, как вы без регулярок живёте.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Вторник, 08 Август, 2023 00:43 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3732
arisu писал(а):
возьмите уже у меня нормальные регулярки. ;-) код там, конечно, адский жоп — зато работает. я TextCmds под регулярки адаптировал, удобно. в замене вдобавок есть приятные фичи типа «преобразовать в верхний/нижний регистр», «capitalise», и прочая. надо бы ещё вызов команды добавить — в смысле, вызывать команду для обработки subexpressions в заменяторе. положительно не понимаю, как вы без регулярок живёте.

Регулярные выражения всё же это уже как дополнение. Не оставляю попытки сохранять минимализм базового фреймворка.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Вторник, 08 Август, 2023 00:45 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3732
arisu писал(а):
ещё настойчиво рекомендую в `HandleTrap()` сделать примерно вот так:

Решение надо будет как-то дорабатывать, а то в целом Блэкбокс перестаёт по Ctrl+C завершаться. Наверное он большую часть времени крутится в ядре. Надо тогда по Ctrl+C устанавливать какой-то флаг, чтобы как он из ядра выходил, тогда и останавливал выполнение.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Вторник, 08 Август, 2023 00:45 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3732
arisu писал(а):
кстати. если вы у меня брали читалку PNG, то там маленький багфикс. везде, где:
Код:
* UP.UP.bitdepth + UP.UP.bitdepth - 1) DIV UP.UP.bitdepth;

должно быть:
Код:
* UP.UP.bitdepth + 8 - 1) DIV 8;

(там два места таких.)

Это ещё предстоит делать. Спасибо за исправление.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Вторник, 08 Август, 2023 12:39 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1105
Иван Денисов писал(а):
arisu писал(а):
ещё настойчиво рекомендую в `HandleTrap()` сделать примерно вот так:

Решение надо будет как-то дорабатывать, а то в целом Блэкбокс перестаёт по Ctrl+C завершаться.
а он и не должен.
Иван Денисов писал(а):
Наверное он большую часть времени крутится в ядре.
он в основном сидит в готэка, ожидает события. технически кидать сигналы прерываний когда мы в системных библиотеках — плохо, поэтому и не кидаем. Ctrl+C — так же, как Ctrl+Break в оригинале — предназначена для того, чтобы прервать зациклившийся код на компонентном паскале. именно так оно в виндовом оригинале и работало. то, что до правок Ctrl+C работало иначе — это был баг.

Иван Денисов писал(а):
Надо тогда по Ctrl+C устанавливать какой-то флаг, чтобы как он из ядра выходил, тогда и останавливал выполнение.
ну, есть нюанс: если запустить тот же тест выделений памяти — да, прервать сложно: тут он как раз в основном в ядре и крутится. я у себя сделал счётчик проигнорированых прерываний, и в `Kernel.Collect()` (и `FastCollect()`) его проверяю. если больше трёх — то просто делаю `HALT()` там.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Вторник, 08 Август, 2023 12:44 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1105
Иван Денисов писал(а):
Регулярные выражения всё же это уже как дополнение. Не оставляю попытки сохранять минимализм базового фреймворка.
ну, я тут считаю, что движок регулярок — это то, что должно быть сразу в коробке. сам по себе движок — один модуль, без внешних зависимостей. ну, монстр, 80 кб. но это всё ещё лучше, чем CpcRegul, с его бабелем.

а как только вы ощутите прелесть регулярок и расширеной замены — то никаких вопросов о том, должно ли это быть сразу в поставке, и вовсе не останется. ;-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Вторник, 08 Август, 2023 12:49 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1105
p.s.: `UP.` для CP, понятно, не нужны, их при адаптировании можно просто выкидывать. возможно, ещё объявления переменных придётся наверх сдвинуть, потому что в ультрапаскале можно иметь секцию объявлений после вложеных процедур.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Воскресенье, 17 Сентябрь, 2023 17:47 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1105
ошибочка в WinFiles: в `NewLocator`:
Код:
IF (i > 1) & (loc.path[i-1] = "/") OR (loc.path[i-1] = "\") THEN

а должно быть так:
Код:
IF (i > 1) & ((loc.path[i-1] = "/") OR (loc.path[i-1] = "\")) THEN


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Понедельник, 18 Сентябрь, 2023 10:34 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3732
arisu писал(а):
ошибочка в WinFiles: в `NewLocator`:
Код:
IF (i > 1) & (loc.path[i-1] = "/") OR (loc.path[i-1] = "\") THEN

а должно быть так:
Код:
IF (i > 1) & ((loc.path[i-1] = "/") OR (loc.path[i-1] = "\")) THEN

Большое спасибо, внёс исправление.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Четверг, 21 Сентябрь, 2023 10:33 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3732
Актуализировалась тема с выделением платформенно зависимых модулей подсистемы.
Я попробовал на примере платформенной части DevProfiler внести решение/предложение.
По аналогии с тем, как это сделано в МультиОбероне обозначения платформ выделил двойным подчёркиванием.
DevProfiler__Win
Фильтрация модулей реализована в DevCompiler указанием специального квалификатора/селектора после символа at.
Код:
DevCompiler.MakeList @Lin Dev

Мне видится, что такой символ "__" очень ярко обособляет эти модули, и также во время импорта будет провоцировать заменить это на
Plarform := DevProfiler__Win

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

Ранее, к примеру, в проекте Sdl2 были использованы платформы без отделяющего символа StdLin.odc StdWin.odc. На мой взгляд это может быть недостаточно явно выделяет особенность этих модулей, а также может привести к коллизиям, когда случайно конец названия совпадёт с названием платформы. Ваши мнения?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Четверг, 21 Сентябрь, 2023 13:28 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4684
Откуда: Россия, Орёл
Нужно учитывать, что проблема тут не в символе подчёркивания и не в предпочтении пользователей, а в дополнительном измерении пространства модулей, если можно так выразиться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Четверг, 21 Сентябрь, 2023 13:35 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4684
Откуда: Россия, Орёл
Как временный костыль может и подойти.
Меня больше "напрягает" жёсткая загрузка этой пары модулей (DevProfiler) через Init (пусть даже и по наличию Dev) под Windows.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Четверг, 21 Сентябрь, 2023 15:01 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3732
Борис Рюмшин писал(а):
Как временный костыль может и подойти.
Меня больше "напрягает" жёсткая загрузка этой пары модулей (DevProfiler) через Init (пусть даже и по наличию Dev) под Windows.


В целом согласен. Лучше вот так?

Код:
   PROCEDURE Init;
   BEGIN
      IF Dialog.platform = Dialog.windows THEN
         Kernel.LoadMod("DevProfiler__Win")
      END
   END Init;

BEGIN
   Init
END DevProfiler.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Четверг, 21 Сентябрь, 2023 15:25 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4684
Откуда: Россия, Орёл
Да, так лучше.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Четверг, 21 Сентябрь, 2023 20:36 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1105
(ехидно) ой. где-то я похожую проблему ви… а! вспомнил! это ж мне в LC надо было модули, зависимые от архитектуры, как-то разделить! и чтобы при этом не переписывать скрипты сбор… а, эта задача не стоит, скрипты сборки уже стали системно-зависимые.

а я ведь говорил, что subsystem manager понадобится. и что с ним можно быть более совместимым, вернув на место универсальный Host. it's just a first glimpse of problems awaiting you right around the corner.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Четверг, 21 Сентябрь, 2023 20:48 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4684
Откуда: Россия, Орёл
arisu писал(а):
(ехидно) ой. где-то я похожую проблему ви… а! вспомнил! это ж мне в LC надо было модули, зависимые от архитектуры, как-то разделить! и чтобы при этом не переписывать скрипты сбор… а, эта задача не стоит, скрипты сборки уже стали системно-зависимые.

Да, у нас с вашей работы на самом деле диалог этот и начался. Просто он шёл в личном чате, а не здесь. :) Так что мы всё помним и обсуждаем возможности. Потому я, кстати, и говорю о костыльности решения.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Четверг, 21 Сентябрь, 2023 21:03 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3732
В решении arisu мне не нравится нарушение соответствия названия модуля и его кода (наличие глобального состояния платформы). Также мы очень сознательно убрали Host подсистему, чтобы сделать настоящую честную кросс-разработку, сделали её более прозрачной.
Мы обсуждали с Александром ещё вариант, чтобы название модуля делать как в А2 с указанием платформы через точку. Тогда как-то расположение модуля возможно выносить в папки внутри подсистемы. И будет однозначное соответствие названия модуля и его расположения в системе. Но это потребует доработки парсера, чтобы он понимал названия модулей с точками.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Четверг, 21 Сентябрь, 2023 22:06 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1105
Иван Денисов писал(а):
В решении arisu мне не нравится нарушение соответствия названия модуля и его кода (наличие глобального состояния платформы).
эм… а вот это не глобальное состояние разве?
Код:
   PROCEDURE Init;
   BEGIN
      IF Dialog.platform = Dialog.windows THEN
         Kernel.LoadMod("DevProfiler__Win")
      END
   END Init;


и, кстати, как это нарушение? вот написано: `HostBackends`. открываем модуль — там `MODULE HostBackends`. печатаем в среде `HostBackends`, выделяем, нажимаем Ctrl+0 — открывается исходник HostBackends. тот самый, который скомпилен. где нарушение-то? «показать документацию» правильную документацию показывает. «показать исходник» правильный исходник показывает. поиск ищет по правильным модулям. и происходит это всё при помощи ровно тех же проверок (ну, похожих по смыслу, не по тексту) типа той, что я выше процитировал. только среда это делает сама, а не заставляет меня руками писать то, что она и так уже знает.

до тех пор, пока мы работаем со всем изнутри среды — соответствие будет автоматическое. единственный случай, когда можно немного запутаться — это кросс-разработка: правка модулей от чужой архитектуры. и это решается просто глобальным переключением текущей архитектуры. впрочем, в заголовках табов всегда указано `[<ArchName>]`, если мы открываем архитектурно-специфический файл в редакторе (будь то модуль, или ресурс, или документация).

не знаю, по-моему, проще некуда. один раз поправить стандартные инструменты, чтобы они не ходили по прибитым гвоздями путям, а спрашивали эти пути у менеджера (точнее, просили менеджер открыть им документ) — и всё. при этом если что-то ходит по прибитым гвоздями путям — в подавляющем большинстве не-системного кода будет работать как раньше, так что не нужно всё бросать и бежать править весь код.

а у вас системно-зависимый код размазан по куче мест. вот где грузим модуль динамически, например — надо учитывать возможность того, что там будут модули под разные архитектуры. не забывать руками все эти места починить, если вдруг новая архитектура появилась. в каждом из них точно знать, какие модули можно для некоторых архитектур иметь общие, какие нет. право, каменный век какой-то. ещё и чревато лишними ошибками. в итоге мы пихаем знание о реальной Host OS туда, где оно вообще не нужно.

у меня же среда всегда загрузит правильный модуль под архитектуру, под которой запущено. в загрузчике ничего никогда не перепутается, даже если включить режим кросс-сборки. и на диске никогда ничего не перепутается. и если нам захочется иметь отдельный init-модуль под какую-то конкретную систему — не надо вхачивать это в общий, а просто делаем подкаталог с именем архитектуры, копипастим туда, и правим.

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 440 ]  На страницу Пред.  1 ... 18, 19, 20, 21, 22  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


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

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2023, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB