summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog18
-rw-r--r--eval.c22
-rw-r--r--ext/socket/socket.c43
-rw-r--r--gc.c3
-rw-r--r--lib/find.rb3
-rw-r--r--lib/net/telnet.rb4
-rw-r--r--marshal.c2
-rw-r--r--node.h6
-rw-r--r--parse.y69
-rw-r--r--ruby.c4
-rw-r--r--test/drb/test_drb.rb1
11 files changed, 73 insertions, 102 deletions
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 <matz@ruby-lang.org>
+
+ * parse.y (newline_node): do not use NODE_NEWLINE node anymore,
+ use NEWLINE flag instead.
+
Thu Jan 22 01:12:12 2004 Siena. <siena@faculty.chiba-u.jp>
* missing/os2.c (chdir, getcwd):
@@ -57,6 +62,14 @@ Wed Jan 21 16:01:26 2004 Nobuyoshi Nakada <nobu@ruby-lang.org>
* ext/digest/rmd160/extconf.rb: have_library appends found library.
+Wed Jan 21 11:36:00 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * 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 <gotoyuzo@notwork.org>
* ext/openssl/extconf.rb: should check <openssl/conf_api.h> instead
@@ -85,6 +98,11 @@ Tue Jan 20 04:41:58 2004 Nobuyoshi Nakada <nobu@ruby-lang.org>
* test/ruby/test_marshal.rb (MarshalTestLibtest_singleton): test
for [ruby-dev:22588].
+Tue Jan 20 02:38:13 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * marshal.c (w_class): should not dump singleton class.
+ [ruby-dev:22631]
+
Tue Jan 20 02:49:22 2004 GOTOU Yuuzou <gotoyuzo@notwork.org>
* 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);
+ 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)<<FL_USHIFT)&FL_UMASK))
+#define NODE_NEWLINE FL_USER7
+
#define NODE_LSHIFT (FL_USHIFT+8)
#define NODE_LMASK (((long)1<<(sizeof(NODE*)*CHAR_BIT-NODE_LSHIFT))-1)
#define nd_line(n) ((unsigned int)(((RNODE(n))->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 = $<node>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