#include #include enum jb_t { j_function, j_loop, j_switch, }; struct jb_record { jmp_buf jb; enum jb_t type; oop result; struct jb_record next; }; struct jb_record *jbs= 0; int eval(oop ast) { case t_call: { pushJbRec(); if (0 != set_jmp(jbs->jb)) { oop result = jbs->result; popJbRec(); return result; } // run the body of the function here result = (each statement in the func body...); popJbRec(); return result; } setjmp(jb); if (n < 2) return 1; return 1 + f(n-1) + f(n-2); } int main() { printf("%zi\n", sizeof(jmp_buf)); printf("%i\n", f(5)); }