ruby-changes:44885
From: usa <ko1@a...>
Date: Thu, 1 Dec 2016 22:20:51 +0900 (JST)
Subject: [ruby-changes:44885] usa:r56958 (trunk): Remove `offset:` from `Array#pack`
usa 2016-12-01 22:20:47 +0900 (Thu, 01 Dec 2016) New Revision: 56958 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=56958 Log: Remove `offset:` from `Array#pack` * pack.c (pack_pack): can use `@` instead of `offset:`. Modified files: trunk/NEWS trunk/pack.c trunk/test/ruby/test_pack.rb Index: test/ruby/test_pack.rb =================================================================== --- test/ruby/test_pack.rb (revision 56957) +++ test/ruby/test_pack.rb (revision 56958) @@ -816,18 +816,9 @@ EXPECTED https://github.com/ruby/ruby/blob/trunk/test/ruby/test_pack.rb#L816 def test_pack_with_buffer buf = String.new(capacity: 100) - assert_raise_with_message(ArgumentError, /without buffer/) { - [0xDEAD_BEEF].pack('N', offset: 10) - } - assert_raise_with_message(ArgumentError, /too small/) { - [0xDEAD_BEEF].pack('N', buffer: buf, offset: 200) - } assert_raise_with_message(RuntimeError, /frozen/) { [0xDEAD_BEEF].pack('N', buffer: 'foo'.freeze) } - assert_raise_with_message(TypeError, /into Integer/) { - [0xDEAD_BEEF].pack('N', buffer: buf, offset: '10') - } assert_raise_with_message(TypeError, /must be String/) { [0xDEAD_BEEF].pack('N', buffer: Object.new) } @@ -837,11 +828,11 @@ EXPECTED https://github.com/ruby/ruby/blob/trunk/test/ruby/test_pack.rb#L828 [0xDEAD_BEEF].pack('N', buffer: buf) assert_equal "\xDE\xAD\xBE\xEF", buf - [0xBABE_F00D].pack('N', buffer: buf, offset: 4) + [0xBABE_F00D].pack('@4N', buffer: buf) assert_equal "\xDE\xAD\xBE\xEF\xBA\xBE\xF0\x0D", buf assert_equal addr, [buf].pack('p') - [0xBAAD_FACE].pack('N', buffer: buf, offset: 10) + [0xBAAD_FACE].pack('@10N', buffer: buf) assert_equal "\xDE\xAD\xBE\xEF\xBA\xBE\xF0\x0D\0\0\xBA\xAD\xFA\xCE", buf assert_equal addr, [buf].pack('p') Index: pack.c =================================================================== --- pack.c (revision 56957) +++ pack.c (revision 56958) @@ -142,7 +142,6 @@ rb_str_associated(VALUE str) https://github.com/ruby/ruby/blob/trunk/pack.c#L142 * call-seq: * arr.pack( aTemplateString ) -> aBinaryString * arr.pack( aTemplateString, buffer: aBufferString ) -> aBufferString - * arr.pack( aTemplateString, buffer: aBufferString, offset: offsetOfBuffer ) -> aBufferString * * Packs the contents of <i>arr</i> into a binary sequence according to * the directives in <i>aTemplateString</i> (see the table below) @@ -166,10 +165,10 @@ rb_str_associated(VALUE str) https://github.com/ruby/ruby/blob/trunk/pack.c#L165 * * If <i>aBufferString</i> is specified and its capacity is enough, * +pack+ uses it as the buffer and returns it. - * User can also specify <i>offsetOfBuffer</i>, then the result of +pack+ - * is filled after <i>offsetOfBuffer</i> bytes. + * When the offset is specified by the beginning of <i>aTemplateString</i>, + * the result is filled after the offset. * If original contents of <i>aBufferString</i> exists and it's longer than - * <i>offsetOfBuffer</i>, the rest of <i>offsetOfBuffer</i> are cut. + * the offset, the rest of <i>offsetOfBuffer</i> are overwritten by the result. * If it's shorter, the gap is filled with ``<code>\0</code>''. * * Note that ``buffer:'' option does not guarantee not to allocate memory @@ -290,36 +289,16 @@ pack_pack(int argc, VALUE *argv, VALUE a https://github.com/ruby/ruby/blob/trunk/pack.c#L289 p = RSTRING_PTR(fmt); pend = p + RSTRING_LEN(fmt); if (!NIL_P(opt)) { - static ID keyword_ids[2]; - VALUE kwargs[2]; - VALUE voff; + static ID keyword_ids[1]; long offset; - if (!keyword_ids[0]) { + if (!keyword_ids[0]) CONST_ID(keyword_ids[0], "buffer"); - CONST_ID(keyword_ids[1], "offset"); - } - rb_get_kwargs(opt, keyword_ids, 0, 2, kwargs); - buffer = kwargs[0]; - voff = kwargs[1]; - - if (buffer == Qundef && !NIL_P(voff)) - rb_raise(rb_eArgError, "offset is specified without buffer"); - if (buffer != Qundef) { - long len; - if (!RB_TYPE_P(buffer, T_STRING)) - rb_raise(rb_eTypeError, "buffer must be String, not %s", rb_obj_classname(buffer)); - if (voff != Qundef) { - offset = NUM2LONG(voff); - if (rb_str_capacity(buffer) < offset) - rb_raise(rb_eArgError, "buffer is too small for offset"); - len = RSTRING_LEN(buffer); - rb_str_set_len(buffer, offset); - if (len < offset) - memset(RSTRING_PTR(buffer) + len, '\0', offset - len); - } - } + rb_get_kwargs(opt, keyword_ids, 0, 1, &buffer); + + if (buffer != Qundef && !RB_TYPE_P(buffer, T_STRING)) + rb_raise(rb_eTypeError, "buffer must be String, not %s", rb_obj_classname(buffer)); } if (buffer) res = buffer; Index: NEWS =================================================================== --- NEWS (revision 56957) +++ NEWS (revision 56958) @@ -42,8 +42,7 @@ with all sufficient information, see the https://github.com/ruby/ruby/blob/trunk/NEWS#L42 Now takes multiple arguments. * Array#pack [Feature #12754] - Now takes optional arguments `buffer' and `offset' to reuse already - allocated buffer. + Now takes optional argument `buffer:' to reuse already allocated buffer. * Comparable -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/