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

ruby-changes:53586

From: shyouhei <ko1@a...>
Date: Mon, 19 Nov 2018 17:10:53 +0900 (JST)
Subject: [ruby-changes:53586] shyouhei:r65802 (trunk): io.c: ungetbyte silently ignores upper bits

shyouhei	2018-11-19 17:10:48 +0900 (Mon, 19 Nov 2018)

  New Revision: 65802

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=65802

  Log:
    io.c: ungetbyte silently ignores upper bits
    
    The behaviour of IO#ungetbyte has been depending on the width of
    Fixnums.  Fixnums should be invisible nowadays.  It must be a
    bug. Fix [Bug #14359]

  Modified files:
    trunk/io.c
    trunk/spec/ruby/core/io/ungetbyte_spec.rb
Index: io.c
===================================================================
--- io.c	(revision 65801)
+++ io.c	(revision 65802)
@@ -4212,8 +4212,18 @@ rb_io_ungetbyte(VALUE io, VALUE b) https://github.com/ruby/ruby/blob/trunk/io.c#L4212
     rb_io_check_byte_readable(fptr);
     if (NIL_P(b)) return Qnil;
     if (FIXNUM_P(b)) {
-	char cc = FIX2INT(b);
-	b = rb_str_new(&cc, 1);
+        int i = FIX2INT(b);
+        if (0 <= i && i <= UCHAR_MAX) {
+            unsigned char cc = i & 0xFF;
+            b = rb_str_new((const char *)&cc, 1);
+        }
+        else {
+            rb_raise(rb_eRangeError,
+                "integer % d too big to convert into `unsigned char'", i);
+        }
+    }
+    else if (RB_TYPE_P(b, T_BIGNUM)) {
+        rb_raise(rb_eRangeError, "bignum too big to convert into `unsigned char'");
     }
     else {
 	SafeStringValue(b);
Index: spec/ruby/core/io/ungetbyte_spec.rb
===================================================================
--- spec/ruby/core/io/ungetbyte_spec.rb	(revision 65801)
+++ spec/ruby/core/io/ungetbyte_spec.rb	(revision 65802)
@@ -36,9 +36,25 @@ describe "IO#ungetbyte" do https://github.com/ruby/ruby/blob/trunk/spec/ruby/core/io/ungetbyte_spec.rb#L36
     @io.getbyte.should == 97
   end
 
-  it "puts back one byte for an Integer argument" do
-    @io.ungetbyte(4095).should be_nil
-    @io.getbyte.should == 255
+  ruby_version_is ''...'2.6' do
+    it "puts back one byte for a Fixnum argument..." do
+      @io.ungetbyte(4095).should be_nil
+      @io.getbyte.should == 255
+    end
+
+    it "... but not for Bignum argument (eh?)" do
+      lambda {
+        @io.ungetbyte(0x4f7574206f6620636861722072616e6765)
+      }.should raise_error(TypeError)
+    end
+  end
+
+  ruby_version_is '2.6' do
+    it "is an RangeError if the integr is not in 8bit" do
+      for i in [4095, 0x4f7574206f6620636861722072616e6765] do
+        lambda { @io.ungetbyte(i) }.should raise_error(RangeError)
+      end
+    end
   end
 
   it "raises an IOError if the IO is closed" do

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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