From 447578a8a02a32fc3594cf62d3c0f928fe63221a Mon Sep 17 00:00:00 2001 From: matz Date: Wed, 2 Jul 2003 04:27:29 +0000 Subject: * string.c (rb_str_shared_replace): clear flags before copy. * string.c (rb_str_replace): ditto. * eval.c (rb_yield_0): override visibility mode for module_eval etc. (ruby-bugs-ja PR#505) git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4028 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 9 +++++++++ eval.c | 22 +++++++++++++--------- ext/curses/extconf.rb | 1 + string.c | 5 +++-- 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 61dde9cfa9..49293d9e7e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Wed Jul 2 13:22:39 2003 Yukihiro Matsumoto + + * string.c (rb_str_shared_replace): clear flags before copy. + + * string.c (rb_str_replace): ditto. + + * eval.c (rb_yield_0): override visibility mode for module_eval + etc. (ruby-bugs-ja PR#505) + Wed Jul 2 11:45:34 2003 Minero Aoki * lib/net/smtp.rb: synchronize document with source code. diff --git a/eval.c b/eval.c index f634b6556d..186e23db95 100644 --- a/eval.c +++ b/eval.c @@ -950,6 +950,10 @@ static VALUE eval _((VALUE,VALUE,VALUE,char*,int)); static NODE *compile _((VALUE, char*, int)); static VALUE rb_yield_0 _((VALUE, VALUE, VALUE, int, int)); + +#define YIELD_PROC_CALL 1 +#define YIELD_PUBLIC_DEF 2 + static VALUE rb_call _((VALUE,VALUE,ID,int,const VALUE*,int)); static VALUE module_setup _((VALUE,NODE*)); @@ -2780,7 +2784,7 @@ rb_eval(self, n) result = Qundef; /* no arg */ } SET_CURRENT_SOURCE(); - result = rb_yield_0(result, 0, 0, Qfalse, node->nd_state); + result = rb_yield_0(result, 0, 0, 0, node->nd_state); break; case NODE_RESCUE: @@ -4010,9 +4014,9 @@ rb_f_block_given_p() } static VALUE -rb_yield_0(val, self, klass, pcall, avalue) +rb_yield_0(val, self, klass, flags, avalue) VALUE val, self, klass; /* OK */ - int pcall, avalue; + int flags, avalue; { NODE *node; volatile VALUE result = Qnil; @@ -4043,7 +4047,7 @@ rb_yield_0(val, self, klass, pcall, avalue) old_scope = ruby_scope; ruby_scope = block->scope; old_vmode = scope_vmode; - scope_vmode = block->vmode; + scope_vmode = (flags & YIELD_PUBLIC_DEF) ? SCOPE_PUBLIC : block->vmode; ruby_block = block->prev; if (block->flags & BLOCK_D_SCOPE) { /* put place holder for dynamic (in-block) local variables */ @@ -4061,7 +4065,7 @@ rb_yield_0(val, self, klass, pcall, avalue) PUSH_TAG(PROT_NONE); if ((state = EXEC_TAG()) == 0) { if (block->var == (NODE*)1) { /* no parameter || */ - if (pcall && RARRAY(val)->len != 0) { + if ((flags & YIELD_PROC_CALL) && RARRAY(val)->len != 0) { rb_raise(rb_eArgError, "wrong number of arguments (%ld for 0)", RARRAY(val)->len); } @@ -4076,7 +4080,7 @@ rb_yield_0(val, self, klass, pcall, avalue) if (!avalue) { val = svalue_to_mrhs(val, block->var->nd_head); } - massign(self, block->var, val, pcall); + massign(self, block->var, val, flags&YIELD_PROC_CALL); } else { int len = 0; @@ -4100,7 +4104,7 @@ rb_yield_0(val, self, klass, pcall, avalue) ruby_current_node = curr; } } - assign(self, block->var, val, pcall); + assign(self, block->var, val, flags&YIELD_PROC_CALL); } } POP_TAG(); @@ -5589,7 +5593,7 @@ static VALUE yield_under_i(self) VALUE self; { - return rb_yield_0(self, self, ruby_class, Qfalse, Qfalse); + return rb_yield_0(self, self, ruby_class, YIELD_PUBLIC_DEF, Qfalse); } /* block eval under the class/module context */ @@ -6954,7 +6958,7 @@ proc_invoke(proc, args, self, klass) Data_Get_Struct(proc, struct BLOCK, data); orphan = block_orphan(data); - pcall = data->flags & BLOCK_LAMBDA; + pcall = data->flags & BLOCK_LAMBDA ? YIELD_PROC_CALL : 0; ruby_wrapper = data->wrapper; ruby_dyna_vars = data->dyna_vars; diff --git a/ext/curses/extconf.rb b/ext/curses/extconf.rb index 94443b45e6..2f20bb2ff3 100644 --- a/ext/curses/extconf.rb +++ b/ext/curses/extconf.rb @@ -8,6 +8,7 @@ make=false have_library("mytinfo", "tgetent") if /bow/ =~ RUBY_PLATFORM if have_header("ncurses.h") and have_library("ncurses", "initscr") make=true +elsif have_header("ncurses/curses.h") and have_library("ncurses", "initscr") and have_library("tinfo", "tgetent") elsif have_header("ncurses/curses.h") and have_library("ncurses", "initscr") make=true elsif have_header("curses_colr/curses.h") and have_library("cur_colr", "initscr") diff --git a/string.c b/string.c index 885b3e608e..25b325f0ec 100644 --- a/string.c +++ b/string.c @@ -241,12 +241,12 @@ rb_str_shared_replace(str, str2) } RSTRING(str)->ptr = RSTRING(str2)->ptr; RSTRING(str)->len = RSTRING(str2)->len; + FL_UNSET(str, ELTS_SHARED|STR_ASSOC); if (FL_TEST(str2, ELTS_SHARED|STR_ASSOC)) { FL_SET(str, RBASIC(str2)->flags & (ELTS_SHARED|STR_ASSOC)); RSTRING(str)->aux.shared = RSTRING(str2)->aux.shared; } else { - FL_UNSET(str, ELTS_SHARED|STR_ASSOC); RSTRING(str)->aux.capa = RSTRING(str2)->aux.capa; } RSTRING(str2)->ptr = 0; /* abandon str2 */ @@ -559,7 +559,7 @@ rb_str_resize(str, len) rb_str_modify(str); if (RSTRING(str)->len < len || RSTRING(str)->len - len > 1024) { REALLOC_N(RSTRING(str)->ptr, char, len+1); - if (!FL_TEST(str, STR_ASSOC)) { + if (!FL_TEST(str, STR_ASSOC|ELTS_SHARED)) { RSTRING(str)->aux.capa = len; } } @@ -1705,6 +1705,7 @@ rb_str_replace(str, str2) RSTRING(str)->len = RSTRING(str2)->len; RSTRING(str)->ptr = RSTRING(str2)->ptr; FL_SET(str, ELTS_SHARED); + FL_UNSET(str, STR_ASSOC); RSTRING(str)->aux.shared = RSTRING(str2)->aux.shared; } else { -- cgit v1.2.3