From c492b9b0857a76a94db586c87e3ab5a270b20746 Mon Sep 17 00:00:00 2001 From: matz Date: Fri, 5 Sep 2003 05:07:54 +0000 Subject: * eval.c (mark_frame_adj): need to adjust argv pointer if using system's alloca. [ruby-core:01503] * io.c (rb_f_gets): should call next_argv() before type check current_file. [ruby-list:38336] * eval.c (proc_invoke): should retrieve retval when pcall is true. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4509 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 14 ++++++++++++++ array.c | 27 +++++++++++++-------------- eval.c | 27 +++++++++++++++++++++++---- io.c | 2 +- string.c | 18 +++++++++--------- 5 files changed, 60 insertions(+), 28 deletions(-) diff --git a/ChangeLog b/ChangeLog index 57fae73d58..4060c239d3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -101,6 +101,11 @@ Thu Sep 4 12:54:50 2003 why the lucky stiff * ext/syck/token.c: headerless documents with root-level spacing now honored. +Thu Sep 4 00:06:14 2003 Yukihiro Matsumoto + + * eval.c (mark_frame_adj): need to adjust argv pointer if using + system's alloca. [ruby-core:01503] + Wed Sep 3 21:33:20 2003 NAKAMURA, Hiroshi * test: add test directory. Test::Unit aware testcases and needed @@ -112,11 +117,20 @@ Wed Sep 3 21:33:20 2003 NAKAMURA, Hiroshi * test/csv/*: add testcase for lib/csv.rb. +Wed Sep 3 01:37:09 2003 Yukihiro Matsumoto + + * io.c (rb_f_gets): should call next_argv() before type check + current_file. [ruby-list:38336] + Tue Sep 2 20:37:15 2003 GOTOU Yuuzou * ext/openssl/lib/net/protocols.rb (SSLIO#ssl_connect): warning for skipping server verification. +Tue Sep 2 23:36:57 2003 Yukihiro Matsumoto + + * eval.c (proc_invoke): should retrieve retval when pcall is true. + Tue Sep 2 14:09:20 2003 Yukihiro Matsumoto * ext/socket/extconf.rb: check s6_addr8 in in6_addr (Tru64 UNIX). diff --git a/array.c b/array.c index 46b0889911..ed562060d2 100644 --- a/array.c +++ b/array.c @@ -1095,17 +1095,16 @@ rb_ary_reverse(ary) VALUE tmp; rb_ary_modify(ary); - if (RARRAY(ary)->len <= 1) return ary; - - p1 = RARRAY(ary)->ptr; - p2 = p1 + RARRAY(ary)->len - 1; /* points last item */ - - while (p1 < p2) { - tmp = *p1; - *p1++ = *p2; - *p2-- = tmp; + if (RARRAY(ary)->len > 1) { + p1 = RARRAY(ary)->ptr; + p2 = p1 + RARRAY(ary)->len - 1; /* points last item */ + + while (p1 < p2) { + tmp = *p1; + *p1++ = *p2; + *p2-- = tmp; + } } - return ary; } @@ -1173,10 +1172,10 @@ rb_ary_sort_bang(ary) VALUE ary; { rb_ary_modify(ary); - if (RARRAY(ary)->len <= 1) return ary; - - FL_SET(ary, ARY_TMPLOCK); /* prohibit modification during sort */ - rb_ensure(sort_internal, ary, sort_unlock, ary); + if (RARRAY(ary)->len > 1) { + FL_SET(ary, ARY_TMPLOCK); /* prohibit modification during sort */ + rb_ensure(sort_internal, ary, sort_unlock, ary); + } return ary; } diff --git a/eval.c b/eval.c index c65c31419e..a9c2dc7f72 100644 --- a/eval.c +++ b/eval.c @@ -7023,7 +7023,7 @@ proc_invoke(proc, args, self, klass) proc_set_safe_level(proc); result = rb_yield_0(args, self, self!=Qundef?CLASS_OF(self):0, pcall, Qtrue); } - else if (TAG_DST()) { + else if (pcall || TAG_DST()) { result = prot_tag->retval; } POP_TAG(); @@ -8043,6 +8043,25 @@ timeofday() #define STACK(addr) (th->stk_pos<(VALUE*)(addr) && (VALUE*)(addr)stk_pos+th->stk_len) #define ADJ(addr) (void*)(STACK(addr)?(((VALUE*)(addr)-th->stk_pos)+th->stk_ptr):(VALUE*)(addr)) +#ifdef C_ALLOCA +# define MARK_FRAME_ADJ(f) rb_gc_mark_frame(f) +#else +# define MARK_FRAME_ADJ(f) mark_frame_adj(f, th) +static void +mark_frame_adj(frame, th) + struct FRAME *frame; + rb_thread_t th; +{ + if (frame->flags & FRAME_MALLOC) { + rb_gc_mark_locations(frame->argv, frame->argv+frame->argc); + } + else { + VALUE *start = ADJ(frame->argv); + rb_gc_mark_locations(start, start+frame->argc); + } + rb_gc_mark((VALUE)frame->node); +} +#endif static void thread_mark(th) @@ -8084,13 +8103,13 @@ thread_mark(th) frame = th->frame; while (frame && frame != top_frame) { frame = ADJ(frame); - rb_gc_mark_frame(frame); + MARK_FRAME_ADJ(frame); if (frame->tmp) { struct FRAME *tmp = frame->tmp; while (tmp && tmp != top_frame) { tmp = ADJ(tmp); - rb_gc_mark_frame(tmp); + MARK_FRAME_ADJ(tmp); tmp = tmp->prev; } } @@ -8099,7 +8118,7 @@ thread_mark(th) block = th->block; while (block) { block = ADJ(block); - rb_gc_mark_frame(&block->frame); + MARK_FRAME_ADJ(&block->frame); block = block->prev; } } diff --git a/io.c b/io.c index 3e623e29b7..ee030e894a 100644 --- a/io.c +++ b/io.c @@ -3115,8 +3115,8 @@ rb_f_gets(argc, argv) { VALUE line; + if (!next_argv()) return Qnil; if (TYPE(current_file) != T_FILE) { - if (!next_argv()) return Qnil; line = rb_funcall3(current_file, rb_intern("gets"), argc, argv); } else { diff --git a/string.c b/string.c index 248813e233..67f4f8dcc3 100644 --- a/string.c +++ b/string.c @@ -1807,16 +1807,16 @@ rb_str_reverse_bang(str) char *s, *e; char c; - if (RSTRING(str)->len <= 1) return Qnil; - rb_str_modify(str); - s = RSTRING(str)->ptr; - e = s + RSTRING(str)->len - 1; - while (s < e) { - c = *s; - *s++ = *e; - *e-- = c; + if (RSTRING(str)->len > 1) { + rb_str_modify(str); + s = RSTRING(str)->ptr; + e = s + RSTRING(str)->len - 1; + while (s < e) { + c = *s; + *s++ = *e; + *e-- = c; + } } - return str; } -- cgit v1.2.3