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

ruby-changes:42342

From: naruse <ko1@a...>
Date: Wed, 30 Mar 2016 01:30:16 +0900 (JST)
Subject: [ruby-changes:42342] naruse:r54416 (ruby_2_3): merge revision(s) 53724: [Backport #11946]

naruse	2016-03-30 01:30:10 +0900 (Wed, 30 Mar 2016)

  New Revision: 54416

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

  Log:
    merge revision(s) 53724: [Backport #11946]
    
    * string.c (str_new_frozen): if the given string is embeddedable
      but not embedded, embed a new copied string. [Bug #11946]

  Modified directories:
    branches/ruby_2_3/
  Modified files:
    branches/ruby_2_3/ChangeLog
    branches/ruby_2_3/ext/-test-/string/cstr.c
    branches/ruby_2_3/string.c
    branches/ruby_2_3/test/-ext-/string/test_cstr.rb
    branches/ruby_2_3/version.h
Index: ruby_2_3/string.c
===================================================================
--- ruby_2_3/string.c	(revision 54415)
+++ ruby_2_3/string.c	(revision 54416)
@@ -1087,6 +1087,13 @@ str_new_frozen(VALUE klass, VALUE orig) https://github.com/ruby/ruby/blob/trunk/ruby_2_3/string.c#L1087
 		return shared;
 	    }
 	}
+	else if (RSTRING_LEN(orig)+TERM_LEN(orig) <= RSTRING_EMBED_LEN_MAX+1) {
+	    str = str_alloc(klass);
+	    STR_SET_EMBED(str);
+	    memcpy(RSTRING_PTR(str), RSTRING_PTR(orig), RSTRING_LEN(orig));
+	    STR_SET_EMBED_LEN(str, RSTRING_LEN(orig));
+	    TERM_FILL(RSTRING_END(str), TERM_LEN(orig));
+	}
 	else {
 	    str = str_alloc(klass);
 	    STR_SET_NOEMBED(str);
Index: ruby_2_3/version.h
===================================================================
--- ruby_2_3/version.h	(revision 54415)
+++ ruby_2_3/version.h	(revision 54416)
@@ -1,6 +1,6 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_3/version.h#L1
 #define RUBY_VERSION "2.3.0"
 #define RUBY_RELEASE_DATE "2016-03-30"
-#define RUBY_PATCHLEVEL 64
+#define RUBY_PATCHLEVEL 65
 
 #define RUBY_RELEASE_YEAR 2016
 #define RUBY_RELEASE_MONTH 3
Index: ruby_2_3/test/-ext-/string/test_cstr.rb
===================================================================
--- ruby_2_3/test/-ext-/string/test_cstr.rb	(revision 54415)
+++ ruby_2_3/test/-ext-/string/test_cstr.rb	(revision 54416)
@@ -36,6 +36,12 @@ class Test_StringCStr < Test::Unit::Test https://github.com/ruby/ruby/blob/trunk/ruby_2_3/test/-ext-/string/test_cstr.rb#L36
     end
   end
 
+  def test_rb_str_new_frozen_embed
+    str = Bug::String.cstr_noembed("rbconfig.rb")
+    str = Bug::String.rb_str_new_frozen(str)
+    assert_equal true, Bug::String.cstr_embedded?(str)
+  end
+
   WCHARS = [Encoding::UTF_16BE, Encoding::UTF_16LE, Encoding::UTF_32BE, Encoding::UTF_32LE]
 
   def test_wchar_embed
Index: ruby_2_3/ext/-test-/string/cstr.c
===================================================================
--- ruby_2_3/ext/-test-/string/cstr.c	(revision 54415)
+++ ruby_2_3/ext/-test-/string/cstr.c	(revision 54416)
@@ -1,5 +1,4 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_3/ext/-test-/string/cstr.c#L1
-#include "ruby.h"
-#include "ruby/encoding.h"
+#include "internal.h"
 
 static VALUE
 bug_str_cstr_term(VALUE str)
@@ -71,6 +70,44 @@ bug_str_s_cstr_term_char(VALUE self, VAL https://github.com/ruby/ruby/blob/trunk/ruby_2_3/ext/-test-/string/cstr.c#L70
     return bug_str_cstr_term_char(str);
 }
 
+#define TERM_LEN(str) rb_enc_mbminlen(rb_enc_get(str))
+#define TERM_FILL(ptr, termlen) do {\
+    char *const term_fill_ptr = (ptr);\
+    const int term_fill_len = (termlen);\
+    *term_fill_ptr = '\0';\
+    if (UNLIKELY(term_fill_len > 1))\
+	memset(term_fill_ptr, 0, term_fill_len);\
+} while (0)
+
+static VALUE
+bug_str_s_cstr_noembed(VALUE self, VALUE str)
+{
+    VALUE str2 = rb_str_new(NULL, 0);
+    long capacity = RSTRING_LEN(str) + TERM_LEN(str);
+    char *buf = ALLOC_N(char, capacity);
+    Check_Type(str, T_STRING);
+    FL_SET((str2), STR_NOEMBED);
+    memcpy(buf, RSTRING_PTR(str), capacity);
+    RBASIC(str2)->flags &= ~RSTRING_EMBED_LEN_MASK;
+    RSTRING(str2)->as.heap.aux.capa = capacity;
+    RSTRING(str2)->as.heap.ptr = buf;
+    RSTRING(str2)->as.heap.len = RSTRING_LEN(str);
+    TERM_FILL(RSTRING_END(str2), TERM_LEN(str));
+    return str2;
+}
+
+static VALUE
+bug_str_s_cstr_embedded_p(VALUE self, VALUE str)
+{
+    return STR_EMBED_P(str) ? Qtrue : Qfalse;
+}
+
+static VALUE
+bug_str_s_rb_str_new_frozen(VALUE self, VALUE str)
+{
+    return rb_str_new_frozen(str);
+}
+
 void
 Init_cstr(VALUE klass)
 {
@@ -80,4 +117,7 @@ Init_cstr(VALUE klass) https://github.com/ruby/ruby/blob/trunk/ruby_2_3/ext/-test-/string/cstr.c#L117
     rb_define_singleton_method(klass, "cstr_term", bug_str_s_cstr_term, 1);
     rb_define_singleton_method(klass, "cstr_unterm", bug_str_s_cstr_unterm, 2);
     rb_define_singleton_method(klass, "cstr_term_char", bug_str_s_cstr_term_char, 1);
+    rb_define_singleton_method(klass, "cstr_noembed", bug_str_s_cstr_noembed, 1);
+    rb_define_singleton_method(klass, "cstr_embedded?", bug_str_s_cstr_embedded_p, 1);
+    rb_define_singleton_method(klass, "rb_str_new_frozen", bug_str_s_rb_str_new_frozen, 1);
 }
Index: ruby_2_3/ChangeLog
===================================================================
--- ruby_2_3/ChangeLog	(revision 54415)
+++ ruby_2_3/ChangeLog	(revision 54416)
@@ -1,3 +1,8 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_3/ChangeLog#L1
+Wed Mar 30 01:25:46 2016  NARUSE, Yui  <naruse@r...>
+
+	* string.c (str_new_frozen): if the given string is embeddedable
+	  but not embedded, embed a new copied string. [Bug #11946]
+
 Wed Mar 30 01:23:57 2016  Marcus Stollsteimer  <sto.mar@w...>
 
 	* doc/extension.ja.rdoc: Fix RDoc markup in doc/extension*.rdoc.

Property changes on: ruby_2_3
___________________________________________________________________
Modified: svn:mergeinfo
   Merged /trunk:r53724


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

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