Project

General

Profile

Bug #11482 » vs2015.patch

s_p_oneil (Sean O'Neil), 08/24/2015 03:25 PM

View differences:

time.c
else
*zone = zone_str("(NO-TIMEZONE-ABBREVIATION)");
#elif defined(HAVE_TZNAME) && defined(HAVE_DAYLIGHT)
#ifdef _WIN32
#define tzname _tzname
#define daylight _daylight
#endif
/* this needs tzset or localtime, instead of localtime_r */
*zone = zone_str(tzname[daylight && tm.tm_isdst]);
#else
win32/Makefile.sub
!if $(MSC_VER) < 1400
OPTFLAGS = -O2b2xg-
!else
OPTFLAGS = -O2sy-
#OPTFLAGS = -O2sy-
OPTFLAGS = -Od
!endif
!endif
!if !defined(PLATFORM)
......
#define HAVE_STRUCT_STAT_ST_RDEV 1
#define HAVE_ST_RDEV 1
#define HAVE_STRUCT_TIMEVAL 1
!if $(MSC_VER) >= 1900
#define HAVE_STRUCT_TIMESPEC
!endif
!if $(MSC_VER) >= 1600
#define HAVE_STDINT_H 1
!else
win32/mkexports.rb
read_substitution(incdir+"/subst.h", syms, winapis)
syms["rb_w32_vsnprintf"] ||= "ruby_vsnprintf"
syms["rb_w32_snprintf"] ||= "ruby_snprintf"
@syms = syms
@syms = syms.reject {|k,v| k.index('_xmm') }
end
def read_substitution(header, syms, winapis)
......
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
win32/rtname.cmd
set rtver=
set osver=
for /f "usebackq" %%I in (`dumpbin -dependents %1 ^| findstr -r -i "\<msvcr.*\.dll$"`) do set rt=%%~nI
if "%rt%" == "" (
(echo %0: %1 is not linked to msvcrt) 1>&2
exit 1
)
if "%rt%" NEQ "" goto :msvcr
for /f "usebackq" %%I in (`dumpbin -dependents %1 ^| findstr -r -i "\<vcruntime.*\.dll$"`) do set rt=%%~nI
if "%rt%" NEQ "" goto :vcruntime
(echo %0: %1 is not linked to msvcrt nor vcruntime) 1>&2
exit 1
:msvcr
for %%i in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do @call set rt=%%rt:%%i=%%i%%
if "%rt%" == "msvcrt" (
call set rtver=60
......
call set rt=msvcr%%rtver%%
call set osver=_%%rtver%%
)
goto :exit
:vcruntime
for %%i in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do @call set rt=%%rt:%%i=%%i%%
call set rtver=%%rt:vcruntime=%%
call set rt=vcruntime%%rtver%%
call set osver=_%%rtver%%
:exit
for %%I in ("PLATFORM = $(TARGET_OS)%osver%" "RT = %rt%" "RT_VER = %rtver%") do @echo %%~I
win32/win32.c
/* License: Ruby's */
typedef struct {
#if RUBY_MSVCRT_VERSION >= 140
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?)
char textmode; // __crt_lowio_text_mode
char _pipe_lookahead[3];
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
#else
intptr_t osfhnd; /* underlying OS file HANDLE */
char osfile; /* attributes of file (e.g., open in text mode?) */
char pipech; /* one char buffer for handles opened on pipes */
......
char textmode;
char pipech2[2];
#endif
#endif
} ioinfo;
#if !defined _CRTIMP || defined __MINGW32__
......
#endif
#if !defined(__BORLANDC__)
#if RUBY_MSVCRT_VERSION >= 140
static ioinfo ** __pioinfo = NULL;
#else
EXTERN_C _CRTIMP ioinfo * __pioinfo[];
#endif
static inline ioinfo* _pioinfo(int);
#define IOINFO_L2E 5
#define IOINFO_L2E (RUBY_MSVCRT_VERSION >= 140 ? 6 : 5)
#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)
#define _osfhnd(i) (_pioinfo(i)->osfhnd)
#define _osfile(i) (_pioinfo(i)->osfile)
......
static void
set_pioinfo_extra(void)
{
#if RUBY_MSVCRT_VERSION >= 140
// get __pioinfo addr with _isatty
HMODULE mod = GetModuleHandle("ucrtbase.dll");
char *addr = (char*)GetProcAddress(mod, "_isatty");
// _osfile(fh) & FDEV /*0x40*/
#if _WIN64
// lea rdx,[__pioinfo's addr in RIP-relative 32bit addr]
addr += 0x25;
# define OPSIZE 3
if (memcmp(addr, "\x48\x8d\x15", OPSIZE)) {
fprintf(stderr, "unexpected ucrtbase.dll\n");
abort();
}
addr += OPSIZE;
int32_t rel = *(int32_t*)(addr);
char *rip = addr + 4;
__pioinfo = (ioinfo**)(rip + rel);
#else
// mov eax,dword ptr [eax*4+100EB430h]
addr += 0x32;
# define OPSIZE 3
if (memcmp(addr, "\x8B\x04\x85", OPSIZE)) {
fprintf(stderr, "unexpected ucrtbase.dll\n");
abort();
}
__pioinfo = (ioinfo**)*(intptr_t*)(addr + OPSIZE);
#endif
#else
int fd;
fd = _open("NUL", O_RDONLY);
......
/* not found, maybe something wrong... */
pioinfo_extra = 0;
}
#endif
}
#else
#define pioinfo_extra 0
......
(fd))
if (fileno(stdin) < 0) {
stdin->_file = open_null(0);
freopen("NUL", "r+b", stdin);
}
else {
setmode(fileno(stdin), O_BINARY);
}
if (fileno(stdout) < 0) {
stdout->_file = open_null(1);
freopen("NUL", "r+b", stdout);
}
if (fileno(stderr) < 0) {
stderr->_file = open_null(2);
freopen("NUL", "r+b", stderr);
}
if (nullfd >= 0 && !keep) close(nullfd);
setvbuf(stderr, NULL, _IONBF, 0);
......
#define FILE_COUNT _cnt
#define FILE_READPTR _ptr
#undef fgetc
/*#undef fgetc*/
/* License: Ruby's */
int
rb_w32_getc(FILE* stream)
{
int c;
#if RUBY_MSVCRT_VERSION >= 140
c = _fgetc_nolock(stream);
catch_interrupt();
#else
if (enough_to_get(stream->FILE_COUNT)) {
c = (unsigned char)*stream->FILE_READPTR++;
}
......
#endif
catch_interrupt();
}
#endif
return c;
}
#undef fputc
/* #undef fputc */
/* License: Ruby's */
int
rb_w32_putc(int c, FILE* stream)
{
#if RUBY_MSVCRT_VERSION >= 140
c = _fputc_nolock(c, stream);
catch_interrupt();
#else
if (enough_to_put(stream->FILE_COUNT)) {
c = (unsigned char)(*stream->FILE_READPTR++ = (char)c);
}
......
c = _flsbuf(c, stream);
catch_interrupt();
}
#endif
return c;
}
(3-3/3)