From 40517ecac82e4b406227bd30fd89d05c2e90bc87 Mon Sep 17 00:00:00 2001 From: matz Date: Mon, 29 Nov 1999 06:33:02 +0000 Subject: 19991129 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@572 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- eval.c | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) (limited to 'eval.c') diff --git a/eval.c b/eval.c index c4d2afcea1..f1a5a8dabd 100644 --- a/eval.c +++ b/eval.c @@ -4682,6 +4682,7 @@ rb_load(fname, wrap) int state; char *file; volatile ID last_func; + volatile VALUE wrapper = 0; VALUE self = ruby_top_self; TMP_PROTECT; @@ -4698,9 +4699,11 @@ rb_load(fname, wrap) PUSH_VARS(); PUSH_CLASS(); + wrapper = ruby_wrapper; if (!wrap) { rb_secure(4); /* should alter global state */ ruby_class = rb_cObject; + ruby_wrapper = 0; } else { /* load in anonymous module as toplevel */ @@ -4747,7 +4750,7 @@ rb_load(fname, wrap) POP_FRAME(); POP_CLASS(); POP_VARS(); - ruby_wrapper = 0; + ruby_wrapper = wrapper; if (ruby_nerrs > 0) { ruby_nerrs = 0; rb_exc_raise(ruby_errinfo); @@ -5220,7 +5223,8 @@ struct end_proc_data { VALUE data; struct end_proc_data *next; }; -static struct end_proc_data *end_proc_data; + +static struct end_proc_data *end_procs, *ephemeral_end_procs; void rb_set_end_proc(func, data) @@ -5228,18 +5232,27 @@ rb_set_end_proc(func, data) VALUE data; { struct end_proc_data *link = ALLOC(struct end_proc_data); + struct end_proc_data **list; - link->next = end_proc_data; + if (ruby_wrapper) list = &ephemeral_end_procs; + else list = &end_procs; + link->next = *list; link->func = func; link->data = data; - end_proc_data = link; + *list = link; } void rb_mark_end_proc() { - struct end_proc_data *link = end_proc_data; + struct end_proc_data *link; + link = end_procs; + while (link) { + rb_gc_mark(link->data); + link = link->next; + } + link = ephemeral_end_procs; while (link) { rb_gc_mark(link->data); link = link->next; @@ -5279,9 +5292,14 @@ rb_exec_end_proc() struct end_proc_data *link; int status; - while (end_proc_data) { - link = end_proc_data; - end_proc_data = link->next; + link = end_procs; + while (link) { + rb_protect((VALUE(*)())link->func, link->data, &status); + link = link->next; + } + while (ephemeral_end_procs) { + link = ephemeral_end_procs; + ephemeral_end_procs = link->next; rb_protect((VALUE(*)())link->func, link->data, &status); free(link); } -- cgit v1.2.3