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

ruby-changes:56582

From: Nobuyoshi <ko1@a...>
Date: Wed, 17 Jul 2019 10:52:59 +0900 (JST)
Subject: [ruby-changes:56582] Nobuyoshi Nakada: f487e5b7a4 (master): Expanded buf to copy at once

https://git.ruby-lang.org/ruby.git/commit/?id=f487e5b7a4

From f487e5b7a4b13d23a8bb7807e4f5cc3f9b2a30e3 Mon Sep 17 00:00:00 2001
From: Nobuyoshi Nakada <nobu@r...>
Date: Tue, 16 Jul 2019 21:47:32 +0900
Subject: Expanded buf to copy at once

Build dumped string from base packed data and extended year at
once.  Although currently ruby_marshal_write_long() never writes
more than 5 bytes per its format specification, allocate
`sizeof(long)+1` for the sanitation.

diff --git a/time.c b/time.c
index f7808c7..18f1b24 100644
--- a/time.c
+++ b/time.c
@@ -5016,7 +5016,7 @@ time_mdump(VALUE time) https://github.com/ruby/ruby/blob/trunk/time.c#L5016
 {
     struct time_object *tobj;
     unsigned long p, s;
-    char buf[base_dump_size];
+    char buf[base_dump_size + sizeof(long) + 1];
     int i;
     VALUE str;
 
@@ -5083,7 +5083,6 @@ time_mdump(VALUE time) https://github.com/ruby/ruby/blob/trunk/time.c#L5083
 	s = RSHIFT(s, 8);
     }
 
-    str = rb_str_new(buf, 8);
     if (!NIL_P(year_extend)) {
         /*
          * Append extended year distance from 1900..(1900+0xffff).  In
@@ -5092,18 +5091,22 @@ time_mdump(VALUE time) https://github.com/ruby/ruby/blob/trunk/time.c#L5091
          * binary (like as Fixnum and Bignum).
          */
         size_t ysize = rb_absint_size(year_extend, NULL);
-        char *p, buf_year_extend[sizeof(long)+1];
+        char *p, *const buf_year_extend = buf + base_dump_size;
         if (ysize > LONG_MAX ||
             (i = ruby_marshal_write_long((long)ysize, buf_year_extend)) < 0) {
             rb_raise(rb_eArgError, "year too %s to marshal: %"PRIsVALUE" UTC",
                      (year == 1900 ? "small" : "big"), vtm.year);
         }
-        rb_str_resize(str, sizeof(buf) + i + ysize);
-        p = RSTRING_PTR(str) + sizeof(buf);
-        memcpy(p, buf_year_extend, i);
+        i += base_dump_size;
+        str = rb_str_new(NULL, i + ysize);
+        p = RSTRING_PTR(str);
+        memcpy(p, buf, i);
         p += i;
         rb_integer_pack(year_extend, p, ysize, 1, 0, INTEGER_PACK_LITTLE_ENDIAN);
     }
+    else {
+        str = rb_str_new(buf, base_dump_size);
+    }
     rb_copy_generic_ivar(str, time);
     if (!rb_equal(nano, INT2FIX(0))) {
         if (RB_TYPE_P(nano, T_RATIONAL)) {
-- 
cgit v0.10.2


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

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