From 072673ee41bf10822d44a88a21818e255ddfedbb Mon Sep 17 00:00:00 2001 From: knu Date: Sat, 24 May 2008 17:49:34 +0000 Subject: Merge from ruby_1_8. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@16575 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 33 +++++++++++++++++++++++++++++++++ enumerator.c | 11 ----------- error.c | 16 +++++++--------- eval.c | 2 +- lib/rational.rb | 4 ++-- marshal.c | 37 +++++++++++++++++++++++++++++++++---- object.c | 1 + version.h | 6 +++--- 8 files changed, 80 insertions(+), 30 deletions(-) diff --git a/ChangeLog b/ChangeLog index a3d1c0093d..cdf0c15d8d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,31 @@ +Sun May 25 02:45:49 2008 Akinori MUSHA + + * error.c (syserr_eqq): Use en. + +Sat May 24 22:32:49 2008 Yukihiro Matsumoto + + * object.c (rb_cstr_to_dbl): should clear errno before calling + strtod(3). [ruby-dev:34834] + +Sat May 24 22:27:44 2008 Yukihiro Matsumoto + + * marshal.c (marshal_load): should initialize arg.data used for + reentrant check. [ruby-dev:34837] + +Sat May 24 00:34:59 2008 Tanaka Akira + + * lib/rational.rb (Rational#to_i): fix rdoc. Rational(-7,4).to_i + should be -1. + +Fri May 23 20:22:44 2008 Yukihiro Matsumoto + + * marshal.c (reentrant_check): check reentrance via callcc. + [ruby-dev:34802] + +Fri May 23 16:46:28 2008 Akinori MUSHA + + * enumerator.c (proc_call): Remove an unused static function. + Fri May 23 13:46:09 2008 Nobuyoshi Nakada * configure.in (cflags): commit miss. @@ -9,6 +37,11 @@ Fri May 23 09:52:21 2008 Nobuyoshi Nakada * ext/extmk.rb: load purelib.rb only when not cross compiling. +Fri May 23 08:47:02 2008 Yukihiro Matsumoto + + * error.c (syserr_eqq): === should be able to handle delegated + objects as well. + Fri May 23 04:22:19 2008 Hidetoshi NAGAI * ext/tk/tcltklib.c, ext/tk/tkutil/tkutil.c: fix memory leak. diff --git a/enumerator.c b/enumerator.c index d7a79c3c5a..f2c1fa2840 100644 --- a/enumerator.c +++ b/enumerator.c @@ -25,17 +25,6 @@ static VALUE sym_each; VALUE rb_eStopIteration; -static VALUE -proc_call(proc, args) - VALUE proc; - VALUE args; -{ - if (TYPE(args) != T_ARRAY) { - args = rb_ary_new3(1, args); - } - return rb_proc_call(proc, args); -} - struct enumerator { VALUE obj; ID meth; diff --git a/error.c b/error.c index 608d1fa558..19164c10cf 100644 --- a/error.c +++ b/error.c @@ -952,18 +952,16 @@ syserr_eqq(self, exc) VALUE self, exc; { VALUE num, e; + ID en = rb_intern("errno"); - if (!rb_obj_is_kind_of(exc, rb_eSystemCallError)) return Qfalse; - if (self == rb_eSystemCallError) return Qtrue; + if (!rb_obj_is_kind_of(exc, rb_eSystemCallError)) { + if (!rb_respond_to(exc, en)) return Qfalse; + } + else if (self == rb_eSystemCallError) return Qtrue; - num = rb_attr_get(exc, rb_intern("errno")); + num = rb_attr_get(exc, en); if (NIL_P(num)) { - VALUE klass = CLASS_OF(exc); - - while (TYPE(klass) == T_ICLASS || FL_TEST(klass, FL_SINGLETON)) { - klass = (VALUE)RCLASS(klass)->super; - } - num = rb_const_get(klass, rb_intern("Errno")); + num = rb_funcall(exc, en, 0, 0); } e = rb_const_get(self, rb_intern("Errno")); if (FIXNUM_P(num) ? num == e : rb_equal(num, e)) diff --git a/eval.c b/eval.c index e926487791..0434917bec 100644 --- a/eval.c +++ b/eval.c @@ -5526,7 +5526,7 @@ rb_ensure(b_proc, data1, e_proc, data2) POP_TAG(); retval = prot_tag ? prot_tag->retval : Qnil; /* save retval */ if (!thread_no_ensure()) { - (*e_proc)(data2); + (*e_proc)(data2); } if (prot_tag) return_value(retval); if (state) JUMP_TAG(state); diff --git a/lib/rational.rb b/lib/rational.rb index 4d0097b02e..69a3b76bf1 100644 --- a/lib/rational.rb +++ b/lib/rational.rb @@ -344,12 +344,12 @@ class Rational < Numeric # Converts the rational to an Integer. Not the _nearest_ integer, the # truncated integer. Study the following example carefully: # Rational(+7,4).to_i # -> 1 - # Rational(-7,4).to_i # -> -2 + # Rational(-7,4).to_i # -> -1 # (-1.75).to_i # -> -1 # # In other words: # Rational(-7,4) == -1.75 # -> true - # Rational(-7,4).to_i == (-1.75).to_i # false + # Rational(-7,4).to_i == (-1.75).to_i # -> true # diff --git a/marshal.c b/marshal.c index cf7a312b9c..298f78ad86 100644 --- a/marshal.c +++ b/marshal.c @@ -84,6 +84,16 @@ static ID s_dump, s_load, s_mdump, s_mload; static ID s_dump_data, s_load_data, s_alloc; static ID s_getc, s_read, s_write, s_binmode; +static void +reentrant_check(obj, sym) + VALUE obj; + ID sym; +{ + if (obj && RBASIC(obj)->klass) { + rb_raise(rb_eRuntimeError, "%s reentered", rb_id2name(sym)); + } +} + struct dump_arg { VALUE obj; VALUE str, dest; @@ -505,6 +515,7 @@ w_object(obj, arg, limit) volatile VALUE v; v = rb_funcall(obj, s_mdump, 0, 0); + reentrant_check(arg->str, s_mdump); w_class(TYPE_USRMARSHAL, obj, arg, Qfalse); w_object(v, arg, limit); if (ivtbl) w_ivar(0, &c_arg); @@ -514,6 +525,7 @@ w_object(obj, arg, limit) VALUE v; v = rb_funcall(obj, s_dump, 1, INT2NUM(limit)); + reentrant_check(arg->str, s_dump); if (TYPE(v) != T_STRING) { rb_raise(rb_eTypeError, "_dump() must return string"); } @@ -658,6 +670,7 @@ w_object(obj, arg, limit) rb_obj_classname(obj)); } v = rb_funcall(obj, s_dump_data, 0); + reentrant_check(arg->str, s_dump_data); w_class(TYPE_DATA, obj, arg, Qtrue); w_object(v, arg, limit); } @@ -690,11 +703,13 @@ static VALUE dump_ensure(arg) struct dump_arg *arg; { + if (RBASIC(arg->str)->klass) return; /* ignore reentrant */ st_free_table(arg->symbols); st_free_table(arg->data); if (arg->taint) { OBJ_TAINT(arg->str); } + return 0; } @@ -747,20 +762,21 @@ marshal_dump(argc, argv) else port = a1; } arg.dest = 0; + arg.str = rb_str_buf_new(0); + RBASIC(arg.str)->klass = 0; if (!NIL_P(port)) { if (!rb_respond_to(port, s_write)) { type_error: rb_raise(rb_eTypeError, "instance of IO needed"); } - arg.str = rb_str_buf_new(0); arg.dest = port; if (rb_respond_to(port, s_binmode)) { rb_funcall2(port, s_binmode, 0, 0); + reentrant_check(arg.str, s_dump_data); } } else { - port = rb_str_buf_new(0); - arg.str = port; + port = arg.str; } arg.symbols = st_init_numtable(); @@ -774,6 +790,7 @@ marshal_dump(argc, argv) w_byte(MARSHAL_MINOR, &arg); rb_ensure(dump, (VALUE)&c_arg, dump_ensure, (VALUE)&arg); + RBASIC(arg.str)->klass = rb_cString; return port; } @@ -806,6 +823,7 @@ r_byte(arg) else { VALUE src = arg->src; VALUE v = rb_funcall2(src, s_getc, 0, 0); + reentrant_check(arg->data, s_getc); if (NIL_P(v)) rb_eof_error(); c = (unsigned char)FIX2INT(v); } @@ -886,6 +904,7 @@ r_bytes0(len, arg) VALUE src = arg->src; VALUE n = LONG2NUM(len); str = rb_funcall2(src, s_read, 1, &n); + reentrant_check(arg->data, s_read); if (NIL_P(str)) goto too_short; StringValue(str); if (RSTRING(str)->len != len) goto too_short; @@ -1236,6 +1255,7 @@ r_object0(arg, proc, ivp, extmod) *ivp = Qfalse; } v = rb_funcall(klass, s_load, 1, data); + reentrant_check(arg->data, s_load); r_entry(v, arg); } break; @@ -1259,6 +1279,7 @@ r_object0(arg, proc, ivp, extmod) r_entry(v, arg); data = r_object(arg); rb_funcall(v, s_mload, 1, data); + reentrant_check(arg->data, s_mload); } break; @@ -1285,6 +1306,7 @@ r_object0(arg, proc, ivp, extmod) warn = Qfalse; } v = rb_funcall(klass, s_alloc, 0); + reentrant_check(arg->data, s_alloc); } else { v = rb_obj_alloc(klass); @@ -1299,6 +1321,7 @@ r_object0(arg, proc, ivp, extmod) rb_class2name(klass)); } rb_funcall(v, s_load_data, 1, r_object0(arg, 0, 0, extmod)); + reentrant_check(arg->data, s_load_data); } break; @@ -1341,7 +1364,9 @@ r_object0(arg, proc, ivp, extmod) break; } if (proc) { - rb_funcall(proc, rb_intern("call"), 1, v); + ID s_call = + rb_funcall(proc, s_call, 1, v); + reentrant_check(arg->data, s_call); } return v; } @@ -1364,6 +1389,7 @@ static VALUE load_ensure(arg) struct load_arg *arg; { + if (RBASIC(arg->data)->klass) return; /* ignore reentrant */ st_free_table(arg->symbols); return 0; } @@ -1405,6 +1431,7 @@ marshal_load(argc, argv) } arg.src = port; arg.offset = 0; + arg.data = 0; major = r_byte(&arg); minor = r_byte(&arg); @@ -1421,9 +1448,11 @@ marshal_load(argc, argv) arg.symbols = st_init_numtable(); arg.data = rb_hash_new(); + RBASIC(arg.data)->klass = 0; if (NIL_P(proc)) arg.proc = 0; else arg.proc = proc; v = rb_ensure(load, (VALUE)&arg, load_ensure, (VALUE)&arg); + RBASIC(arg.data)->klass = rb_cHash; return v; } diff --git a/object.c b/object.c index d45934b877..2777843c35 100644 --- a/object.c +++ b/object.c @@ -2354,6 +2354,7 @@ rb_cstr_to_dbl(p, badcheck) else { while (ISSPACE(*p) || *p == '_') p++; } + errno = 0; d = strtod(p, &end); if (errno == ERANGE) { OutOfRange(); diff --git a/version.h b/version.h index 39ae275fee..c4e0f53dc8 100644 --- a/version.h +++ b/version.h @@ -1,7 +1,7 @@ #define RUBY_VERSION "1.8.7" -#define RUBY_RELEASE_DATE "2008-05-23" +#define RUBY_RELEASE_DATE "2008-05-25" #define RUBY_VERSION_CODE 187 -#define RUBY_RELEASE_CODE 20080523 +#define RUBY_RELEASE_CODE 20080525 #define RUBY_PATCHLEVEL 0 #define RUBY_VERSION_MAJOR 1 @@ -9,7 +9,7 @@ #define RUBY_VERSION_TEENY 7 #define RUBY_RELEASE_YEAR 2008 #define RUBY_RELEASE_MONTH 5 -#define RUBY_RELEASE_DAY 23 +#define RUBY_RELEASE_DAY 25 #ifdef RUBY_EXTERN RUBY_EXTERN const char ruby_version[]; -- cgit v1.2.3