summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-12-05 05:54:00 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-12-05 05:54:00 +0000
commitaabecebd69a59807ca27a860a096385fb90ac2e4 (patch)
tree3f1c4000f5b81cb8f14f2eb39849aaf7f5d741df /eval.c
parent491b450f93961e2ff4c993ed7d287417d6f1869e (diff)
* eval.c (rb_exec_end_proc): should not clear end_procs and
ephemeral_end_procs before execution. [ruby-dev:22144] * eval.c (rb_obj_extend): call Module#extended hook after extended_object. [ruby-list:38866] * object.c (Init_Object): Module#extended defined. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5118 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/eval.c b/eval.c
index 046e1e1b0f..cb0ee69a93 100644
--- a/eval.c
+++ b/eval.c
@@ -6381,12 +6381,12 @@ rb_mod_include(argc, argv, module)
VALUE *argv;
VALUE module;
{
- while (argc--) {
- VALUE m = argv[argc];
+ int i;
- Check_Type(m, T_MODULE);
- rb_funcall(m, rb_intern("append_features"), 1, module);
- rb_funcall(m, rb_intern("included"), 1, module);
+ for (i=0; i<argc; i++) Check_Type(argv[i], T_MODULE);
+ while (argc--) {
+ rb_funcall(argv[argc], rb_intern("append_features"), 1, module);
+ rb_funcall(argv[argc], rb_intern("included"), 1, module);
}
return module;
}
@@ -6431,6 +6431,7 @@ rb_obj_extend(argc, argv, obj)
for (i=0; i<argc; i++) Check_Type(argv[i], T_MODULE);
while (argc--) {
rb_funcall(argv[argc], rb_intern("extend_object"), 1, obj);
+ rb_funcall(argv[argc], rb_intern("extended"), 1, obj);
}
return obj;
}
@@ -6523,7 +6524,7 @@ struct end_proc_data {
struct end_proc_data *next;
};
-static struct end_proc_data *end_procs, *ephemeral_end_procs;
+static struct end_proc_data *end_procs, *ephemeral_end_procs, *tmp_end_procs;
void
rb_set_end_proc(func, data)
@@ -6557,6 +6558,11 @@ rb_mark_end_proc()
rb_gc_mark(link->data);
link = link->next;
}
+ link = tmp_end_procs;
+ while (link) {
+ rb_gc_mark(link->data);
+ link = link->next;
+ }
}
static void call_end_proc _((VALUE data));
@@ -6607,7 +6613,7 @@ rb_exec_end_proc()
volatile int safe = ruby_safe_level;
while (ephemeral_end_procs) {
- link = ephemeral_end_procs;
+ tmp_end_procs = link = ephemeral_end_procs;
ephemeral_end_procs = 0;
while (link) {
PUSH_TAG(PROT_NONE);
@@ -6625,7 +6631,7 @@ rb_exec_end_proc()
}
}
while (end_procs) {
- link = end_procs;
+ tmp_end_procs = link = end_procs;
end_procs = 0;
while (link) {
PUSH_TAG(PROT_NONE);
@@ -6642,6 +6648,7 @@ rb_exec_end_proc()
free(tmp);
}
}
+ tmp_end_procs = 0;
ruby_safe_level = safe;
}