LINUX.ORG.RU

Как самостоятельно раскрутить стек ? (подобно exception из C++)


0

0

Привет!
Скажите пожалуйста. Как самостоятельно раскрутить стек?
Последоваетьльно вызывать деструкторы как это делает C++ _не_ нужно.
Нужно лишь передать управление на ближайшую верхушку.

Вот примерчик кода:

TRAP(r,doExampleL()); // Макрос
// Test the leave variable
if (r)
testConsole.Printf(_LIT("Failed: leave code=%d"), r);

Идет вызов функции doExampleL(). Из не в глубину вызываються другие функции. И тут, в глубине, одна из функций сказала:
User::Leave(ErrCode);
Управление нужно передать на самую верхушку (к ближайшему TRAP) (Подобно catch в С++).

Как это можно сделать?

P.S.
#define TRAP(_r,_s) {TTrap __t;if (__t.Trap(_r)==0){_s;TTrap::UnTrap();}}

anonymous

Ответ на: комментарий от myhand

>
А разве эти функции не просто переходят по указаному адрессу?
А стек тогда останеться нераскрученным... :(
И как узнать куда переходить ?

anonymous
()

a) варианты с setjmp/longjmp
б) если всё внутри одной функции - свой препроцессор (или m4) который расставит метки/переходы, если препроцессор хороший, то можно объеденить с вариантом a)
в) глубокий хак с анализом фреймов (фантастичный вариант)

Правильный ответ :
- надо что-то менять в генераторе кода, то бишь в том кто это пишет ;-)
или писать на другом языке, или понять C++

MKuznetsov ★★★★★
()
Ответ на: комментарий от anonymous

Брат anonymous Симбиана обчитался...
Это все Leavе, Trap и искуственный стэк - костили из 80 годов торчащий.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.