Project

General

Profile

Bug #4400 » bug4400-atexit.patch

kosaki (Motohiro KOSAKI), 02/15/2011 08:25 PM

View differences:

eval_jump.c (作業コピー)
struct end_proc_data *next;
};
static struct end_proc_data *end_procs, *ephemeral_end_procs, *tmp_end_procs;
static struct end_proc_data *end_procs, *ephemeral_end_procs;
void
rb_set_end_proc(void (*func)(VALUE), VALUE data)
......
rb_gc_mark(link->data);
link = link->next;
}
link = tmp_end_procs;
while (link) {
rb_gc_mark(link->data);
link = link->next;
}
}
void
......
volatile int safe = rb_safe_level();
while (ephemeral_end_procs) {
tmp_end_procs = link = ephemeral_end_procs;
ephemeral_end_procs = 0;
while (link) {
PUSH_TAG();
if ((status = EXEC_TAG()) == 0) {
rb_set_safe_level_force(link->safe);
(*link->func) (link->data);
}
POP_TAG();
if (status) {
error_handle(status);
}
tmp = link;
tmp_end_procs = link = link->next;
xfree(tmp);
link = ephemeral_end_procs;
ephemeral_end_procs = link->next;
PUSH_TAG();
if ((status = EXEC_TAG()) == 0) {
rb_set_safe_level_force(link->safe);
(*link->func) (link->data);
}
POP_TAG();
if (status) {
error_handle(status);
}
xfree(link);
}
while (end_procs) {
tmp_end_procs = link = end_procs;
end_procs = 0;
while (link) {
PUSH_TAG();
if ((status = EXEC_TAG()) == 0) {
rb_set_safe_level_force(link->safe);
(*link->func) (link->data);
}
POP_TAG();
if (status) {
error_handle(status);
}
tmp = link;
tmp_end_procs = link = link->next;
xfree(tmp);
link = end_procs;
end_procs = link->next;
PUSH_TAG();
if ((status = EXEC_TAG()) == 0) {
rb_set_safe_level_force(link->safe);
(*link->func) (link->data);
}
POP_TAG();
if (status) {
error_handle(status);
}
xfree(link);
}
rb_set_safe_level_force(safe);
}
    (1-1/1)