ruby-changes:41483
From: nobu <ko1@a...>
Date: Sun, 17 Jan 2016 14:40:28 +0900 (JST)
Subject: [ruby-changes:41483] nobu:r53557 (trunk): option.c: make error messages consistent
nobu 2016-01-17 14:41:01 +0900 (Sun, 17 Jan 2016) New Revision: 53557 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=53557 Log: option.c: make error messages consistent * ext/socket/option.c (check_size): extract a macro to check binary data size, with a consistent message. * ext/socket/option.c (sockopt_byte): fix error message, sizeof(int) differs from sizeof(unsigned char) in general. Modified files: trunk/ChangeLog trunk/ext/socket/option.c Index: ext/socket/option.c =================================================================== --- ext/socket/option.c (revision 53556) +++ ext/socket/option.c (revision 53557) @@ -27,6 +27,12 @@ VALUE rb_cSockOpt; https://github.com/ruby/ruby/blob/trunk/ext/socket/option.c#L27 # define USE_INSPECT_BYTE 1 #endif +#define check_size(len, size) \ + ((len) == (size) ? \ + (void)0 : \ + rb_raise(rb_eTypeError, "size differ. expected as "#size"=%d but %ld", \ + (int)size, (long)(len))) + static VALUE sockopt_pack_byte(VALUE value) { @@ -211,12 +217,9 @@ sockopt_s_byte(VALUE klass, VALUE vfamil https://github.com/ruby/ruby/blob/trunk/ext/socket/option.c#L217 static VALUE sockopt_byte(VALUE self) { - unsigned char i; VALUE data = sockopt_data(self); StringValue(data); - if (RSTRING_LEN(data) != sizeof(i)) - rb_raise(rb_eTypeError, "size differ. expected as sizeof(int)=%d but %ld", - (int)sizeof(i), (long)RSTRING_LEN(data)); + check_size(RSTRING_LEN(data), sizeof(char)); return CHR2FIX(*RSTRING_PTR(data)); } @@ -257,9 +260,7 @@ sockopt_int(VALUE self) https://github.com/ruby/ruby/blob/trunk/ext/socket/option.c#L260 int i; VALUE data = sockopt_data(self); StringValue(data); - if (RSTRING_LEN(data) != sizeof(int)) - rb_raise(rb_eTypeError, "size differ. expected as sizeof(int)=%d but %ld", - (int)sizeof(int), (long)RSTRING_LEN(data)); + check_size(RSTRING_LEN(data), sizeof(int)); memcpy((char*)&i, RSTRING_PTR(data), sizeof(int)); return INT2NUM(i); } @@ -303,9 +304,7 @@ sockopt_bool(VALUE self) https://github.com/ruby/ruby/blob/trunk/ext/socket/option.c#L304 int i; VALUE data = sockopt_data(self); StringValue(data); - if (RSTRING_LEN(data) != sizeof(int)) - rb_raise(rb_eTypeError, "size differ. expected as sizeof(int)=%d but %ld", - (int)sizeof(int), (long)RSTRING_LEN(data)); + check_size(RSTRING_LEN(data), sizeof(int)); memcpy((char*)&i, RSTRING_PTR(data), sizeof(int)); return i == 0 ? Qfalse : Qtrue; } @@ -358,9 +357,7 @@ sockopt_linger(VALUE self) https://github.com/ruby/ruby/blob/trunk/ext/socket/option.c#L357 if (level != SOL_SOCKET || optname != SO_LINGER) rb_raise(rb_eTypeError, "linger socket option expected"); - if (RSTRING_LEN(data) != sizeof(l)) - rb_raise(rb_eTypeError, "size differ. expected as sizeof(struct linger)=%d but %ld", - (int)sizeof(struct linger), (long)RSTRING_LEN(data)); + check_size(RSTRING_LEN(data), sizeof(struct linger)); memcpy((char*)&l, RSTRING_PTR(data), sizeof(struct linger)); switch (l.l_onoff) { case 0: vonoff = Qfalse; break; Index: ChangeLog =================================================================== --- ChangeLog (revision 53556) +++ ChangeLog (revision 53557) @@ -1,3 +1,11 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Sun Jan 17 14:40:22 2016 Nobuyoshi Nakada <nobu@r...> + + * ext/socket/option.c (check_size): extract a macro to check + binary data size, with a consistent message. + + * ext/socket/option.c (sockopt_byte): fix error message, + sizeof(int) differs from sizeof(unsigned char) in general. + Sat Jan 16 21:16:21 2016 Nobuyoshi Nakada <nobu@r...> * parse.y (xstring): reset heredoc indent after dedenting, -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/