1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@572 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 1999-11-29 06:33:02 +00:00
parent 2b49047143
commit 40517ecac8
7 changed files with 61 additions and 13 deletions

View file

@ -1,3 +1,21 @@
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.
Mon Nov 22 14:07:24 1999 Koji Arai <JCA02266@nifty.ne.jp>
* ruby.c (proc_options): variable e_script should be visited by

1
ToDo
View file

@ -25,6 +25,7 @@ Hacking Interpreter
- use eban's fnmatch
- RUBYOPT environment variable
- alias $defout $>
* remove end_proc registered out of require only
* non-blocking open (e.g. for named pipe) for thread
* avoid blocking with gethostbyname/gethostbyaddr
* objectify interpreters

34
eval.c
View file

@ -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);
}

3
gc.c
View file

@ -896,7 +896,8 @@ rb_gc()
alloca(0);
# define STACK_END (&stack_end)
#else
# define STACK_END alloca(1)
VALUE *stack_end = alloca(1);
# define STACK_END (stack_end)
#endif
alloc_objects = 0;

View file

@ -107,6 +107,7 @@ class PStore
Marshal::dump(@table, file)
rescue
File::rename backup, @filename if File::exist?(backup)
raise
end
end
@abort = false

View file

@ -1,9 +1,8 @@
# word occurrence listing
# usege: ruby freq.rb file..
freq = Hash.new(0)
while gets
while sub!(/\w+/, '')
word = $&
while line = gets()
line.scan(/\w+/) do |word|
freq[word] += 1
end
end

View file

@ -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