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/