summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog28
-rw-r--r--enum.c1
-rw-r--r--eval.c46
-rw-r--r--gc.c17
-rw-r--r--intern.h1
-rw-r--r--lib/pstore.rb1
-rw-r--r--misc/ruby-mode.el5
-rw-r--r--variable.c12
8 files changed, 86 insertions, 25 deletions
diff --git a/ChangeLog b/ChangeLog
index 4ae0e2ae31..b597e72d7b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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).
diff --git a/enum.c b/enum.c
index 682c9f4318..8f6cf28f8a 100644
--- a/enum.c
+++ b/enum.c
@@ -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;
}
diff --git a/eval.c b/eval.c
index c6c2b98cd3..455a81dbc9 100644
--- a/eval.c
+++ b/eval.c
@@ -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
diff --git a/gc.c b/gc.c
index ed159a7ffd..7b9873ad21 100644
--- a/gc.c
+++ b/gc.c
@@ -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);
diff --git a/intern.h b/intern.h
index 93fb5c2ffd..ee5de46e5a 100644
--- a/intern.h
+++ b/intern.h
@@ -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