summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--eval.c22
-rw-r--r--ext/curses/extconf.rb1
-rw-r--r--string.c5
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 <matz@ruby-lang.org>
+
+ * 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 <aamine@loveruby.net>
* 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 {