diff options
-rw-r--r-- | ChangeLog | 28 | ||||
-rw-r--r-- | enum.c | 1 | ||||
-rw-r--r-- | eval.c | 46 | ||||
-rw-r--r-- | gc.c | 17 | ||||
-rw-r--r-- | intern.h | 1 | ||||
-rw-r--r-- | lib/pstore.rb | 1 | ||||
-rw-r--r-- | misc/ruby-mode.el | 5 | ||||
-rw-r--r-- | variable.c | 12 |
8 files changed, 86 insertions, 25 deletions
@@ -1,3 +1,31 @@ +Mon Nov 29 15:28:52 1999 Yukihiro Matsumoto <matz@netlab.co.jp> + + * variable.c (rb_path2class): evaluated value from path should be + module or class. + +Fri Nov 26 18:12:49 1999 Yukihiro Matsumoto <matz@netlab.co.jp> + + * eval.c (rb_exec_end_proc): should remove only end_procs defined + within load wrapper. + + * eval.c (rb_load): save and restore ruby_wrapper around loading. + + * eval.c (rb_mark_end_proc): mark end procs registered by END{} or + at_exit{}. + + * eval.c (rb_set_end_proc): should not call rb_global_variable() + on heap address; it crashed mod_ruby. + +Fri Nov 26 18:12:49 1999 Yukihiro Matsumoto <matz@netlab.co.jp> + + * enum.c (enum_grep): does not return nil. + + * eval.c (rb_mark_end_proc): mark end procs registered by END{} or + at_exit{}. + + * eval.c (rb_set_end_proc): should not call rb_global_variable() + on heap address; it crashed mod_ruby. + Thu Nov 18 16:18:27 1999 Yukihiro Matsumoto <matz@netlab.co.jp> * lib/pstore.rb: mutual lock by flock(2). @@ -54,7 +54,6 @@ enum_grep(obj, pat) } else { rb_iterate(rb_each, obj, grep_i, (VALUE)arg); - if (RARRAY(tmp)->len == 0) return Qnil; } return tmp; } @@ -4655,6 +4655,7 @@ rb_load(fname, wrap) int state; char *file; volatile ID last_func; + volatile VALUE wrapper = 0; VALUE self = ruby_top_self; TMP_PROTECT; @@ -4671,9 +4672,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 */ @@ -4720,7 +4723,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); @@ -5193,7 +5196,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) @@ -5201,12 +5205,31 @@ 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; - rb_global_variable(&link->data); - end_proc_data = link; + *list = link; +} + +void +rb_mark_end_proc() +{ + 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; + } } static void @@ -5239,17 +5262,20 @@ rb_f_at_exit() void rb_exec_end_proc() { - struct end_proc_data *link = end_proc_data; - struct end_proc_data *tmp; + struct end_proc_data *link; int status; + link = end_procs; while (link) { rb_protect((VALUE(*)())link->func, link->data, &status); - tmp = link->next; + 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); - link = tmp; } - end_proc_data = 0; } void @@ -893,6 +893,10 @@ rb_gc() jmp_buf save_regs_gc_mark; #ifdef C_ALLOCA VALUE stack_end; + alloca(0); +# define STACK_END (&stack_end) +#else +# define STACK_END alloca(1) #endif alloc_objects = 0; @@ -901,10 +905,6 @@ rb_gc() if (during_gc) return; during_gc++; -#ifdef C_ALLOCA - alloca(0); -#endif - /* mark frame stack */ for (frame = ruby_frame; frame; frame = frame->prev) { rb_gc_mark_frame(frame); @@ -924,18 +924,14 @@ rb_gc() /* This assumes that all registers are saved into the jmp_buf */ setjmp(save_regs_gc_mark); mark_locations_array((VALUE*)save_regs_gc_mark, sizeof(save_regs_gc_mark) / sizeof(VALUE *)); -#ifdef C_ALLOCA - rb_gc_mark_locations(rb_gc_stack_start, (VALUE*)&stack_end); -#else - rb_gc_mark_locations(rb_gc_stack_start, (VALUE*)alloca(1)); -#endif + rb_gc_mark_locations(rb_gc_stack_start, (VALUE*)STACK_END); #if defined(THINK_C) || defined(__human68k__) #ifndef __human68k__ mark_locations_array((VALUE*)((char*)save_regs_gc_mark+2), sizeof(save_regs_gc_mark) / sizeof(VALUE *)); #endif rb_gc_mark_locations((VALUE*)((char*)rb_gc_stack_start + 2), - (VALUE*)((char*)&stack_end + 2)); + (VALUE*)((char*)STACK_END + 2)); #endif rb_gc_mark_threads(); @@ -943,6 +939,7 @@ rb_gc() for (list = Global_List; list; list = list->next) { rb_gc_mark(*list->varptr); } + rb_mark_end_proc(); rb_gc_mark_global_tbl(); rb_mark_tbl(rb_class_tbl); @@ -121,6 +121,7 @@ VALUE rb_f_lambda _((void)); VALUE rb_protect _((VALUE (*)(), VALUE, int*)); void rb_set_end_proc _((void (*)(), VALUE)); void rb_exec_end_proc _((void)); +void rb_mark_end_proc _((void)); void rb_gc_mark_threads _((void)); void rb_thread_start_timer _((void)); void rb_thread_stop_timer _((void)); diff --git a/lib/pstore.rb b/lib/pstore.rb index 566de8d8f9..9ea9ab3660 100644 --- a/lib/pstore.rb +++ b/lib/pstore.rb @@ -107,6 +107,7 @@ class PStore Marshal::dump(@table, file) rescue File::rename backup, @filename if File::exist?(backup) + raise end end @abort = false diff --git a/misc/ruby-mode.el b/misc/ruby-mode.el index aef84affea..5ebf4f875e 100644 --- a/misc/ruby-mode.el +++ b/misc/ruby-mode.el @@ -664,7 +664,6 @@ An end of a defun is found by moving forward from the beginning of one." "return" "then" "throw" - "self" "super" "unless" "undef" @@ -676,8 +675,8 @@ An end of a defun is found by moving forward from the beginning of one." "\\)\\>[^_]") 2) ;; variables - '("\\b\\(nil\\|self\\|true\\|false\\)\\b" - 1 font-lock-variable-name-face) + '("\\(^\\|[^_:.@$]\\|\\.\\.\\)\\b\\(nil\\|self\\|true\\|false\\)\\b[^_]" + 2 font-lock-variable-name-face) ;; variables '("[$@].\\(\\w\\|_\\)*" 0 font-lock-variable-name-face) diff --git a/variable.c b/variable.c index 7b273933ac..28fc2b78ba 100644 --- a/variable.c +++ b/variable.c @@ -195,10 +195,20 @@ VALUE rb_path2class(path) const char *path; { + VALUE c; + if (path[0] == '#') { rb_raise(rb_eArgError, "can't retrieve anonymous class %s", path); } - return rb_eval_string(path); + c = rb_eval_string(path); + switch (TYPE(c)) { + case T_MODULE: + case T_CLASS: + break; + default: + rb_raise(rb_eTypeError, "class path %s does not point class", path); + } + return c; } void |