diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-05-17 07:18:29 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-05-17 07:18:29 +0000 |
commit | 6eaba4acec99d4acaaa7c199c6ac6fda1fe6ab16 (patch) | |
tree | 3636557cbb9b9ea97785b79142d9ef23b3a8ff7f | |
parent | a655b0d8e1bf5ef406caa3c0d5edf68a2b411443 (diff) | |
download | ruby-6eaba4acec99d4acaaa7c199c6ac6fda1fe6ab16.tar.gz |
* ext/socket/socket.c (setup_domain_and_type): honor duck typing.
[ruby-dev:23522]
* ext/socket/socket.c (sock_s_getnameinfo): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6347 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | ext/socket/socket.c | 25 | ||||
-rw-r--r-- | parse.y | 2 |
3 files changed, 26 insertions, 8 deletions
@@ -7,6 +7,13 @@ Mon May 17 16:04:06 Hirokazu Yamamoto <ocean@m2.ccsnet.ne.jp> (p 0.00000000000000000001 was '9.999999999999999e-21', now is '1.0e-20') +Mon May 17 10:13:33 2004 Yukihiro Matsumoto <matz@ruby-lang.org> + + * ext/socket/socket.c (setup_domain_and_type): honor duck typing. + [ruby-dev:23522] + + * ext/socket/socket.c (sock_s_getnameinfo): ditto. + Mon May 17 00:36:21 2004 why the lucky stiff <why@ruby-lang.org> * lib/yaml/baseemitter.rb (indent_text): was forcing a mod value diff --git a/ext/socket/socket.c b/ext/socket/socket.c index f34b74b340..a11756b284 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -1777,10 +1777,13 @@ setup_domain_and_type(domain, dv, type, tv) VALUE domain, type; int *dv, *tv; { + VALUE tmp; char *ptr; - if (TYPE(domain) == T_STRING) { - SafeStringValue(domain); + tmp = rb_check_string_type(domain); + if (!NIL_P(tmp)) { + domain = tmp; + rb_check_safe_obj(domain); ptr = RSTRING(domain)->ptr; if (strcmp(ptr, "AF_INET") == 0) *dv = AF_INET; @@ -1828,8 +1831,10 @@ setup_domain_and_type(domain, dv, type, tv) else { *dv = NUM2INT(domain); } - if (TYPE(type) == T_STRING) { - SafeStringValue(type); + tmp = rb_check_string_type(type); + if (!NIL_P(tmp)) { + type = tmp; + rb_check_safe_obj(type); ptr = RSTRING(type)->ptr; if (strcmp(ptr, "SOCK_STREAM") == 0) *tv = SOCK_STREAM; @@ -2244,7 +2249,7 @@ sock_s_getnameinfo(argc, argv) int argc; VALUE *argv; { - VALUE sa, af = Qnil, host = Qnil, port = Qnil, flags; + VALUE sa, af = Qnil, host = Qnil, port = Qnil, flags, tmp; char *hptr, *pptr; char hbuf[1024], pbuf[1024]; int fl; @@ -2261,7 +2266,9 @@ sock_s_getnameinfo(argc, argv) if (!NIL_P(flags)) { fl = NUM2INT(flags); } - if (TYPE(sa) == T_STRING) { + tmp = rb_check_string_type(sa); + if (!NIL_P(tmp)) { + sa = tmp; if (sizeof(ss) < RSTRING(sa)->len) { rb_raise(rb_eTypeError, "sockaddr length too big"); } @@ -2270,8 +2277,11 @@ sock_s_getnameinfo(argc, argv) rb_raise(rb_eTypeError, "sockaddr size differs - should not happen"); } sap = (struct sockaddr*)&ss; + goto call_nameinfo; } - else if (TYPE(sa) == T_ARRAY) { + tmp = rb_check_array_type(sa); + if (!NIL_P(tmp)) { + sa = tmp; MEMZERO(&hints, struct addrinfo, 1); if (RARRAY(sa)->len == 3) { af = RARRAY(sa)->ptr[0]; @@ -2346,6 +2356,7 @@ sock_s_getnameinfo(argc, argv) rb_raise(rb_eTypeError, "expecting String or Array"); } + call_nameinfo: error = getnameinfo(sap, SA_LEN(sap), hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), fl); if (error) goto error_exit_name; @@ -293,7 +293,7 @@ static void top_local_setup(); %token tLBRACE_ARG /* { */ %token tSTAR /* * */ %token tAMPER /* & */ -%token tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG tWORDS_BEG tQWORDS_BEG +%token tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG tWORD_BEG tQWORDS_BEG %token tSTRING_DBEG tSTRING_DVAR tSTRING_END /* |