заюзать compilerproc. Из dynarr.inc, например
Модератор: Модераторы
заюзать compilerproc. Из dynarr.inc, например
Необходимо реализовать вызов DynArrClear() и FinalizeArray(), которые юзают RTTI.
В Delphi они в принципе доступны, а в FPC таких кункций нет. Но есть модуль System, в нутри которого содержится dynarr.inc и aliases.inc . А там есть похожие функции fpc_dynarray_clear и fpc_finalize_array.
В Лазаре, в "Code Insight" эти функции видны, только не компиляются.
Думаю, ну ладно, compilerproc он не видит, рою дальше. В том же dynarr.inc есть открытая функция DynArraySetLength.
Ну... делаю по аналогии. В dynarrh.inc добавляю объявление моей фунции DynArrayClear, в dynarr.inc делаю реализацию (с вызовом внутренней), пытаюсь вызвать из своего модуля, "Code Insight" его видит нормально, но... опять не компилируется.
Вопрос. Можно ли как-то заюзать compilerproc функции? Если нет, то как перекомпилировать модуль System ?
В Delphi они в принципе доступны, а в FPC таких кункций нет. Но есть модуль System, в нутри которого содержится dynarr.inc и aliases.inc . А там есть похожие функции fpc_dynarray_clear и fpc_finalize_array.
В Лазаре, в "Code Insight" эти функции видны, только не компиляются.
Думаю, ну ладно, compilerproc он не видит, рою дальше. В том же dynarr.inc есть открытая функция DynArraySetLength.
Ну... делаю по аналогии. В dynarrh.inc добавляю объявление моей фунции DynArrayClear, в dynarr.inc делаю реализацию (с вызовом внутренней), пытаюсь вызвать из своего модуля, "Code Insight" его видит нормально, но... опять не компилируется.
Вопрос. Можно ли как-то заюзать compilerproc функции? Если нет, то как перекомпилировать модуль System ?
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
В общем-то сам смысл существования compilerproc заключается в том, чтобы их нельзя было вызывать как попало...
Внутри самого модуля System используется прием повторного объявления этих ф-ций с атрибутами [public; alias 'NAME'], после чего извне можно вызыать ф-цию, объявленную как external name 'NAME';
Для перекомпиляции модуля System проще всего пересобрать всю rtl и подсмотреть ту команду, которую вызывает make. Хотя сомневаюсь, что его можно вот так взять и перекомпилить независимо от всего остального.
А чем обычный Finalize не устраивает?
Внутри самого модуля System используется прием повторного объявления этих ф-ций с атрибутами [public; alias 'NAME'], после чего извне можно вызыать ф-цию, объявленную как external name 'NAME';
Для перекомпиляции модуля System проще всего пересобрать всю rtl и подсмотреть ту команду, которую вызывает make. Хотя сомневаюсь, что его можно вот так взять и перекомпилить независимо от всего остального.
А чем обычный Finalize не устраивает?
Честно говоря, недопонял.
Так мне можно их заюзать извне или нет ?
P.S. "где тыкнуть" чтобы пересобрать rtl ?
>А чем обычный Finalize не устраивает?
не, это хорошая штука... но мне нужен универсальный способ (с TypeInfo) - активно "балуюсь" RTTI.
Так мне можно их заюзать извне или нет ?
P.S. "где тыкнуть" чтобы пересобрать rtl ?
>А чем обычный Finalize не устраивает?
не, это хорошая штука... но мне нужен универсальный способ (с TypeInfo) - активно "балуюсь" RTTI.
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Можно только те ф-ции, у которых есть объявление с алиасом. Оно есть не у всех.
Где "тыкнуть", не знаю... Открываешь консоль, набираешь "make"...
Где "тыкнуть", не знаю... Открываешь консоль, набираешь "make"...
В модуле dynarr.inc функция fpc_dynarray_clear объявлена, только я не могу её вызвать.
procedure fpc_dynarray_clear(var p : pointer;ti : pointer); [Public,Alias:'FPC_DYNARRAY_CLEAR']; compilerproc;
...
Procedure fpc_dynarray_clear (var p : pointer;ti : pointer);[external name 'FPC_DYNARRAY_CLEAR'];
procedure fpc_dynarray_clear(var p : pointer;ti : pointer); [Public,Alias:'FPC_DYNARRAY_CLEAR']; compilerproc;
...
Procedure fpc_dynarray_clear (var p : pointer;ti : pointer);[external name 'FPC_DYNARRAY_CLEAR'];
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
если в своем модуле вот так объявить, то вызывается:
Procedure fpc_dynarray_clear (var p : pointer;ti : pointer);external name 'FPC_DYNARRAY_CLEAR';
Procedure fpc_dynarray_clear (var p : pointer;ti : pointer);external name 'FPC_DYNARRAY_CLEAR';
Спасибо огромное! Заработало!
если можно, вопросец.
Соглашение о вызовах в FPC такое же как в Delphi? Т.е. первые 3 параметры eax, edx, ecx, single на стеке, FLOAT-результат в FPU и т.д. ?
если можно, вопросец.
Соглашение о вызовах в FPC такое же как в Delphi? Т.е. первые 3 параметры eax, edx, ecx, single на стеке, FLOAT-результат в FPU и т.д. ?
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
В первом приближении такое же. Насчет FPU не знаю, не сравнивал.
может почитать где-то можно?
чтобы знать точно.
чтобы знать точно.
