diff --git a/ChangeLog b/ChangeLog index 779d07dfd8..c29ae93d64 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Thu Jan 22 01:46:32 2004 Yukihiro Matsumoto + + * parse.y (newline_node): do not use NODE_NEWLINE node anymore, + use NEWLINE flag instead. + Thu Jan 22 01:12:12 2004 Siena. * missing/os2.c (chdir, getcwd): @@ -57,6 +62,14 @@ Wed Jan 21 16:01:26 2004 Nobuyoshi Nakada * ext/digest/rmd160/extconf.rb: have_library appends found library. +Wed Jan 21 11:36:00 2004 Yukihiro Matsumoto + + * ext/socket/socket.c (sock_gethostbyname): returns host if + ai_canonname is NULL. (ruby-bugs PR#1243) + + * parse.y (block_append): update nd_end for "real" head node. + [ruby-list:39058] + Tue Jan 20 14:48:28 2004 GOTOU Yuuzou * ext/openssl/extconf.rb: should check instead @@ -85,6 +98,11 @@ Tue Jan 20 04:41:58 2004 Nobuyoshi Nakada * test/ruby/test_marshal.rb (MarshalTestLibtest_singleton): test for [ruby-dev:22588]. +Tue Jan 20 02:38:13 2004 Yukihiro Matsumoto + + * marshal.c (w_class): should not dump singleton class. + [ruby-dev:22631] + Tue Jan 20 02:49:22 2004 GOTOU Yuuzou * ext/openssl/extconf.rb: add check for OpenSSL version. diff --git a/eval.c b/eval.c index e03c2fd569..24cf02c9c4 100644 --- a/eval.c +++ b/eval.c @@ -2358,10 +2358,6 @@ is_defined(self, node, buf) } break; - case NODE_NEWLINE: - node = node->nd_next; - goto again; - default: PUSH_TAG(PROT_NONE); if ((state = EXEC_TAG()) == 0) { @@ -2468,7 +2464,7 @@ call_trace_func(event, node, self, id, klass) if (id == ID_ALLOCATOR) return; if (!(node_save = ruby_current_node)) { - node_save = NEW_NEWLINE(0); + node_save = NEW_BEGIN(0); } tracing = 1; prev = ruby_frame; @@ -2686,6 +2682,11 @@ rb_eval(self, n) if (!node) RETURN(Qnil); ruby_current_node = node; + if (trace_func && FL_TEST(node, NODE_NEWLINE)) { + call_trace_func("line", node, self, + ruby_frame->last_func, + ruby_frame->last_class); + } switch (nd_type(node)) { case NODE_BLOCK: if (contnode) { @@ -3888,15 +3889,6 @@ rb_eval(self, n) } break; - case NODE_NEWLINE: - if (trace_func) { - call_trace_func("line", node, self, - ruby_frame->last_func, - ruby_frame->last_class); - } - node = node->nd_next; - goto again; - default: rb_bug("unknown node type %d", nd_type(node)); } @@ -6376,7 +6368,7 @@ rb_load(fname, wrap) last_func = ruby_frame->last_func; last_node = ruby_current_node; if (!ruby_current_node && ruby_sourcefile) { - last_node = NEW_NEWLINE(0); + last_node = NEW_BEGIN(0); } ruby_current_node = 0; if (state == 0) { diff --git a/ext/socket/socket.c b/ext/socket/socket.c index c1273a87d0..0e2ddb6120 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -1026,43 +1026,47 @@ socks_s_close(sock) #endif static VALUE -make_hostent(addr, ipaddr) - struct addrinfo *addr; +sock_gethostbyname(host, ipaddr) + VALUE host; VALUE (*ipaddr) _((struct sockaddr*, size_t)); { + struct addrinfo *addr; struct addrinfo *ai; struct hostent *h; VALUE ary, names; + char *hostname; char **pch; + addr = sock_addrinfo(host, Qnil, SOCK_STREAM, AI_CANONNAME); ary = rb_ary_new(); if (addr->ai_canonname) { - rb_ary_push(ary, rb_str_new2(addr->ai_canonname)); + hostname = addr->ai_canonname; } else { - rb_ary_push(ary, Qnil); + hostname = StringValuePtr(host); } - if (addr->ai_canonname) { + rb_ary_push(ary, rb_str_new2(hostname)); #if defined(HAVE_GETIPNODEBYNAME) + { int error; - h = getipnodebyname(addr->ai_canonname, addr->ai_family, AI_ALL, &error); + h = getipnodebyname(hostname, addr->ai_family, AI_ALL, &error); + } #elif defined(HAVE_GETHOSTBYNAME2) - h = gethostbyname2(addr->ai_canonname, addr->ai_family); + h = gethostbyname2(hostname, addr->ai_family); #else - h = gethostbyname(addr->ai_canonname); + h = gethostbyname(hostname); #endif - if (h) { - names = rb_ary_new(); - if (h->h_aliases != NULL) { - for (pch = h->h_aliases; *pch; pch++) { - rb_ary_push(names, rb_str_new2(*pch)); - } + if (h) { + names = rb_ary_new(); + if (h->h_aliases != NULL) { + for (pch = h->h_aliases; *pch; pch++) { + rb_ary_push(names, rb_str_new2(*pch)); } -#if defined(HAVE_GETIPNODEBYNAME) - freehostent(h); -#endif } +#if defined(HAVE_GETIPNODEBYNAME) + freehostent(h); +#endif } else { names = rb_ary_new2(0); @@ -1089,7 +1093,7 @@ tcp_s_gethostbyname(obj, host) VALUE obj, host; { rb_secure(3); - return make_hostent(sock_addrinfo(host, Qnil, SOCK_STREAM, AI_CANONNAME), tcp_sockaddr); + return sock_gethostbyname(host, tcp_sockaddr); } static VALUE @@ -1981,6 +1985,9 @@ make_addrinfo(res0) base = rb_ary_new(); for (res = res0; res; res = res->ai_next) { ary = ipaddr(res->ai_addr); + if (res->ai_canonname) { + RARRAY(ary)->ptr[2] = rb_str_new2(res->ai_canonname); + } rb_ary_push(ary, INT2FIX(res->ai_family)); rb_ary_push(ary, INT2FIX(res->ai_socktype)); rb_ary_push(ary, INT2FIX(res->ai_protocol)); @@ -2002,7 +2009,7 @@ sock_s_gethostbyname(obj, host) VALUE obj, host; { rb_secure(3); - return make_hostent(sock_addrinfo(host, Qnil, SOCK_STREAM, AI_CANONNAME), sock_sockaddr); + return sock_gethostbyname(host, sock_sockaddr); } static VALUE diff --git a/gc.c b/gc.c index c521e58fea..b023ad2298 100644 --- a/gc.c +++ b/gc.c @@ -777,7 +777,6 @@ gc_mark_children(ptr, lev) case NODE_SUPER: /* 3 */ case NODE_FCALL: case NODE_DEFN: - case NODE_NEWLINE: ptr = (VALUE)obj->as.node.u3.node; goto again; @@ -1431,7 +1430,7 @@ Init_stack(addr) STACK_LEVEL_MAX = (rlim.rlim_cur - space) / sizeof(VALUE); } } -#ifdef __ia64__ +#if defined(__ia64__) && (!defined(__GNUC__) || __GNUC__ < 2 || defined(__OPTIMIZE__)) /* ruby crashes on IA64 if compiled with optimizer on */ /* when if STACK_LEVEL_MAX is greater than this magic number */ /* I know this is a kludge. I suspect optimizer bug */ diff --git a/lib/find.rb b/lib/find.rb index 9ca39cabcb..e94d5c2c70 100644 --- a/lib/find.rb +++ b/lib/find.rb @@ -36,7 +36,8 @@ module Find paths.collect!{|d| d.dup} while file = paths.shift catch(:prune) do - yield file + yield file.dup + file.untaint begin if File.lstat(file).directory? then d = Dir.open(file) diff --git a/lib/net/telnet.rb b/lib/net/telnet.rb index 095be45334..6e50d17572 100644 --- a/lib/net/telnet.rb +++ b/lib/net/telnet.rb @@ -706,7 +706,7 @@ module Net # :nodoc: end if block_given? - line = waitfor(/login[: ]*\z/n){|c| yield c } + line = waitfor(/[Ll]ogin[: ]*\z/n){|c| yield c } if password line += cmd({"String" => username, "Match" => /Password[: ]*\z/n}){|c| yield c } @@ -715,7 +715,7 @@ module Net # :nodoc: line += cmd(username){|c| yield c } end else - line = waitfor(/login[: ]*\z/n) + line = waitfor(/[Ll]ogin[: ]*\z/n) if password line += cmd({"String" => username, "Match" => /Password[: ]*\z/n}) diff --git a/marshal.c b/marshal.c index a7d8b0abca..90c0788b83 100644 --- a/marshal.c +++ b/marshal.c @@ -400,7 +400,7 @@ w_class(type, obj, arg, check) VALUE klass = CLASS_OF(obj); w_extended(klass, arg, check); w_byte(type, arg); - path = RSTRING(class2path(klass))->ptr; + path = RSTRING(class2path(rb_class_real(klass)))->ptr; w_unique(path, arg); } diff --git a/node.h b/node.h index c06336e17f..e23c3e9ed5 100644 --- a/node.h +++ b/node.h @@ -113,7 +113,6 @@ enum node_type { NODE_TRUE, NODE_FALSE, NODE_DEFINED, - NODE_NEWLINE, NODE_POSTEXE, #ifdef C_ALLOCA NODE_ALLOCA, @@ -155,10 +154,12 @@ typedef struct RNode { #define RNODE(obj) (R_CAST(RNode)(obj)) -#define nd_type(n) ((int)(((RNODE(n))->flags>>FL_USHIFT)&0xff)) +#define nd_type(n) ((int)(((RNODE(n))->flags>>FL_USHIFT)&0x7f)) #define nd_set_type(n,t) \ RNODE(n)->flags=((RNODE(n)->flags&~FL_UMASK)|(((t)<flags>>NODE_LSHIFT)&NODE_LMASK)) @@ -330,7 +331,6 @@ typedef struct RNode { #define NEW_TRUE() NEW_NODE(NODE_TRUE,0,0,0) #define NEW_FALSE() NEW_NODE(NODE_FALSE,0,0,0) #define NEW_DEFINED(e) NEW_NODE(NODE_DEFINED,e,0,0) -#define NEW_NEWLINE(n) NEW_NODE(NODE_NEWLINE,0,0,n) #define NEW_PREEXE(b) NEW_SCOPE(b) #define NEW_POSTEXE() NEW_NODE(NODE_POSTEXE,0,0,0) #define NEW_DMETHOD(b) NEW_NODE(NODE_DMETHOD,0,0,b) diff --git a/parse.y b/parse.y index e70349373c..b19076cf12 100644 --- a/parse.y +++ b/parse.y @@ -384,7 +384,7 @@ stmts : none } | stmts terms stmt { - $$ = block_append($1, newline_node($3)); + $$ = block_append($1, $3); } | error stmt { @@ -1228,7 +1228,7 @@ aref_args : none | tSTAR arg opt_nl { value_expr($2); - $$ = NEW_NEWLINE(NEW_SPLAT($2)); + $$ = newline_node(NEW_SPLAT($2)); } ; @@ -2071,11 +2071,7 @@ string_content : tSTRING_CONTENT compstmt '}' { lex_strterm = $2; - if (($$ = $3) && nd_type($$) == NODE_NEWLINE) { - $$ = $$->nd_next; - rb_gc_force_recycle((VALUE)$3); - } - $$ = new_evstr($$); + $$ = new_evstr($3); } ; @@ -4456,14 +4452,8 @@ static NODE* newline_node(node) NODE *node; { - NODE *nl = 0; - if (node) { - if (nd_type(node) == NODE_NEWLINE) return node; - nl = NEW_NEWLINE(node); - fixpos(nl, node); - nl->nd_nth = nd_line(node); - } - return nl; + FL_SET(node, NODE_NEWLINE); + return node; } static void @@ -4510,15 +4500,12 @@ block_append(head, tail) again: if (h == 0) return tail; switch (nd_type(h)) { - case NODE_NEWLINE: - h = h->nd_next; - goto again; case NODE_LIT: case NODE_STR: parser_warning(h, "unused literal ignored"); return tail; default: - end = NEW_BLOCK(head); + h = end = NEW_BLOCK(head); end->nd_end = end; fixpos(end, head); head = end; @@ -4540,10 +4527,6 @@ block_append(head, tail) parser_warning(nd, "statement not reached"); break; - case NODE_NEWLINE: - nd = nd->nd_next; - goto newline; - default: break; } @@ -4554,7 +4537,7 @@ block_append(head, tail) tail->nd_end = tail; } end->nd_next = tail; - head->nd_end = tail->nd_end; + h->nd_end = tail->nd_end; return head; } @@ -4676,9 +4659,6 @@ new_evstr(node) switch (nd_type(node)) { case NODE_STR: case NODE_DSTR: case NODE_EVSTR: return node; - case NODE_NEWLINE: - node = node->nd_next; - goto again; } } return NEW_EVSTR(head); @@ -4995,10 +4975,6 @@ value_expr0(node) node = node->nd_2nd; break; - case NODE_NEWLINE: - node = node->nd_next; - break; - default: return Qtrue; } @@ -5018,10 +4994,6 @@ void_expr0(node) again: if (!node) return; switch (nd_type(node)) { - case NODE_NEWLINE: - node = node->nd_next; - goto again; - case NODE_CALL: switch (node->nd_mid) { case '+': @@ -5124,15 +5096,10 @@ remove_begin(node) { NODE **n = &node; while (*n) { - switch (nd_type(*n)) { - case NODE_NEWLINE: - n = &(*n)->nd_next; - continue; - case NODE_BEGIN: - *n = (*n)->nd_body; - default: + if (nd_type(*n) != NODE_BEGIN) { return node; } + *n = (*n)->nd_body; } return node; } @@ -5152,7 +5119,6 @@ assign_in_cond(node) case NODE_IASGN: break; - case NODE_NEWLINE: default: return 0; } @@ -5221,10 +5187,6 @@ range_op(node) value_expr(node); node = cond0(node); type = nd_type(node); - if (type == NODE_NEWLINE) { - node = node->nd_next; - type = nd_type(node); - } if (type == NODE_LIT && FIXNUM_P(node->nd_lit)) { warn_unless_e_option(node, "integer literal in conditional range"); return call_op(node,tEQ,1,NEW_GVAR(rb_intern("$."))); @@ -5324,10 +5286,6 @@ cond(node) { if (node == 0) return 0; value_expr(node); - if (nd_type(node) == NODE_NEWLINE){ - node->nd_next = cond0(node->nd_next); - return node; - } return cond0(node); } @@ -5359,11 +5317,6 @@ cond_negative(nodep) case NODE_NOT: *nodep = c->nd_body; return 1; - case NODE_NEWLINE: - if (c->nd_next && nd_type(c->nd_next) == NODE_NOT) { - c->nd_next = c->nd_next->nd_body; - return 1; - } } return 0; } @@ -5386,7 +5339,7 @@ ret_args(node) if (nd_type(node) == NODE_ARRAY && node->nd_next == 0) { node = node->nd_head; } - if (node && nd_type(node) == NODE_SPLAT) { + else if (node && nd_type(node) == NODE_SPLAT) { node = NEW_SVALUE(node); } } @@ -5405,7 +5358,7 @@ new_yield(node) node = node->nd_head; state = Qfalse; } - if (node && nd_type(node) == NODE_SPLAT) { + else if (node && nd_type(node) == NODE_SPLAT) { state = Qtrue; } } diff --git a/ruby.c b/ruby.c index 77d8c37d5c..bf24defc03 100644 --- a/ruby.c +++ b/ruby.c @@ -343,7 +343,7 @@ require_libraries() Init_ext(); /* should be called here for some reason :-( */ save[0] = ruby_eval_tree; save[1] = ruby_eval_tree_begin; - save[2] = NEW_NEWLINE(0); + save[2] = NEW_BEGIN(0); ruby_eval_tree = ruby_eval_tree_begin = 0; req_list_last = 0; while (list) { @@ -753,7 +753,7 @@ proc_options(argc, argv) } if (!script) script = argv[0]; script = ruby_sourcefile = rb_source_filename(script); - script_node = NEW_NEWLINE(0); + script_node = NEW_BEGIN(0); } #if defined DOSISH || defined __CYGWIN__ translate_char(script, '\\', '/'); diff --git a/test/drb/test_drb.rb b/test/drb/test_drb.rb index 5a4a98e1cc..753ff09335 100644 --- a/test/drb/test_drb.rb +++ b/test/drb/test_drb.rb @@ -1,3 +1,4 @@ +$:.unshift(File.dirname(File.expand_path(__FILE__))) require 'drbtest' class TestDRbCore < Test::Unit::TestCase