digraph try_finally_asc2 { label = "Try..Finally clause in ASC2"; node[shape=rect]; start->before; before->finally_init->in_try; try_f_begin->in_try; try_c_begin->in_try; in_try->finally; try_c_end->finally; in_catch->finally; try_c_target->in_catch; try_f_end->finally; try_f_target->catch_f->finally:ne; finally->lookupswitch; lookupswitch->after; lookupswitch->finally_throw[label="X"]; after->end; finally_init[label="loc_N=0;"]; catch_f[label="loc_E = exception;\lloc_N = X;\l"]; finally_throw[label="throw loc_E;"]; try_c_target[shape=ellipse]; try_c_begin[shape=ellipse]; try_c_end[shape=ellipse]; try_f_target[shape=ellipse]; try_f_begin[shape=ellipse]; try_f_end[shape=ellipse]; start[shape=ellipse]; end[shape=ellipse]; lookupswitch[label="lookupswitch(loc_N)"] in_try->in_try_ret[label=return]; in_try_ret[label="loc_R = returnedValue;\lloc_N = Y;\l"] in_try_ret->finally; lookupswitch->finally_return[label="Y"]; finally_return[label="return loc_R;"]; in_try->in_try_continue[label=continue]; in_try_continue[label="loc_N = Z;"] in_try_continue->finally; lookupswitch->finally_continue[label="Z"]; finally_continue[label="continue label;"]; /* All ways go through finally clause. There is also lookupswitch with getlocal. Local register is set before entering in_try block. For every return/continue, there is local register set to specific value. Lookupswitch then decides what will happen. */ }