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

ruby-changes:18757

From: nobu <ko1@a...>
Date: Sat, 5 Feb 2011 02:18:54 +0900 (JST)
Subject: [ruby-changes:18757] Ruby:r30784 (trunk): * parse.y (lex_getline, parser_set_encode): set encoding of lines

nobu	2011-02-05 02:09:45 +0900 (Sat, 05 Feb 2011)

  New Revision: 30784

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=30784

  Log:
    * parse.y (lex_getline, parser_set_encode): set encoding of lines
      in SCRIPT_LINES__ as source encoding.  [ruby-dev:43168]

  Modified files:
    trunk/ChangeLog
    trunk/parse.y
    trunk/test/ruby/test_syntax.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 30783)
+++ ChangeLog	(revision 30784)
@@ -1,3 +1,8 @@
+Sat Feb  5 02:09:39 2011  Nobuyoshi Nakada  <nobu@r...>
+
+	* parse.y (lex_getline, parser_set_encode): set encoding of lines
+	  in SCRIPT_LINES__ as source encoding.  [ruby-dev:43168]
+
 Sat Feb  5 02:08:37 2011  Nobuyoshi Nakada  <nobu@r...>
 
 	* vm.c (ruby_thread_data_type): add prefix.
Index: parse.y
===================================================================
--- parse.y	(revision 30783)
+++ parse.y	(revision 30784)
@@ -5220,6 +5220,7 @@
     must_be_ascii_compatible(line);
 #ifndef RIPPER
     if (ruby_debug_lines) {
+	rb_enc_associate(line, parser->enc);
 	rb_ary_push(ruby_debug_lines, line);
     }
     if (ruby_coverage) {
@@ -6246,6 +6247,15 @@
 	goto error;
     }
     parser->enc = enc;
+#ifndef RIPPER
+    if (ruby_debug_lines) {
+	long i, n = RARRAY_LEN(ruby_debug_lines);
+	const VALUE *p = RARRAY_PTR(ruby_debug_lines);
+	for (i = 0; i < n; ++i) {
+	    rb_enc_associate_index(*p, idx);
+	}
+    }
+#endif
 }
 
 static int
Index: test/ruby/test_syntax.rb
===================================================================
--- test/ruby/test_syntax.rb	(revision 30783)
+++ test/ruby/test_syntax.rb	(revision 30784)
@@ -19,4 +19,63 @@
       end
     end
   end
+
+  def test_must_ascii_compatible
+    require 'tempfile'
+    f = Tempfile.new("must_ac_")
+    Encoding.list.each do |enc|
+      next unless enc.ascii_compatible?
+      make_tmpsrc(f, "# -*- coding: #{enc.name} -*-")
+      assert_nothing_raised(ArgumentError, enc.name) {load(f.path)}
+    end
+    Encoding.list.each do |enc|
+      next if enc.ascii_compatible?
+      make_tmpsrc(f, "# -*- coding: #{enc.name} -*-")
+      assert_raise(ArgumentError, enc.name) {load(f.path)}
+    end
+    f.close!
+  end
+
+  def test_script_lines
+    require 'tempfile'
+    f = Tempfile.new("bug4361_")
+    bug4361 = '[ruby-dev:43168]'
+    with_script_lines do |debug_lines|
+      Encoding.list.each do |enc|
+        next unless enc.ascii_compatible?
+        make_tmpsrc(f, "# -*- coding: #{enc.name} -*-\n#----------------")
+        load(f.path)
+        assert_equal([f.path], debug_lines.keys)
+        assert_equal([enc, enc], debug_lines[f.path].map(&:encoding), bug4361)
+      end
+    end
+    f.close!
+  end
+
+  private
+
+  def make_tmpsrc(f, src)
+    f.open
+    f.truncate(0)
+    f.puts(src)
+    f.close
+  end
+
+  def with_script_lines
+    script_lines = nil
+    debug_lines = {}
+    Object.class_eval do
+      if defined?(SCRIPT_LINES__)
+        script_lines = SCRIPT_LINES__
+        remove_const :SCRIPT_LINES__
+      end
+      const_set(:SCRIPT_LINES__, debug_lines)
+    end
+    yield debug_lines
+  ensure
+    Object.class_eval do
+      remove_const :SCRIPT_LINES__
+      const_set(:SCRIPT_LINES__, script_lines) if script_lines
+    end
+  end
 end

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

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