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/