Хочу разобраться как FPC обрабатывает исключения. Методом тыка и Ctrl+Alt+D нашел, что для try используется fpc_PushExceptAddr, и в конце концов (когда надо убрать фрейм) - fpc_PopAddrStack. но не могу понять где именно передается адрес обработчика. В Delphi было явно написано
- Код: Выделить всё
push OFFSET _myHandler
push fs:[0]
mov fs:[0], esp
и возможно ли (знаю что возможно) не знаю как )) чтобы при обработке какого либо исключения попасть не в текущий блок обработки, а в блок более высокого уровня... т.е. в результате нижеследующего нужно получить "ОК!"
- Код: Выделить всё
try
try
DestroyCurrentFrame;
raise Exception.Create
except
WriteLn('опача!');
end;
except
WriteLn('ок!');
end;
заранее спс )
Добавлено спустя 54 минуты 3 секунды:
сделал вот так:
- Код: Выделить всё
procedure fpc_PopAddrStack; [external name 'FPC_POPADDRSTACK'];
получилось. но можно ли так делать вообще? где хранится этот блок TExceptAddr? в стеке? судя по исходникам никакого GetMem И FreeMem там нет. или это может делает компилятор?