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

ruby-changes:50713

From: usa <ko1@a...>
Date: Thu, 22 Mar 2018 11:28:15 +0900 (JST)
Subject: [ruby-changes:50713] usa:r62884 (ruby_2_3): merge revision(s) 54737, 54740, 55792: [Backport #14623]

usa	2018-03-22 11:28:10 +0900 (Thu, 22 Mar 2018)

  New Revision: 62884

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

  Log:
    merge revision(s) 54737,54740,55792: [Backport #14623]
    
    Support MSVC14 and 15 [Bug #11118]
    
    Search _pioinfo which is not exported after MSVC14.
    [Bug #12014] [GH-884]
    
    win32.c: suppress warnings
    
    * win32/win32.c (set_pioinfo_extra): remove "/*" within comment.
    * win32/win32.c (set_pioinfo_extra): use more reliable way to search
      the position of pioinfo of VC14, and also support debug library of it.
      patched by davispuh AT gmail.com
      [ruby-core:76644] [Bug #12644]
      this fixes also [Bug #12631]

  Added files:
    branches/ruby_2_3/test/-ext-/symbol/noninterned_name.rb
  Modified directories:
    branches/ruby_2_3/
  Modified files:
    branches/ruby_2_3/ChangeLog
    branches/ruby_2_3/test/-ext-/symbol/test_inadvertent_creation.rb
    branches/ruby_2_3/version.h
    branches/ruby_2_3/win32/mkexports.rb
    branches/ruby_2_3/win32/win32.c
Index: ruby_2_3/ChangeLog
===================================================================
--- ruby_2_3/ChangeLog	(revision 62883)
+++ ruby_2_3/ChangeLog	(revision 62884)
@@ -1,3 +1,24 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_3/ChangeLog#L1
+Thu Mar 22 11:24:43 2018  NAKAMURA Usaku  <usa@r...>
+
+	* win32/win32.c (set_pioinfo_extra): use more reliable way to search
+	  the position of pioinfo of VC14, and also support debug library of it.
+	  patched by davispuh AT gmail.com
+	  [ruby-core:76644] [Bug #12644]
+	  this fixes also [Bug #12631]
+
+Thu Mar 22 11:24:43 2018  Nobuyoshi Nakada  <nobu@r...>
+
+	win32.c: suppress warnings
+
+	* win32/win32.c (set_pioinfo_extra): remove "/*" within comment.
+
+Thu Mar 22 11:24:43 2018  NARUSE, Yui  <naruse@r...>
+
+	Support MSVC14 and 15 [Bug #11118]
+
+	Search _pioinfo which is not exported after MSVC14.
+	[Bug #12014] [GH-884]
+
 Mon Mar 19 00:34:38 2018  Nobuyoshi Nakada  <nobu@r...>
 
 	win32.c: unknown reparse tags
Index: ruby_2_3/test/-ext-/symbol/noninterned_name.rb
===================================================================
--- ruby_2_3/test/-ext-/symbol/noninterned_name.rb	(nonexistent)
+++ ruby_2_3/test/-ext-/symbol/noninterned_name.rb	(revision 62884)
@@ -0,0 +1,15 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_3/test/-ext-/symbol/noninterned_name.rb#L1
+require "-test-/symbol"
+
+module Test_Symbol
+  module NonInterned
+    module_function
+
+    def noninterned_name(prefix = "")
+      prefix += "_#{Thread.current.object_id.to_s(36).tr('-', '_')}"
+      begin
+        name = "#{prefix}_#{rand(0x1000).to_s(16)}_#{Time.now.usec}"
+      end while Bug::Symbol.find(name)
+      name
+    end
+  end
+end

Property changes on: ruby_2_3/test/-ext-/symbol/noninterned_name.rb
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+LF
\ No newline at end of property
Index: ruby_2_3/test/-ext-/symbol/test_inadvertent_creation.rb
===================================================================
--- ruby_2_3/test/-ext-/symbol/test_inadvertent_creation.rb	(revision 62883)
+++ ruby_2_3/test/-ext-/symbol/test_inadvertent_creation.rb	(revision 62884)
@@ -1,16 +1,10 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_3/test/-ext-/symbol/test_inadvertent_creation.rb#L1
 # frozen_string_literal: false
 require 'test/unit'
-require "-test-/symbol"
+require_relative 'noninterned_name'
 
 module Test_Symbol
   class TestInadvertent < Test::Unit::TestCase
-    def noninterned_name(prefix = "")
-      prefix += "_#{Thread.current.object_id.to_s(36).tr('-', '_')}"
-      begin
-        name = "#{prefix}_#{rand(0x1000).to_s(16)}_#{Time.now.usec}"
-      end while Bug::Symbol.find(name)
-      name
-    end
+    include NonInterned
 
     def setup
       @obj = Object.new
@@ -362,15 +356,9 @@ module Test_Symbol https://github.com/ruby/ruby/blob/trunk/ruby_2_3/test/-ext-/symbol/test_inadvertent_creation.rb#L356
     end
 
     def test_gc_attrset
-      assert_separately(['-r-test-/symbol', '-', '[ruby-core:62226] [Bug #9787]'], <<-'end;') #    begin
-      bug = ARGV.shift
-      def noninterned_name(prefix = "")
-        prefix += "_#{Thread.current.object_id.to_s(36).tr('-', '_')}"
-        begin
-          name = "#{prefix}_#{rand(0x1000).to_s(16)}_#{Time.now.usec}"
-        end while Bug::Symbol.find(name) or Bug::Symbol.find(name + "=")
-        name
-      end
+      assert_separately(['-r-test-/symbol', '-r-ext-/symbol/noninterned_name', '-'], "#{<<-'begin;'}\n#{<<-"end;"}")
+      bug = '[ruby-core:62226] [Bug #9787]'
+      include Test_Symbol::NonInterned
       names = Array.new(1000) {noninterned_name("gc")}
       names.each {|n| n.to_sym}
       GC.start(immediate_sweep: false)
@@ -378,6 +366,7 @@ module Test_Symbol https://github.com/ruby/ruby/blob/trunk/ruby_2_3/test/-ext-/symbol/test_inadvertent_creation.rb#L366
         eval(":#{n}=")
         assert_nothing_raised(TypeError, bug) {eval("proc{self.#{n} = nil}")}
       end
+      begin;
       end;
     end
 
Index: ruby_2_3/win32/win32.c
===================================================================
--- ruby_2_3/win32/win32.c	(revision 62883)
+++ ruby_2_3/win32/win32.c	(revision 62884)
@@ -2320,6 +2320,24 @@ typedef struct { https://github.com/ruby/ruby/blob/trunk/ruby_2_3/win32/win32.c#L2320
 #endif
 
 /* License: Ruby's */
+#if RUBY_MSVCRT_VERSION >= 140
+typedef char lowio_text_mode;
+typedef char lowio_pipe_lookahead[3];
+
+typedef struct {
+    CRITICAL_SECTION           lock;
+    intptr_t                   osfhnd;          // underlying OS file HANDLE
+    __int64                    startpos;        // File position that matches buffer start
+    unsigned char              osfile;          // Attributes of file (e.g., open in text mode?)
+    lowio_text_mode            textmode;
+    lowio_pipe_lookahead       _pipe_lookahead;
+
+    uint8_t unicode          : 1; // Was the file opened as unicode?
+    uint8_t utf8translations : 1; // Buffer contains translations other than CRLF
+    uint8_t dbcsBufferUsed   : 1; // Is the dbcsBuffer in use?
+    char    dbcsBuffer;           // Buffer for the lead byte of DBCS when converting from DBCS to Unicode
+} ioinfo;
+#else
 typedef struct	{
     intptr_t osfhnd;	/* underlying OS file HANDLE */
     char osfile;	/* attributes of file (e.g., open in text mode?) */
@@ -2331,20 +2349,25 @@ typedef struct	{ https://github.com/ruby/ruby/blob/trunk/ruby_2_3/win32/win32.c#L2349
     char pipech2[2];
 #endif
 }	ioinfo;
+#endif
 
 #if !defined _CRTIMP || defined __MINGW32__
 #undef _CRTIMP
 #define _CRTIMP __declspec(dllimport)
 #endif
 
+#if RUBY_MSVCRT_VERSION >= 140
+static ioinfo ** __pioinfo = NULL;
+#define IOINFO_L2E 6
+#else
 EXTERN_C _CRTIMP ioinfo * __pioinfo[];
+#define IOINFO_L2E 5
+#endif
 static inline ioinfo* _pioinfo(int);
 
-#define IOINFO_L2E			5
 #define IOINFO_ARRAY_ELTS	(1 << IOINFO_L2E)
 #define _osfhnd(i)  (_pioinfo(i)->osfhnd)
 #define _osfile(i)  (_pioinfo(i)->osfile)
-#define _pipech(i)  (_pioinfo(i)->pipech)
 #define rb_acrt_lowio_lock_fh(i)   EnterCriticalSection(&_pioinfo(i)->lock)
 #define rb_acrt_lowio_unlock_fh(i) LeaveCriticalSection(&_pioinfo(i)->lock)
 
@@ -2355,6 +2378,68 @@ static size_t pioinfo_extra = 0;	/* work https://github.com/ruby/ruby/blob/trunk/ruby_2_3/win32/win32.c#L2378
 static void
 set_pioinfo_extra(void)
 {
+#if RUBY_MSVCRT_VERSION >= 140
+# define FUNCTION_RET 0xc3 /* ret */
+# ifdef _DEBUG
+#  define UCRTBASE "ucrtbased.dll"
+# else
+#  define UCRTBASE "ucrtbase.dll"
+# endif
+    /* get __pioinfo addr with _isatty */
+    char *p = (char*)get_proc_address(UCRTBASE, "_isatty", NULL);
+    char *pend = p;
+    /* _osfile(fh) & FDEV */
+
+# if _WIN64
+    int32_t rel;
+    char *rip;
+    /* add rsp, _ */
+#  define FUNCTION_BEFORE_RET_MARK "\x48\x83\xc4"
+#  define FUNCTION_SKIP_BYTES 1
+#  ifdef _DEBUG
+    /* lea rcx,[__pioinfo's addr in RIP-relative 32bit addr] */
+#   define PIOINFO_MARK "\x48\x8d\x0d"
+#  else
+    /* lea rdx,[__pioinfo's addr in RIP-relative 32bit addr] */
+#   define PIOINFO_MARK "\x48\x8d\x15"
+#  endif
+
+# else /* x86 */
+    /* pop ebp */
+#  define FUNCTION_BEFORE_RET_MARK "\x5d"
+#  define FUNCTION_SKIP_BYTES 0
+    /* mov eax,dword ptr [eax*4+100EB430h] */
+#  define PIOINFO_MARK "\x8B\x04\x85"
+# endif
+    if (p) {
+        for (pend += 10; pend < p + 300; pend++) {
+            // find end of function
+            if (memcmp(pend, FUNCTION_BEFORE_RET_MARK, sizeof(FUNCTION_BEFORE_RET_MARK) - 1) == 0 &&
+                *(pend + (sizeof(FUNCTION_BEFORE_RET_MARK) - 1) + FUNCTION_SKIP_BYTES) & FUNCTION_RET == FUNCTION_RET) {
+                // search backwards from end of function
+                for (pend -= (sizeof(PIOINFO_MARK) - 1); pend > p; pend--) {
+                    if (memcmp(pend, PIOINFO_MARK, sizeof(PIOINFO_MARK) - 1) == 0) {
+                        p = pend;
+                        goto found;
+                    }
+                }
+                break;
+            }
+        }
+    }
+    fprintf(stderr, "unexpected " UCRTBASE "\n");
+    _exit(1);
+
+    found:
+    p += sizeof(PIOINFO_MARK) - 1;
+#if _WIN64
+    rel = *(int32_t*)(p);
+    rip = p + sizeof(int32_t);
+    __pioinfo = (ioinfo**)(rip + rel);
+#else
+    __pioinfo = *(ioinfo***)(p);
+#endif
+#else
     int fd;
 
     fd = _open("NUL", O_RDONLY);
@@ -2369,6 +2454,7 @@ set_pioinfo_extra(void) https://github.com/ruby/ruby/blob/trunk/ruby_2_3/win32/win32.c#L2454
 	/* not found, maybe something wrong... */
 	pioinfo_extra = 0;
     }
+#endif
 }
 #else
 #define pioinfo_extra 0
Index: ruby_2_3/win32/mkexports.rb
===================================================================
--- ruby_2_3/win32/mkexports.rb	(revision 62883)
+++ ruby_2_3/win32/mkexports.rb	(revision 62884)
@@ -114,6 +114,7 @@ class Exports::Mswin < Exports https://github.com/ruby/ruby/blob/trunk/ruby_2_3/win32/mkexports.rb#L114
         when /OBJECT/, /LIBRARY/
           next if /^[[:xdigit:]]+ 0+ UNDEF / =~ l
           next unless /External/ =~ l
+          next if /(?:_local_stdio_printf_options|v(f|sn?)printf_l)\Z/ =~ l
           next unless l.sub!(/.*?\s(\(\)\s+)?External\s+\|\s+/, '')
           is_data = !$1
           if noprefix or /^[@_]/ =~ l
Index: ruby_2_3/version.h
===================================================================
--- ruby_2_3/version.h	(revision 62883)
+++ ruby_2_3/version.h	(revision 62884)
@@ -1,10 +1,10 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_3/version.h#L1
 #define RUBY_VERSION "2.3.7"
-#define RUBY_RELEASE_DATE "2018-03-20"
-#define RUBY_PATCHLEVEL 430
+#define RUBY_RELEASE_DATE "2018-03-22"
+#define RUBY_PATCHLEVEL 431
 
 #define RUBY_RELEASE_YEAR 2018
 #define RUBY_RELEASE_MONTH 3
-#define RUBY_RELEASE_DAY 20
+#define RUBY_RELEASE_DAY 22
 
 #include "ruby/version.h"
 
Index: ruby_2_3
===================================================================
--- ruby_2_3	(revision 62883)
+++ ruby_2_3	(revision 62884)

Property changes on: ruby_2_3
___________________________________________________________________
Modified: svn:mergeinfo
## -0,0 +0,1 ##
   Merged /trunk:r54737,54740,55792,56746

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

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