diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2002-06-11 07:02:23 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2002-06-11 07:02:23 +0000 |
commit | 22010642b24f2b3f2bfef1324c61764dcd8cc2fd (patch) | |
tree | dd8a8256032a8c6ef07ac3ae8c6464c11282f104 | |
parent | a5fd4cec841d2ae50d2aaff8f564da4842d0984c (diff) |
* eval.c (rb_eval): ruby_frame->last_func may be null, if it's
called outside of a method.
* parse.y (arg): use INT2NUM, not INT2FIX for tUMINUS.
* parse.y (arg): unnecessary negative tPOW treatment.
* parse.y (tokadd_escape): wrong backslash escapement.
* parse.y (stmt,arg): too much void value check.
* parse.y (stmt,arg): need to check void value on rules which does
not use node_assign().
* ext/socket/socket.c (ipaddr): need not to taint hostnames.
* range.c (range_include): should be based on "<=>", whereas
member? still is based on "each".
* range.c (range_min,range_max): redefine methods based on "<=>".
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2548 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 29 | ||||
-rw-r--r-- | bignum.c | 10 | ||||
-rw-r--r-- | eval.c | 11 | ||||
-rw-r--r-- | ext/socket/socket.c | 50 | ||||
-rw-r--r-- | lib/rational.rb | 6 | ||||
-rw-r--r-- | parse.y | 41 | ||||
-rw-r--r-- | range.c | 99 | ||||
-rw-r--r-- | sample/biorhythm.rb | 4 |
8 files changed, 162 insertions, 88 deletions
@@ -40,15 +40,37 @@ Mon Jun 10 19:02:19 2002 Nobuyoshi Nakada <nobu.nokada@softhome.net> * parse.y (yylex): `0_' should be an error. (ruby-bugs-ja:PR#249) +Mon Jun 10 01:53:54 2002 Yukihiro Matsumoto <matz@ruby-lang.org> + + * eval.c (rb_eval): ruby_frame->last_func may be null, if it's + called outside of a method. + + * parse.y (arg): use INT2NUM, not INT2FIX for tUMINUS. + + * parse.y (arg): unnecessary negative tPOW treatment. + + * parse.y (tokadd_escape): wrong backslash escapement. + Sun Jun 9 17:40:41 2002 Takaaki Tateishi <ttate@kt.jaist.ac.jp> * ext/dl: change the callback mechanism. +Sat Jun 8 00:48:38 2002 Yukihiro Matsumoto <matz@ruby-lang.org> + + * parse.y (stmt,arg): too much void value check. + + * parse.y (stmt,arg): need to check void value on rules which does + not use node_assign(). + Thu Jun 6 19:50:39 2002 KONISHI Hiromasa <H_Konishi@ruby-lang.org> * sample/biorhythm.rb (getPosiiton,etc) fix at changing Date module ( Date is changed Fixnum to Rational ) +Thu Jun 6 17:42:39 2002 Yukihiro Matsumoto <matz@ruby-lang.org> + + * ext/socket/socket.c (ipaddr): need not to taint hostnames. + Thu Jun 6 12:04:30 2002 NAKAMURA Usaku <usa@ruby-lang.org> * win32/Makefile.sub (config.status): use sub! instead of []= because @@ -58,6 +80,13 @@ Thu Jun 6 11:42:15 2002 Nobuyoshi Nakada <nobu.nokada@softhome.net> * lib/thread.rb (Queue::pop): get rid of race condition. +Tue Jun 4 23:09:24 2002 Yukihiro Matsumoto <matz@ruby-lang.org> + + * range.c (range_include): should be based on "<=>", whereas + member? still is based on "each". + + * range.c (range_min,range_max): redefine methods based on "<=>". + Tue Jun 4 18:28:37 2002 WATANABE Hirofumi <eban@ruby-lang.org> * ext/socket/extconf.rb: The IPv6 stack of Cygwin is still incomplete. @@ -1352,20 +1352,18 @@ rb_big_pow(x, y) case T_FIXNUM: yy = NUM2LONG(y); if (yy > 0) { - VALUE z; + VALUE z = x; - z = x; for (;;) { - yy = yy - 1; + yy -= 1; if (yy == 0) break; while (yy % 2 == 0) { - yy = yy / 2; + yy /= 2; x = rb_big_mul(x, x); } z = rb_big_mul(z, x); } - if (!FIXNUM_P(z)) z = bignorm(z); - return z; + return bignorm(z); } d = (double)yy; break; @@ -2745,9 +2745,14 @@ rb_eval(self, n) TMP_PROTECT; if (ruby_frame->last_class == 0) { - rb_name_error(ruby_frame->last_func, - "superclass method `%s' disabled", - rb_id2name(ruby_frame->last_func)); + if (ruby_frame->last_func) { + rb_name_error(ruby_frame->last_func, + "superclass method `%s' disabled", + rb_id2name(ruby_frame->last_func)); + } + else { + rb_raise(rb_eNoMethodError, "super called outside of method"); + } } if (nd_type(node) == NODE_ZSUPER) { argc = ruby_frame->argc; diff --git a/ext/socket/socket.c b/ext/socket/socket.c index 1a27e481a2..d0e3b9b574 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -336,7 +336,7 @@ bsock_getsockopt(sock, lev, optname) if (getsockopt(fileno(fptr->f), level, option, buf, &len) < 0) rb_sys_fail(fptr->path); - return rb_tainted_str_new(buf, len); + return rb_str_new(buf, len); #else rb_notimplement(); #endif @@ -353,7 +353,7 @@ bsock_getsockname(sock) GetOpenFile(sock, fptr); if (getsockname(fileno(fptr->f), (struct sockaddr*)buf, &len) < 0) rb_sys_fail("getsockname(2)"); - return rb_tainted_str_new(buf, len); + return rb_str_new(buf, len); } static VALUE @@ -367,7 +367,7 @@ bsock_getpeername(sock) GetOpenFile(sock, fptr); if (getpeername(fileno(fptr->f), (struct sockaddr*)buf, &len) < 0) rb_sys_fail("getpeername(2)"); - return rb_tainted_str_new(buf, len); + return rb_str_new(buf, len); } static VALUE @@ -480,7 +480,7 @@ s_recvfrom(sock, argc, argv, from) return rb_assoc_new(str, unixaddr((struct sockaddr_un*)buf)); #endif case RECV_SOCKET: - return rb_assoc_new(str, rb_tainted_str_new(buf, alen)); + return rb_assoc_new(str, rb_str_new(buf, alen)); default: rb_bug("s_recvfrom called with bad value"); } @@ -530,7 +530,7 @@ mkipaddr(addr) char buf[1024]; mkipaddr0(addr, buf, sizeof(buf)); - return rb_tainted_str_new2(buf); + return rb_str_new2(buf); } static void @@ -673,14 +673,14 @@ ipaddr(sockaddr) if (error) { rb_raise(rb_eSocket, "getnameinfo: %s", gai_strerror(error)); } - addr1 = rb_tainted_str_new2(hbuf); + addr1 = rb_str_new2(hbuf); } error = getnameinfo(sockaddr, SA_LEN(sockaddr), hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), NI_NUMERICHOST | NI_NUMERICSERV); if (error) { rb_raise(rb_eSocket, "getnameinfo: %s", gai_strerror(error)); } - addr2 = rb_tainted_str_new2(hbuf); + addr2 = rb_str_new2(hbuf); if (do_not_reverse_lookup) { addr1 = addr2; } @@ -1078,11 +1078,11 @@ tcp_s_gethostbyname(obj, host) size_t size; ary = rb_ary_new(); - rb_ary_push(ary, rb_tainted_str_new2(h->h_name)); + rb_ary_push(ary, rb_str_new2(h->h_name)); names = rb_ary_new(); rb_ary_push(ary, names); for (pch = h->h_aliases; *pch; pch++) { - rb_ary_push(names, rb_tainted_str_new2(*pch)); + rb_ary_push(names, rb_str_new2(*pch)); } rb_ary_push(ary, INT2NUM(h->h_addrtype)); #ifdef h_addr @@ -1464,7 +1464,7 @@ unix_path(sock) rb_sys_fail(0); fptr->path = strdup(addr.sun_path); } - return rb_tainted_str_new2(fptr->path); + return rb_str_new2(fptr->path); } static VALUE @@ -1677,7 +1677,7 @@ unixaddr(sockaddr) struct sockaddr_un *sockaddr; { return rb_assoc_new(rb_str_new2("AF_UNIX"), - rb_tainted_str_new2(sockaddr->sun_path)); + rb_str_new2(sockaddr->sun_path)); } static VALUE @@ -1931,7 +1931,7 @@ sock_accept(sock) GetOpenFile(sock, fptr); sock2 = s_accept(rb_cSocket,fileno(fptr->f),(struct sockaddr*)buf,&len); - return rb_assoc_new(sock2, rb_tainted_str_new(buf, len)); + return rb_assoc_new(sock2, rb_str_new(buf, len)); } static VALUE @@ -1946,7 +1946,7 @@ sock_sysaccept(sock) GetOpenFile(sock, fptr); sock2 = s_accept(0,fileno(fptr->f),(struct sockaddr*)buf,&len); - return rb_assoc_new(sock2, rb_tainted_str_new(buf, len)); + return rb_assoc_new(sock2, rb_str_new(buf, len)); } #ifdef HAVE_GETHOSTNAME @@ -1961,7 +1961,7 @@ sock_gethostname(obj) rb_sys_fail("gethostname"); buf[sizeof buf - 1] = '\0'; - return rb_tainted_str_new2(buf); + return rb_str_new2(buf); } #else #ifdef HAVE_UNAME @@ -1976,7 +1976,7 @@ sock_gethostname(obj) rb_secure(3); uname(&un); - return rb_tainted_str_new2(un.nodename); + return rb_str_new2(un.nodename); } #else static VALUE @@ -2004,19 +2004,19 @@ sock_mkhostent(h) #endif } ary = rb_ary_new(); - rb_ary_push(ary, rb_tainted_str_new2(h->h_name)); + rb_ary_push(ary, rb_str_new2(h->h_name)); names = rb_ary_new(); rb_ary_push(ary, names); for (pch = h->h_aliases; *pch; pch++) { - rb_ary_push(names, rb_tainted_str_new2(*pch)); + rb_ary_push(names, rb_str_new2(*pch)); } rb_ary_push(ary, INT2NUM(h->h_addrtype)); #ifdef h_addr for (pch = h->h_addr_list; *pch; pch++) { - rb_ary_push(ary, rb_tainted_str_new(*pch, h->h_length)); + rb_ary_push(ary, rb_str_new(*pch, h->h_length)); } #else - rb_ary_push(ary, rb_tainted_str_new(h->h_addr, h->h_length)); + rb_ary_push(ary, rb_str_new(h->h_addr, h->h_length)); #endif return ary; @@ -2304,7 +2304,7 @@ sock_s_getnameinfo(argc, argv) } freeaddrinfo(res); } - return rb_assoc_new(rb_tainted_str_new2(hbuf), rb_tainted_str_new2(pbuf)); + return rb_assoc_new(rb_str_new2(hbuf), rb_str_new2(pbuf)); error_exit_addr: if (res) freeaddrinfo(res); @@ -2334,13 +2334,16 @@ sock_s_unpack_sockaddr_in(self, addr) VALUE self, addr; { struct sockaddr_in * sockaddr; + VALUE host; sockaddr = (struct sockaddr_in*)StringValuePtr(addr); if (RSTRING(addr)->len != sizeof(struct sockaddr_in)) { rb_raise(rb_eTypeError, "sockaddr_in size differs - %d required; %d given", RSTRING(addr)->len, sizeof(struct sockaddr_in)); } - return rb_assoc_new(INT2NUM(ntohs(sockaddr->sin_port)), mkipaddr(sockaddr)); + host = mkipaddr(sockaddr); + OBJ_INFECT(host, addr); + return rb_assoc_new(INT2NUM(ntohs(sockaddr->sin_port)), host); } #ifdef HAVE_SYS_UN_H @@ -2365,6 +2368,7 @@ sock_s_unpack_sockaddr_un(self, addr) VALUE self, addr; { struct sockaddr_un * sockaddr; + VALUE path; sockaddr = (struct sockaddr_un*)StringValuePtr(addr); if (RSTRING(addr)->len != sizeof(struct sockaddr_un)) { @@ -2372,7 +2376,9 @@ sock_s_unpack_sockaddr_un(self, addr) RSTRING(addr)->len, sizeof(struct sockaddr_un)); } /* xxx: should I check against sun_path size? */ - return rb_tainted_str_new2(sockaddr->sun_path); + path = rb_str_new2(sockaddr->sun_path); + OBJ_INFECT(path, addr); + return path; } #endif diff --git a/lib/rational.rb b/lib/rational.rb index decf26b1ba..ff35f36a3e 100644 --- a/lib/rational.rb +++ b/lib/rational.rb @@ -8,7 +8,7 @@ # -- # Usage: # class Rational < Numeric -# (include Compareable) +# (include Comparable) # # Rational(a, b) --> a/b # @@ -47,7 +47,7 @@ class Rational < Numeric @RCS_ID='-$Id: rational.rb,v 1.7 1999/08/24 12:49:28 keiju Exp keiju $-' def Rational.reduce(num, den = 1) - raise ZeroDivisionError, "denometor is 0" if den == 0 + raise ZeroDivisionError, "denominator is 0" if den == 0 if den < 0 num = -num @@ -132,7 +132,7 @@ class Rational < Numeric den = @denominator * a.numerator Rational(num, den) elsif a.kind_of?(Integer) - raise ZeroDivisionError, "devided by 0" if a == 0 + raise ZeroDivisionError, "divided by 0" if a == 0 self / Rational.new!(a, 1) elsif a.kind_of?(Float) Float(self) / a @@ -435,7 +435,6 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem } | lhs '=' command_call { - value_expr($3); $$ = node_assign($1, $3); } | mlhs '=' command_call @@ -446,6 +445,7 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem } | var_lhs tOP_ASGN command_call { + value_expr($3); if ($1) { ID vid = $1->nd_vid; if ($2 == tOROP) { @@ -471,8 +471,10 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem } | primary_value '[' aref_args ']' tOP_ASGN command_call { - NODE *args = NEW_LIST($6); + NODE *args; + value_expr($5); + args = NEW_LIST($6); $3 = list_append($3, NEW_NIL()); list_concat(args, $3); if ($5 == tOROP) { @@ -486,6 +488,7 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem } | primary_value '.' tIDENTIFIER tOP_ASGN command_call { + value_expr($5); if ($4 == tOROP) { $4 = 0; } @@ -497,6 +500,7 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem } | primary_value '.' tCONSTANT tOP_ASGN command_call { + value_expr($5); if ($4 == tOROP) { $4 = 0; } @@ -508,6 +512,7 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem } | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call { + value_expr($5); if ($4 == tOROP) { $4 = 0; } @@ -805,11 +810,11 @@ reswords : k__LINE__ | k__FILE__ | klBEGIN | klEND arg : lhs '=' arg { - value_expr($3); $$ = node_assign($1, $3); } | var_lhs tOP_ASGN arg { + value_expr($3); if ($1) { ID vid = $1->nd_vid; if ($2 == tOROP) { @@ -835,8 +840,10 @@ arg : lhs '=' arg } | primary_value '[' aref_args ']' tOP_ASGN arg { - NODE *args = NEW_LIST($6); + NODE *args; + value_expr($6); + args = NEW_LIST($6); $3 = list_append($3, NEW_NIL()); list_concat(args, $3); if ($5 == tOROP) { @@ -850,6 +857,7 @@ arg : lhs '=' arg } | primary_value '.' tIDENTIFIER tOP_ASGN arg { + value_expr($5); if ($4 == tOROP) { $4 = 0; } @@ -861,6 +869,7 @@ arg : lhs '=' arg } | primary_value '.' tCONSTANT tOP_ASGN arg { + value_expr($5); if ($4 == tOROP) { $4 = 0; } @@ -872,6 +881,7 @@ arg : lhs '=' arg } | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg { + value_expr($5); if ($4 == tOROP) { $4 = 0; } @@ -916,25 +926,7 @@ arg : lhs '=' arg } | arg tPOW arg { - int need_negate = Qfalse; - - if (nd_type($1) == NODE_LIT) { - switch (TYPE($1->nd_lit)) { - case T_FIXNUM: - case T_FLOAT: - case T_BIGNUM: - if (RTEST(rb_funcall($1->nd_lit,'<',1,INT2FIX(0)))) { - $1->nd_lit = rb_funcall($1->nd_lit,rb_intern("-@"),0,0); - need_negate = Qtrue; - } - default: - break; - } - } $$ = call_op($1, tPOW, 1, $3); - if (need_negate) { - $$ = call_op($$, tUMINUS, 0, 0); - } } | tUPLUS arg { @@ -950,7 +942,7 @@ arg : lhs '=' arg if ($2 && nd_type($2) == NODE_LIT && FIXNUM_P($2->nd_lit)) { long i = FIX2LONG($2->nd_lit); - $2->nd_lit = INT2FIX(-i); + $2->nd_lit = INT2NUM(-i); $$ = $2; } else { @@ -2540,7 +2532,7 @@ tokadd_escape(term) return -1; default: - if (c != '/' || c != term) + if (c != '\\' || c != term) tokadd('\\'); tokadd(c); } @@ -5517,3 +5509,4 @@ rb_lastline_set(val) special_local_set('_', val); } } +%% @@ -37,8 +37,8 @@ range_failed() } static void -range_init(obj, beg, end, exclude_end) - VALUE obj, beg, end; +range_init(range, beg, end, exclude_end) + VALUE range, beg, end; int exclude_end; { VALUE args[2]; @@ -48,9 +48,9 @@ range_init(obj, beg, end, exclude_end) rb_rescue(range_check, (VALUE)args, range_failed, 0); } - SET_EXCL(obj, exclude_end); - rb_ivar_set(obj, id_beg, beg); - rb_ivar_set(obj, id_end, end); + SET_EXCL(range, exclude_end); + rb_ivar_set(range, id_beg, beg); + rb_ivar_set(range, id_end, end); } VALUE @@ -58,26 +58,26 @@ rb_range_new(beg, end, exclude_end) VALUE beg, end; int exclude_end; { - VALUE obj = rb_obj_alloc(rb_cRange); + VALUE range = rb_obj_alloc(rb_cRange); - range_init(obj, beg, end, exclude_end); - return obj; + range_init(range, beg, end, exclude_end); + return range; } static VALUE -range_initialize(argc, argv, obj) +range_initialize(argc, argv, range) int argc; VALUE *argv; - VALUE obj; + VALUE range; { VALUE beg, end, flags; rb_scan_args(argc, argv, "21", &beg, &end, &flags); /* Ranges are immutable, so that they should be initialized only once. */ - if (rb_ivar_defined(obj, id_beg)) { + if (rb_ivar_defined(range, id_beg)) { rb_name_error(rb_intern("initialize"), "`initialize' called twice"); } - range_init(obj, beg, end, RTEST(flags)); + range_init(range, beg, end, RTEST(flags)); return Qnil; } @@ -315,17 +315,17 @@ range_each(range) } static VALUE -range_first(obj) - VALUE obj; +range_first(range) + VALUE range; { - return rb_ivar_get(obj, id_beg); + return rb_ivar_get(range, id_beg); } static VALUE -range_last(obj) - VALUE obj; +range_last(range) + VALUE range; { - return rb_ivar_get(obj, id_end); + return rb_ivar_get(range, id_end); } VALUE @@ -380,6 +380,35 @@ rb_range_beg_len(range, begp, lenp, len, err) } static VALUE +range_min(range) + VALUE range; + +{ + VALUE b, e, step; + long unit; + + b = rb_ivar_get(range, id_beg); + e = rb_ivar_get(range, id_end); + + if (r_le(b, e)) return b; + return e; +} + +static VALUE +range_max(range) + VALUE range; +{ + VALUE b, e, step; + long unit; + + b = rb_ivar_get(range, id_beg); + e = rb_ivar_get(range, id_end); + + if (r_gt(b, e)) return b; + return e; +} + +static VALUE range_to_s(range) VALUE range; { @@ -431,15 +460,9 @@ range_member(range, val) beg = rb_ivar_get(range, id_beg); end = rb_ivar_get(range, id_end); - if (rb_obj_is_kind_of(beg, rb_cNumeric) || !rb_respond_to(beg, id_succ)) { - if (r_gt(beg, val)) return Qfalse; - if (EXCL(range)) { - if (r_lt(val, end)) return Qtrue; - } - else { - if (r_le(val, end)) return Qtrue; - } - return Qfalse; + if (!rb_respond_to(beg, id_succ)) { + rb_raise(rb_eTypeError, "cannot iterate from %s", + rb_class2name(CLASS_OF(beg))); } args[0] = val; args[1] = Qfalse; @@ -447,6 +470,24 @@ range_member(range, val) return args[1]; } +static VALUE +range_include(range, val) + VALUE range, val; +{ + VALUE beg, end; + + beg = rb_ivar_get(range, id_beg); + end = rb_ivar_get(range, id_end); + if (r_gt(beg, val)) return Qfalse; + if (EXCL(range)) { + if (r_lt(val, end)) return Qtrue; + } + else { + if (r_le(val, end)) return Qtrue; + } + return Qfalse; +} + void Init_Range() { @@ -463,6 +504,8 @@ Init_Range() rb_define_method(rb_cRange, "last", range_last, 0); rb_define_method(rb_cRange, "begin", range_first, 0); rb_define_method(rb_cRange, "end", range_last, 0); + rb_define_method(rb_cRange, "min", range_min, 0); + rb_define_method(rb_cRange, "max", range_max, 0); rb_define_method(rb_cRange, "to_s", range_to_s, 0); rb_define_method(rb_cRange, "inspect", range_inspect, 0); rb_define_alias(rb_cRange, "to_ary", "to_a"); @@ -470,7 +513,7 @@ Init_Range() rb_define_method(rb_cRange, "exclude_end?", range_exclude_end_p, 0); rb_define_method(rb_cRange, "member?", range_member, 1); - rb_define_method(rb_cRange, "include?", range_member, 1); + rb_define_method(rb_cRange, "include?", range_include, 1); id_cmp = rb_intern("<=>"); id_succ = rb_intern("succ"); diff --git a/sample/biorhythm.rb b/sample/biorhythm.rb index 8fc08c6912..1c6d6fbad1 100644 --- a/sample/biorhythm.rb +++ b/sample/biorhythm.rb @@ -51,7 +51,7 @@ end def getPosition(z) pi = Math::PI - z = Integer(z) + z = Integer(z) phys = (50.0 * (1.0 + sin((z / 23.0 - (z / 23)) * 360.0 * pi / 180.0))).to_i emot = (50.0 * (1.0 + sin((z / 28.0 - (z / 28)) * 360.0 * pi / 180.0))).to_i geist =(50.0 * (1.0 + sin((z / 33.0 - (z / 33)) * 360.0 * pi / 180.0))).to_i @@ -59,7 +59,7 @@ def getPosition(z) end def parsedate(s) - ParseDate::parsedate(s).indexes(0, 1, 2) + ParseDate::parsedate(s).select(0, 1, 2) end def name_of_week(date) |