diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-12-05 05:54:00 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-12-05 05:54:00 +0000 |
commit | aabecebd69a59807ca27a860a096385fb90ac2e4 (patch) | |
tree | 3f1c4000f5b81cb8f14f2eb39849aaf7f5d741df /eval.c | |
parent | 491b450f93961e2ff4c993ed7d287417d6f1869e (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.c | 23 |
1 files changed, 15 insertions, 8 deletions
@@ -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; } |