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

ruby-changes:47828

From: nobu <ko1@a...>
Date: Sun, 17 Sep 2017 18:29:03 +0900 (JST)
Subject: [ruby-changes:47828] nobu:r59946 (trunk): literal symbol by intern

nobu	2017-09-17 18:28:58 +0900 (Sun, 17 Sep 2017)

  New Revision: 59946

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

  Log:
    literal symbol by intern
    
    * compile.c (iseq_compile_each0): literal symbol should not be
      affected by redefinition of String#intern method.
    
    * vm_insnhelper.c (rb_vm_str_intern): intern a string into a
      symbol directly.

  Modified files:
    trunk/compile.c
    trunk/test/ruby/test_literal.rb
    trunk/vm_insnhelper.c
Index: test/ruby/test_literal.rb
===================================================================
--- test/ruby/test_literal.rb	(revision 59945)
+++ test/ruby/test_literal.rb	(revision 59946)
@@ -119,6 +119,21 @@ class TestRubyLiteral < Test::Unit::Test https://github.com/ruby/ruby/blob/trunk/test/ruby/test_literal.rb#L119
     assert_equal :a3c, :"a#{1+2}c"
   end
 
+  def test_dsymbol_redefined_intern
+    assert_separately([], "#{<<-"begin;"}\n#{<<-'end;'}")
+    begin;
+      class String
+        alias _intern intern
+        def intern
+          "<#{upcase}>"
+        end
+      end
+      mesg = "literal symbol should not be affected by method redefinition"
+      str = "foo"
+      assert_equal(:foo, :"#{str}", mesg)
+    end;
+  end
+
   def test_xstring
     assert_equal "foo\n", `echo foo`
     s = 'foo'
Index: vm_insnhelper.c
===================================================================
--- vm_insnhelper.c	(revision 59945)
+++ vm_insnhelper.c	(revision 59946)
@@ -2794,6 +2794,13 @@ FUNC_FASTCALL(rb_vm_opt_struct_aset)(rb_ https://github.com/ruby/ruby/blob/trunk/vm_insnhelper.c#L2794
     return reg_cfp;
 }
 
+rb_control_frame_t *
+FUNC_FASTCALL(rb_vm_str_intern)(rb_thread_t *th, rb_control_frame_t *reg_cfp)
+{
+    TOPN(0) = rb_str_intern(TOPN(0));
+    return reg_cfp;
+}
+
 /* defined insn */
 
 static enum defined_type
Index: compile.c
===================================================================
--- compile.c	(revision 59945)
+++ compile.c	(revision 59946)
@@ -29,6 +29,9 @@ https://github.com/ruby/ruby/blob/trunk/compile.c#L29
 #undef RUBY_UNTYPED_DATA_WARNING
 #define RUBY_UNTYPED_DATA_WARNING 0
 
+rb_control_frame_t *
+  FUNC_FASTCALL(rb_vm_str_intern)(rb_thread_t *, rb_control_frame_t *);
+
 #define ISEQ_TYPE_ONCE_GUARD ISEQ_TYPE_DEFINED_GUARD
 
 #define FIXNUM_INC(n, i) ((n)+(INT2FIX(i)&~FIXNUM_FLAG))
@@ -6571,7 +6574,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK https://github.com/ruby/ruby/blob/trunk/compile.c#L6574
       case NODE_DSYM:{
 	compile_dstr(iseq, ret, node);
 	if (!popped) {
-	    ADD_SEND(ret, line, idIntern, INT2FIX(0));
+	    ADD_INSN1(ret, line, opt_call_c_function, rb_vm_str_intern);
 	}
 	else {
 	    ADD_INSN(ret, line, pop);

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

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