summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--pack.c4
-rw-r--r--test/ruby/test_pack.rb2
3 files changed, 11 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 955051a6eb..10a7922520 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Fri Oct 15 16:40:37 2010 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * pack.c (pack_pack): fix more than one modifiers appear in the
+ format string. [ruby-core:32793]
+
+ * pack.c (pack_unpack): ditto.
+
Thu Oct 14 23:20:42 2010 Masaki Suketa <masaki.suketa@nifty.ne.jp>
* test/win32ole/test_folderitem2_invokeverb.rb: refactoring.
diff --git a/pack.c b/pack.c
index 8c710f9622..45a5de0d4f 100644
--- a/pack.c
+++ b/pack.c
@@ -428,7 +428,6 @@ pack_pack(VALUE ary, VALUE fmt)
int natint; /* native integer */
#endif
int signed_p, integer_size, bigendian_p;
- int explicit_endian = 0;
StringValue(fmt);
p = RSTRING_PTR(fmt);
@@ -443,6 +442,7 @@ pack_pack(VALUE ary, VALUE fmt)
#define NEXTFROM (items-- > 0 ? RARRAY_PTR(ary)[idx++] : TOO_FEW)
while (p < pend) {
+ int explicit_endian = 0;
if (RSTRING_PTR(fmt) + RSTRING_LEN(fmt) != pend) {
rb_raise(rb_eRuntimeError, "format string modified");
}
@@ -1366,7 +1366,6 @@ pack_unpack(VALUE str, VALUE fmt)
#endif
int block_p = rb_block_given_p();
int signed_p, integer_size, bigendian_p;
- int explicit_endian = 0;
#define UNPACK_PUSH(item) do {\
VALUE item_val = (item);\
if (block_p) {\
@@ -1386,6 +1385,7 @@ pack_unpack(VALUE str, VALUE fmt)
ary = block_p ? Qnil : rb_ary_new();
while (p < pend) {
+ int explicit_endian = 0;
type = *p++;
#ifdef NATINT_PACK
natint = 0;
diff --git a/test/ruby/test_pack.rb b/test/ruby/test_pack.rb
index 6f746f2596..83b4582776 100644
--- a/test/ruby/test_pack.rb
+++ b/test/ruby/test_pack.rb
@@ -145,6 +145,8 @@ class TestPack < Test::Unit::TestCase
else
_integer_little_endian()
end
+ assert_equal("\x01\x02\x02\x01", [0x0102,0x0102].pack("s>s<"))
+ assert_equal([0x0102,0x0102], "\x01\x02\x02\x01".unpack("s>s<"))
end
def test_integer_endian_explicit