[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]