From db128e1b31f3c31e955a9063d027a97dcb938873 Mon Sep 17 00:00:00 2001 From: matz Date: Tue, 7 Jun 2005 16:33:01 +0000 Subject: [PATCH] * bignum.c (bignorm): fixed a bug in normalizing negative numbers reported from Honda Hiroki . normalizing should not trim preceding zeros from negative numbers. * ext/socket/socket.c (ruby_getaddrinfo__aix): merged a patch from KUBO Takehiro to support AIX. [ruby-list:40832] * lib/yaml/rubytypes.rb (Array::to_yaml): merged a patch from Tilman Sauerbeck . [ruby-core:05055] * lib/yaml/rubytypes.rb (Hash::to_yaml): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8589 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 18 ++++++++++++++++++ bignum.c | 10 ++++++++-- error.c | 1 - ext/socket/extconf.rb | 9 +++++++-- ext/socket/socket.c | 26 ++++++++++++++++++++++++++ lib/yaml/rubytypes.rb | 4 ++-- 6 files changed, 61 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 833f1e4928..107c4f719f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +Wed Jun 8 01:27:06 2005 Yukihiro Matsumoto + + * bignum.c (bignorm): fixed a bug in normalizing negative numbers + reported from Honda Hiroki . normalizing + should not trim preceding zeros from negative numbers. + +Wed Jun 8 00:15:08 2005 Yukihiro Matsumoto + + * ext/socket/socket.c (ruby_getaddrinfo__aix): merged a patch from + KUBO Takehiro to support AIX. [ruby-list:40832] + +Wed Jun 8 00:09:01 2005 Yukihiro Matsumoto + + * lib/yaml/rubytypes.rb (Array::to_yaml): merged a patch from + Tilman Sauerbeck . [ruby-core:05055] + + * lib/yaml/rubytypes.rb (Hash::to_yaml): ditto. + Wed Jun 8 00:00:01 2005 Yukihiro Matsumoto * ext/curses/curses.c (curses_insertln): merged a patch from diff --git a/bignum.c b/bignum.c index 6a31b5adc1..e534150073 100644 --- a/bignum.c +++ b/bignum.c @@ -105,9 +105,15 @@ bignorm(x) BDIGIT *ds = BDIGITS(x); while (len-- && !ds[len]) ; - RBIGNUM(x)->len = ++len; + len++; + if (RBIGNUM(x)->sign) { + RBIGNUM(x)->len = len; + } + else if (len == 0) { + return x; + } - if (len*SIZEOF_BDIGITS <= sizeof(VALUE)) { + if (RBIGNUM(x)->len*SIZEOF_BDIGITS <= sizeof(VALUE)) { long num = 0; while (len--) { num = BIGUP(num) + ds[len]; diff --git a/error.c b/error.c index c6f217e5bc..a229ecf1b0 100644 --- a/error.c +++ b/error.c @@ -1172,7 +1172,6 @@ void rb_sys_fail(mesg) const char *mesg; { - extern int errno; int n = errno; VALUE arg; diff --git a/ext/socket/extconf.rb b/ext/socket/extconf.rb index 5e439401ce..747bb35296 100644 --- a/ext/socket/extconf.rb +++ b/ext/socket/extconf.rb @@ -155,8 +155,13 @@ main() } for (ai = aitop; ai; ai = ai->ai_next) { if (ai->ai_family == AF_LOCAL) continue; - if (ai->ai_addr == NULL || - ai->ai_addrlen == 0 || + if (ai->ai_addr == NULL) + goto bad; +#if defined(_AIX) + ai->ai_addr->sa_len = ai->ai_addrlen; + ai->ai_addr->sa_family = ai->ai_family; +#endif + if (ai->ai_addrlen == 0 || getnameinfo(ai->ai_addr, ai->ai_addrlen, straddr, sizeof(straddr), strport, sizeof(strport), NI_NUMERICHOST|NI_NUMERICSERV) != 0) { diff --git a/ext/socket/socket.c b/ext/socket/socket.c index d4fd620a00..867088f084 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -169,6 +169,30 @@ ruby_getaddrinfo(nodename, servname, hints, res) #define getaddrinfo(node,serv,hints,res) ruby_getaddrinfo((node),(serv),(hints),(res)) #endif +#if defined(_AIX) +static int +ruby_getaddrinfo__aix(nodename, servname, hints, res) + char *nodename; + char *servname; + struct addrinfo *hints; + struct addrinfo **res; +{ + int error = getaddrinfo(nodename, servname, hints, res); + struct addrinfo *r; + if (error) + return error; + for (r = *res; r != NULL; r = r->ai_next) { + if (r->ai_addr->sa_family == 0) + r->ai_addr->sa_family = r->ai_family; + if (r->ai_addr->sa_len == 0) + r->ai_addr->sa_len = r->ai_addrlen; + } + return 0; +} +#undef getaddrinfo +#define getaddrinfo(node,serv,hints,res) ruby_getaddrinfo__aix((node),(serv),(hints),(res)) +#endif + #ifdef HAVE_CLOSESOCKET #undef close #define close closesocket @@ -2504,7 +2528,9 @@ sock_s_getnameinfo(argc, argv) * 4th element holds numeric form, don't resolve. * see ipaddr(). */ +#ifdef AI_NUMERICHOST /* AIX 4.3.3 doesn't have AI_NUMERICHOST. */ hints.ai_flags |= AI_NUMERICHOST; +#endif } } else { diff --git a/lib/yaml/rubytypes.rb b/lib/yaml/rubytypes.rb index 2a0c31d990..643b30b22c 100644 --- a/lib/yaml/rubytypes.rb +++ b/lib/yaml/rubytypes.rb @@ -77,7 +77,7 @@ hash_proc = Proc.new { |type, val| elsif Hash === val type, obj_class = YAML.read_type_class( type, Hash ) if obj_class != Hash - o = obj_class.new + o = obj_class.allocate o.update( val ) val = o end @@ -236,7 +236,7 @@ array_proc = Proc.new { |type, val| if Array === val type, obj_class = YAML.read_type_class( type, Array ) if obj_class != Array - o = obj_class.new + o = obj_class.allocate o.concat( val ) val = o end