Bug 945582 - Don't use jemalloc3 C99 headers with MSVC versions that have (some) C99 support. r=mshal
authorMike Hommey <mh+mozilla@glandium.org>
Sat, 31 May 2014 09:54:23 +0900
changeset 185983 16c8da443faacf70a083d3900b577221f50b1a13
parent 185982 091479837adc58fb89011ae41cbd1014b24dd26a
child 185984 9f56d8be7e42b43fe6adc5b5a956e38242536593
push id26871
push userphilringnalda@gmail.com
push dateSun, 01 Jun 2014 03:29:42 +0000
treeherdermozilla-central@0e10c8151654 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmshal
bugs945582
milestone32.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 945582 - Don't use jemalloc3 C99 headers with MSVC versions that have (some) C99 support. r=mshal
configure.in
memory/jemalloc/0003-Don-t-use-msvc_compat-s-C99-headers-with-MSVC-versio.patch
memory/jemalloc/moz.build
memory/jemalloc/src/configure
memory/jemalloc/src/configure.ac
memory/jemalloc/src/include/msvc_compat/C99/inttypes.h
memory/jemalloc/src/include/msvc_compat/C99/stdbool.h
memory/jemalloc/src/include/msvc_compat/C99/stdint.h
memory/jemalloc/src/include/msvc_compat/inttypes.h
memory/jemalloc/src/include/msvc_compat/stdbool.h
memory/jemalloc/src/include/msvc_compat/stdint.h
memory/jemalloc/update.sh
--- a/configure.in
+++ b/configure.in
@@ -8126,17 +8126,23 @@ else
     MOZ_PIXMAN_LIBS="$PIXMAN_LIBS"
 fi
 AC_SUBST(MOZ_PIXMAN_CFLAGS)
 AC_SUBST(MOZ_PIXMAN_LIBS)
 
 # Check for headers defining standard int types.
 if test -n "$COMPILE_ENVIRONMENT"; then
     MOZ_CHECK_HEADERS(stdint.h inttypes.h sys/int_types.h)
-fi
+
+    if test "${ac_cv_header_inttypes_h}" = "yes"; then
+        HAVE_INTTYPES_H=1
+    fi
+fi
+
+AC_SUBST(HAVE_INTTYPES_H)
 
 if test "$MOZ_TREE_CAIRO"; then
     MOZ_CAIRO_CFLAGS='-I$(LIBXUL_DIST)/include/cairo'
     AC_DEFINE(MOZ_TREE_CAIRO)
 
     if test "$OS_ARCH" = "WINNT"; then
         # For now we assume that we will have a uint64_t available through
         # one of the above headers or mozstdint.h.
new file mode 100644
--- /dev/null
+++ b/memory/jemalloc/0003-Don-t-use-msvc_compat-s-C99-headers-with-MSVC-versio.patch
@@ -0,0 +1,1224 @@
+diff -r 1da44232e82e -r 73d73a2ae3ad configure
+--- a/configure	Wed May 21 14:41:51 2014 -0700
++++ b/configure	Thu May 29 16:35:25 2014 +0900
+@@ -4333,16 +4333,20 @@ fi
+ 
+ if test "x${ac_cv_big_endian}" = "x1" ; then
+   cat >>confdefs.h <<_ACEOF
+ #define JEMALLOC_BIG_ENDIAN
+ _ACEOF
+ 
+ fi
+ 
++if test "x${je_cv_msvc}" = "xyes" -a "x${ac_cv_header_inttypes_h}" = "xno"; then
++  CPPFLAGS="$CPPFLAGS -I${srcroot}/include/msvc_compat/C99"
++fi
++
+ # The cast to long int works around a bug in the HP C Compiler
+ # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+ # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+ # This bug is HP SR number 8606223364.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
+ $as_echo_n "checking size of void *... " >&6; }
+ if ${ac_cv_sizeof_void_p+:} false; then :
+   $as_echo_n "(cached) " >&6
+diff -r 1da44232e82e -r 73d73a2ae3ad configure.ac
+--- a/configure.ac	Wed May 21 14:41:51 2014 -0700
++++ b/configure.ac	Thu May 29 16:35:25 2014 +0900
+@@ -150,16 +150,20 @@ if test "x$EXTRA_CFLAGS" != "x" ; then
+ fi
+ AC_PROG_CPP
+ 
+ AC_C_BIGENDIAN([ac_cv_big_endian=1], [ac_cv_big_endian=0])
+ if test "x${ac_cv_big_endian}" = "x1" ; then
+   AC_DEFINE_UNQUOTED([JEMALLOC_BIG_ENDIAN], [ ])
+ fi
+ 
++if test "x${je_cv_msvc}" = "xyes" -a "x${ac_cv_header_inttypes_h}" = "xno"; then
++  CPPFLAGS="$CPPFLAGS -I${srcroot}/include/msvc_compat/C99"
++fi
++
+ AC_CHECK_SIZEOF([void *])
+ if test "x${ac_cv_sizeof_void_p}" = "x8" ; then
+   LG_SIZEOF_PTR=3
+ elif test "x${ac_cv_sizeof_void_p}" = "x4" ; then
+   LG_SIZEOF_PTR=2
+ else
+   AC_MSG_ERROR([Unsupported pointer size: ${ac_cv_sizeof_void_p}])
+ fi
+diff -r 1da44232e82e -r 73d73a2ae3ad include/msvc_compat/C99/inttypes.h
+--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
++++ b/include/msvc_compat/C99/inttypes.h	Thu May 29 16:35:25 2014 +0900
+@@ -0,0 +1,313 @@
++// ISO C9x  compliant inttypes.h for Microsoft Visual Studio
++// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 
++// 
++//  Copyright (c) 2006 Alexander Chemeris
++// 
++// Redistribution and use in source and binary forms, with or without
++// modification, are permitted provided that the following conditions are met:
++// 
++//   1. Redistributions of source code must retain the above copyright notice,
++//      this list of conditions and the following disclaimer.
++// 
++//   2. Redistributions in binary form must reproduce the above copyright
++//      notice, this list of conditions and the following disclaimer in the
++//      documentation and/or other materials provided with the distribution.
++// 
++//   3. The name of the author may be used to endorse or promote products
++//      derived from this software without specific prior written permission.
++// 
++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
++// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
++// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
++// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
++// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
++// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
++// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++// 
++///////////////////////////////////////////////////////////////////////////////
++
++#ifndef _MSC_VER // [
++#error "Use this header only with Microsoft Visual C++ compilers!"
++#endif // _MSC_VER ]
++
++#ifndef _MSC_INTTYPES_H_ // [
++#define _MSC_INTTYPES_H_
++
++#if _MSC_VER > 1000
++#pragma once
++#endif
++
++#include "stdint.h"
++
++// 7.8 Format conversion of integer types
++
++typedef struct {
++   intmax_t quot;
++   intmax_t rem;
++} imaxdiv_t;
++
++// 7.8.1 Macros for format specifiers
++
++#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [   See footnote 185 at page 198
++
++#ifdef _WIN64
++#  define __PRI64_PREFIX        "l"
++#  define __PRIPTR_PREFIX       "l"
++#else
++#  define __PRI64_PREFIX        "ll"
++#  define __PRIPTR_PREFIX
++#endif
++
++// The fprintf macros for signed integers are:
++#define PRId8       "d"
++#define PRIi8       "i"
++#define PRIdLEAST8  "d"
++#define PRIiLEAST8  "i"
++#define PRIdFAST8   "d"
++#define PRIiFAST8   "i"
++
++#define PRId16       "hd"
++#define PRIi16       "hi"
++#define PRIdLEAST16  "hd"
++#define PRIiLEAST16  "hi"
++#define PRIdFAST16   "hd"
++#define PRIiFAST16   "hi"
++
++#define PRId32       "d"
++#define PRIi32       "i"
++#define PRIdLEAST32  "d"
++#define PRIiLEAST32  "i"
++#define PRIdFAST32   "d"
++#define PRIiFAST32   "i"
++
++#define PRId64       __PRI64_PREFIX "d"
++#define PRIi64       __PRI64_PREFIX "i"
++#define PRIdLEAST64  __PRI64_PREFIX "d"
++#define PRIiLEAST64  __PRI64_PREFIX "i"
++#define PRIdFAST64   __PRI64_PREFIX "d"
++#define PRIiFAST64   __PRI64_PREFIX "i"
++
++#define PRIdMAX     __PRI64_PREFIX "d"
++#define PRIiMAX     __PRI64_PREFIX "i"
++
++#define PRIdPTR     __PRIPTR_PREFIX "d"
++#define PRIiPTR     __PRIPTR_PREFIX "i"
++
++// The fprintf macros for unsigned integers are:
++#define PRIo8       "o"
++#define PRIu8       "u"
++#define PRIx8       "x"
++#define PRIX8       "X"
++#define PRIoLEAST8  "o"
++#define PRIuLEAST8  "u"
++#define PRIxLEAST8  "x"
++#define PRIXLEAST8  "X"
++#define PRIoFAST8   "o"
++#define PRIuFAST8   "u"
++#define PRIxFAST8   "x"
++#define PRIXFAST8   "X"
++
++#define PRIo16       "ho"
++#define PRIu16       "hu"
++#define PRIx16       "hx"
++#define PRIX16       "hX"
++#define PRIoLEAST16  "ho"
++#define PRIuLEAST16  "hu"
++#define PRIxLEAST16  "hx"
++#define PRIXLEAST16  "hX"
++#define PRIoFAST16   "ho"
++#define PRIuFAST16   "hu"
++#define PRIxFAST16   "hx"
++#define PRIXFAST16   "hX"
++
++#define PRIo32       "o"
++#define PRIu32       "u"
++#define PRIx32       "x"
++#define PRIX32       "X"
++#define PRIoLEAST32  "o"
++#define PRIuLEAST32  "u"
++#define PRIxLEAST32  "x"
++#define PRIXLEAST32  "X"
++#define PRIoFAST32   "o"
++#define PRIuFAST32   "u"
++#define PRIxFAST32   "x"
++#define PRIXFAST32   "X"
++
++#define PRIo64       __PRI64_PREFIX "o"
++#define PRIu64       __PRI64_PREFIX "u"
++#define PRIx64       __PRI64_PREFIX "x"
++#define PRIX64       __PRI64_PREFIX "X"
++#define PRIoLEAST64  __PRI64_PREFIX "o"
++#define PRIuLEAST64  __PRI64_PREFIX "u"
++#define PRIxLEAST64  __PRI64_PREFIX "x"
++#define PRIXLEAST64  __PRI64_PREFIX "X"
++#define PRIoFAST64   __PRI64_PREFIX "o"
++#define PRIuFAST64   __PRI64_PREFIX "u"
++#define PRIxFAST64   __PRI64_PREFIX "x"
++#define PRIXFAST64   __PRI64_PREFIX "X"
++
++#define PRIoMAX     __PRI64_PREFIX "o"
++#define PRIuMAX     __PRI64_PREFIX "u"
++#define PRIxMAX     __PRI64_PREFIX "x"
++#define PRIXMAX     __PRI64_PREFIX "X"
++
++#define PRIoPTR     __PRIPTR_PREFIX "o"
++#define PRIuPTR     __PRIPTR_PREFIX "u"
++#define PRIxPTR     __PRIPTR_PREFIX "x"
++#define PRIXPTR     __PRIPTR_PREFIX "X"
++
++// The fscanf macros for signed integers are:
++#define SCNd8       "d"
++#define SCNi8       "i"
++#define SCNdLEAST8  "d"
++#define SCNiLEAST8  "i"
++#define SCNdFAST8   "d"
++#define SCNiFAST8   "i"
++
++#define SCNd16       "hd"
++#define SCNi16       "hi"
++#define SCNdLEAST16  "hd"
++#define SCNiLEAST16  "hi"
++#define SCNdFAST16   "hd"
++#define SCNiFAST16   "hi"
++
++#define SCNd32       "ld"
++#define SCNi32       "li"
++#define SCNdLEAST32  "ld"
++#define SCNiLEAST32  "li"
++#define SCNdFAST32   "ld"
++#define SCNiFAST32   "li"
++
++#define SCNd64       "I64d"
++#define SCNi64       "I64i"
++#define SCNdLEAST64  "I64d"
++#define SCNiLEAST64  "I64i"
++#define SCNdFAST64   "I64d"
++#define SCNiFAST64   "I64i"
++
++#define SCNdMAX     "I64d"
++#define SCNiMAX     "I64i"
++
++#ifdef _WIN64 // [
++#  define SCNdPTR     "I64d"
++#  define SCNiPTR     "I64i"
++#else  // _WIN64 ][
++#  define SCNdPTR     "ld"
++#  define SCNiPTR     "li"
++#endif  // _WIN64 ]
++
++// The fscanf macros for unsigned integers are:
++#define SCNo8       "o"
++#define SCNu8       "u"
++#define SCNx8       "x"
++#define SCNX8       "X"
++#define SCNoLEAST8  "o"
++#define SCNuLEAST8  "u"
++#define SCNxLEAST8  "x"
++#define SCNXLEAST8  "X"
++#define SCNoFAST8   "o"
++#define SCNuFAST8   "u"
++#define SCNxFAST8   "x"
++#define SCNXFAST8   "X"
++
++#define SCNo16       "ho"
++#define SCNu16       "hu"
++#define SCNx16       "hx"
++#define SCNX16       "hX"
++#define SCNoLEAST16  "ho"
++#define SCNuLEAST16  "hu"
++#define SCNxLEAST16  "hx"
++#define SCNXLEAST16  "hX"
++#define SCNoFAST16   "ho"
++#define SCNuFAST16   "hu"
++#define SCNxFAST16   "hx"
++#define SCNXFAST16   "hX"
++
++#define SCNo32       "lo"
++#define SCNu32       "lu"
++#define SCNx32       "lx"
++#define SCNX32       "lX"
++#define SCNoLEAST32  "lo"
++#define SCNuLEAST32  "lu"
++#define SCNxLEAST32  "lx"
++#define SCNXLEAST32  "lX"
++#define SCNoFAST32   "lo"
++#define SCNuFAST32   "lu"
++#define SCNxFAST32   "lx"
++#define SCNXFAST32   "lX"
++
++#define SCNo64       "I64o"
++#define SCNu64       "I64u"
++#define SCNx64       "I64x"
++#define SCNX64       "I64X"
++#define SCNoLEAST64  "I64o"
++#define SCNuLEAST64  "I64u"
++#define SCNxLEAST64  "I64x"
++#define SCNXLEAST64  "I64X"
++#define SCNoFAST64   "I64o"
++#define SCNuFAST64   "I64u"
++#define SCNxFAST64   "I64x"
++#define SCNXFAST64   "I64X"
++
++#define SCNoMAX     "I64o"
++#define SCNuMAX     "I64u"
++#define SCNxMAX     "I64x"
++#define SCNXMAX     "I64X"
++
++#ifdef _WIN64 // [
++#  define SCNoPTR     "I64o"
++#  define SCNuPTR     "I64u"
++#  define SCNxPTR     "I64x"
++#  define SCNXPTR     "I64X"
++#else  // _WIN64 ][
++#  define SCNoPTR     "lo"
++#  define SCNuPTR     "lu"
++#  define SCNxPTR     "lx"
++#  define SCNXPTR     "lX"
++#endif  // _WIN64 ]
++
++#endif // __STDC_FORMAT_MACROS ]
++
++// 7.8.2 Functions for greatest-width integer types
++
++// 7.8.2.1 The imaxabs function
++#define imaxabs _abs64
++
++// 7.8.2.2 The imaxdiv function
++
++// This is modified version of div() function from Microsoft's div.c found
++// in %MSVC.NET%\crt\src\div.c
++#ifdef STATIC_IMAXDIV // [
++static
++#else // STATIC_IMAXDIV ][
++_inline
++#endif // STATIC_IMAXDIV ]
++imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom)
++{
++   imaxdiv_t result;
++
++   result.quot = numer / denom;
++   result.rem = numer % denom;
++
++   if (numer < 0 && result.rem > 0) {
++      // did division wrong; must fix up
++      ++result.quot;
++      result.rem -= denom;
++   }
++
++   return result;
++}
++
++// 7.8.2.3 The strtoimax and strtoumax functions
++#define strtoimax _strtoi64
++#define strtoumax _strtoui64
++
++// 7.8.2.4 The wcstoimax and wcstoumax functions
++#define wcstoimax _wcstoi64
++#define wcstoumax _wcstoui64
++
++
++#endif // _MSC_INTTYPES_H_ ]
+diff -r 1da44232e82e -r 73d73a2ae3ad include/msvc_compat/C99/stdbool.h
+--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
++++ b/include/msvc_compat/C99/stdbool.h	Thu May 29 16:35:25 2014 +0900
+@@ -0,0 +1,16 @@
++#ifndef stdbool_h
++#define stdbool_h
++
++#include <wtypes.h>
++
++/* MSVC doesn't define _Bool or bool in C, but does have BOOL */
++/* Note this doesn't pass autoconf's test because (bool) 0.5 != true */
++typedef BOOL _Bool;
++
++#define bool _Bool
++#define true 1
++#define false 0
++
++#define __bool_true_false_are_defined 1
++
++#endif /* stdbool_h */
+diff -r 1da44232e82e -r 73d73a2ae3ad include/msvc_compat/C99/stdint.h
+--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
++++ b/include/msvc_compat/C99/stdint.h	Thu May 29 16:35:25 2014 +0900
+@@ -0,0 +1,247 @@
++// ISO C9x  compliant stdint.h for Microsoft Visual Studio
++// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 
++// 
++//  Copyright (c) 2006-2008 Alexander Chemeris
++// 
++// Redistribution and use in source and binary forms, with or without
++// modification, are permitted provided that the following conditions are met:
++// 
++//   1. Redistributions of source code must retain the above copyright notice,
++//      this list of conditions and the following disclaimer.
++// 
++//   2. Redistributions in binary form must reproduce the above copyright
++//      notice, this list of conditions and the following disclaimer in the
++//      documentation and/or other materials provided with the distribution.
++// 
++//   3. The name of the author may be used to endorse or promote products
++//      derived from this software without specific prior written permission.
++// 
++// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
++// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
++// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
++// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
++// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
++// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
++// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
++// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
++// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++// 
++///////////////////////////////////////////////////////////////////////////////
++
++#ifndef _MSC_VER // [
++#error "Use this header only with Microsoft Visual C++ compilers!"
++#endif // _MSC_VER ]
++
++#ifndef _MSC_STDINT_H_ // [
++#define _MSC_STDINT_H_
++
++#if _MSC_VER > 1000
++#pragma once
++#endif
++
++#include <limits.h>
++
++// For Visual Studio 6 in C++ mode and for many Visual Studio versions when
++// compiling for ARM we should wrap <wchar.h> include with 'extern "C++" {}'
++// or compiler give many errors like this:
++//   error C2733: second C linkage of overloaded function 'wmemchr' not allowed
++#ifdef __cplusplus
++extern "C" {
++#endif
++#  include <wchar.h>
++#ifdef __cplusplus
++}
++#endif
++
++// Define _W64 macros to mark types changing their size, like intptr_t.
++#ifndef _W64
++#  if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
++#     define _W64 __w64
++#  else
++#     define _W64
++#  endif
++#endif
++
++
++// 7.18.1 Integer types
++
++// 7.18.1.1 Exact-width integer types
++
++// Visual Studio 6 and Embedded Visual C++ 4 doesn't
++// realize that, e.g. char has the same size as __int8
++// so we give up on __intX for them.
++#if (_MSC_VER < 1300)
++   typedef signed char       int8_t;
++   typedef signed short      int16_t;
++   typedef signed int        int32_t;
++   typedef unsigned char     uint8_t;
++   typedef unsigned short    uint16_t;
++   typedef unsigned int      uint32_t;
++#else
++   typedef signed __int8     int8_t;
++   typedef signed __int16    int16_t;
++   typedef signed __int32    int32_t;
++   typedef unsigned __int8   uint8_t;
++   typedef unsigned __int16  uint16_t;
++   typedef unsigned __int32  uint32_t;
++#endif
++typedef signed __int64       int64_t;
++typedef unsigned __int64     uint64_t;
++
++
++// 7.18.1.2 Minimum-width integer types
++typedef int8_t    int_least8_t;
++typedef int16_t   int_least16_t;
++typedef int32_t   int_least32_t;
++typedef int64_t   int_least64_t;
++typedef uint8_t   uint_least8_t;
++typedef uint16_t  uint_least16_t;
++typedef uint32_t  uint_least32_t;
++typedef uint64_t  uint_least64_t;
++
++// 7.18.1.3 Fastest minimum-width integer types
++typedef int8_t    int_fast8_t;
++typedef int16_t   int_fast16_t;
++typedef int32_t   int_fast32_t;
++typedef int64_t   int_fast64_t;
++typedef uint8_t   uint_fast8_t;
++typedef uint16_t  uint_fast16_t;
++typedef uint32_t  uint_fast32_t;
++typedef uint64_t  uint_fast64_t;
++
++// 7.18.1.4 Integer types capable of holding object pointers
++#ifdef _WIN64 // [
++   typedef signed __int64    intptr_t;
++   typedef unsigned __int64  uintptr_t;
++#else // _WIN64 ][
++   typedef _W64 signed int   intptr_t;
++   typedef _W64 unsigned int uintptr_t;
++#endif // _WIN64 ]
++
++// 7.18.1.5 Greatest-width integer types
++typedef int64_t   intmax_t;
++typedef uint64_t  uintmax_t;
++
++
++// 7.18.2 Limits of specified-width integer types
++
++#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [   See footnote 220 at page 257 and footnote 221 at page 259
++
++// 7.18.2.1 Limits of exact-width integer types
++#define INT8_MIN     ((int8_t)_I8_MIN)
++#define INT8_MAX     _I8_MAX
++#define INT16_MIN    ((int16_t)_I16_MIN)
++#define INT16_MAX    _I16_MAX
++#define INT32_MIN    ((int32_t)_I32_MIN)
++#define INT32_MAX    _I32_MAX
++#define INT64_MIN    ((int64_t)_I64_MIN)
++#define INT64_MAX    _I64_MAX
++#define UINT8_MAX    _UI8_MAX
++#define UINT16_MAX   _UI16_MAX
++#define UINT32_MAX   _UI32_MAX
++#define UINT64_MAX   _UI64_MAX
++
++// 7.18.2.2 Limits of minimum-width integer types
++#define INT_LEAST8_MIN    INT8_MIN
++#define INT_LEAST8_MAX    INT8_MAX
++#define INT_LEAST16_MIN   INT16_MIN
++#define INT_LEAST16_MAX   INT16_MAX
++#define INT_LEAST32_MIN   INT32_MIN
++#define INT_LEAST32_MAX   INT32_MAX
++#define INT_LEAST64_MIN   INT64_MIN
++#define INT_LEAST64_MAX   INT64_MAX
++#define UINT_LEAST8_MAX   UINT8_MAX
++#define UINT_LEAST16_MAX  UINT16_MAX
++#define UINT_LEAST32_MAX  UINT32_MAX
++#define UINT_LEAST64_MAX  UINT64_MAX
++
++// 7.18.2.3 Limits of fastest minimum-width integer types
++#define INT_FAST8_MIN    INT8_MIN
++#define INT_FAST8_MAX    INT8_MAX
++#define INT_FAST16_MIN   INT16_MIN
++#define INT_FAST16_MAX   INT16_MAX
++#define INT_FAST32_MIN   INT32_MIN
++#define INT_FAST32_MAX   INT32_MAX
++#define INT_FAST64_MIN   INT64_MIN
++#define INT_FAST64_MAX   INT64_MAX
++#define UINT_FAST8_MAX   UINT8_MAX
++#define UINT_FAST16_MAX  UINT16_MAX
++#define UINT_FAST32_MAX  UINT32_MAX
++#define UINT_FAST64_MAX  UINT64_MAX
++
++// 7.18.2.4 Limits of integer types capable of holding object pointers
++#ifdef _WIN64 // [
++#  define INTPTR_MIN   INT64_MIN
++#  define INTPTR_MAX   INT64_MAX
++#  define UINTPTR_MAX  UINT64_MAX
++#else // _WIN64 ][
++#  define INTPTR_MIN   INT32_MIN
++#  define INTPTR_MAX   INT32_MAX
++#  define UINTPTR_MAX  UINT32_MAX
++#endif // _WIN64 ]
++
++// 7.18.2.5 Limits of greatest-width integer types
++#define INTMAX_MIN   INT64_MIN
++#define INTMAX_MAX   INT64_MAX
++#define UINTMAX_MAX  UINT64_MAX
++
++// 7.18.3 Limits of other integer types
++
++#ifdef _WIN64 // [
++#  define PTRDIFF_MIN  _I64_MIN
++#  define PTRDIFF_MAX  _I64_MAX
++#else  // _WIN64 ][
++#  define PTRDIFF_MIN  _I32_MIN
++#  define PTRDIFF_MAX  _I32_MAX
++#endif  // _WIN64 ]
++
++#define SIG_ATOMIC_MIN  INT_MIN
++#define SIG_ATOMIC_MAX  INT_MAX
++
++#ifndef SIZE_MAX // [
++#  ifdef _WIN64 // [
++#     define SIZE_MAX  _UI64_MAX
++#  else // _WIN64 ][
++#     define SIZE_MAX  _UI32_MAX
++#  endif // _WIN64 ]
++#endif // SIZE_MAX ]
++
++// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>
++#ifndef WCHAR_MIN // [
++#  define WCHAR_MIN  0
++#endif  // WCHAR_MIN ]
++#ifndef WCHAR_MAX // [
++#  define WCHAR_MAX  _UI16_MAX
++#endif  // WCHAR_MAX ]
++
++#define WINT_MIN  0
++#define WINT_MAX  _UI16_MAX
++
++#endif // __STDC_LIMIT_MACROS ]
++
++
++// 7.18.4 Limits of other integer types
++
++#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [   See footnote 224 at page 260
++
++// 7.18.4.1 Macros for minimum-width integer constants
++
++#define INT8_C(val)  val##i8
++#define INT16_C(val) val##i16
++#define INT32_C(val) val##i32
++#define INT64_C(val) val##i64
++
++#define UINT8_C(val)  val##ui8
++#define UINT16_C(val) val##ui16
++#define UINT32_C(val) val##ui32
++#define UINT64_C(val) val##ui64
++
++// 7.18.4.2 Macros for greatest-width integer constants
++#define INTMAX_C   INT64_C
++#define UINTMAX_C  UINT64_C
++
++#endif // __STDC_CONSTANT_MACROS ]
++
++
++#endif // _MSC_STDINT_H_ ]
+diff -r 1da44232e82e -r 73d73a2ae3ad include/msvc_compat/inttypes.h
+--- a/include/msvc_compat/inttypes.h	Wed May 21 14:41:51 2014 -0700
++++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
+@@ -1,313 +0,0 @@
+-// ISO C9x  compliant inttypes.h for Microsoft Visual Studio
+-// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 
+-// 
+-//  Copyright (c) 2006 Alexander Chemeris
+-// 
+-// Redistribution and use in source and binary forms, with or without
+-// modification, are permitted provided that the following conditions are met:
+-// 
+-//   1. Redistributions of source code must retain the above copyright notice,
+-//      this list of conditions and the following disclaimer.
+-// 
+-//   2. Redistributions in binary form must reproduce the above copyright
+-//      notice, this list of conditions and the following disclaimer in the
+-//      documentation and/or other materials provided with the distribution.
+-// 
+-//   3. The name of the author may be used to endorse or promote products
+-//      derived from this software without specific prior written permission.
+-// 
+-// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+-// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+-// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+-// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+-// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+-// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
+-// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+-// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+-// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-// 
+-///////////////////////////////////////////////////////////////////////////////
+-
+-#ifndef _MSC_VER // [
+-#error "Use this header only with Microsoft Visual C++ compilers!"
+-#endif // _MSC_VER ]
+-
+-#ifndef _MSC_INTTYPES_H_ // [
+-#define _MSC_INTTYPES_H_
+-
+-#if _MSC_VER > 1000
+-#pragma once
+-#endif
+-
+-#include "stdint.h"
+-
+-// 7.8 Format conversion of integer types
+-
+-typedef struct {
+-   intmax_t quot;
+-   intmax_t rem;
+-} imaxdiv_t;
+-
+-// 7.8.1 Macros for format specifiers
+-
+-#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) // [   See footnote 185 at page 198
+-
+-#ifdef _WIN64
+-#  define __PRI64_PREFIX        "l"
+-#  define __PRIPTR_PREFIX       "l"
+-#else
+-#  define __PRI64_PREFIX        "ll"
+-#  define __PRIPTR_PREFIX
+-#endif
+-
+-// The fprintf macros for signed integers are:
+-#define PRId8       "d"
+-#define PRIi8       "i"
+-#define PRIdLEAST8  "d"
+-#define PRIiLEAST8  "i"
+-#define PRIdFAST8   "d"
+-#define PRIiFAST8   "i"
+-
+-#define PRId16       "hd"
+-#define PRIi16       "hi"
+-#define PRIdLEAST16  "hd"
+-#define PRIiLEAST16  "hi"
+-#define PRIdFAST16   "hd"
+-#define PRIiFAST16   "hi"
+-
+-#define PRId32       "d"
+-#define PRIi32       "i"
+-#define PRIdLEAST32  "d"
+-#define PRIiLEAST32  "i"
+-#define PRIdFAST32   "d"
+-#define PRIiFAST32   "i"
+-
+-#define PRId64       __PRI64_PREFIX "d"
+-#define PRIi64       __PRI64_PREFIX "i"
+-#define PRIdLEAST64  __PRI64_PREFIX "d"
+-#define PRIiLEAST64  __PRI64_PREFIX "i"
+-#define PRIdFAST64   __PRI64_PREFIX "d"
+-#define PRIiFAST64   __PRI64_PREFIX "i"
+-
+-#define PRIdMAX     __PRI64_PREFIX "d"
+-#define PRIiMAX     __PRI64_PREFIX "i"
+-
+-#define PRIdPTR     __PRIPTR_PREFIX "d"
+-#define PRIiPTR     __PRIPTR_PREFIX "i"
+-
+-// The fprintf macros for unsigned integers are:
+-#define PRIo8       "o"
+-#define PRIu8       "u"
+-#define PRIx8       "x"
+-#define PRIX8       "X"
+-#define PRIoLEAST8  "o"
+-#define PRIuLEAST8  "u"
+-#define PRIxLEAST8  "x"
+-#define PRIXLEAST8  "X"
+-#define PRIoFAST8   "o"
+-#define PRIuFAST8   "u"
+-#define PRIxFAST8   "x"
+-#define PRIXFAST8   "X"
+-
+-#define PRIo16       "ho"
+-#define PRIu16       "hu"
+-#define PRIx16       "hx"
+-#define PRIX16       "hX"
+-#define PRIoLEAST16  "ho"
+-#define PRIuLEAST16  "hu"
+-#define PRIxLEAST16  "hx"
+-#define PRIXLEAST16  "hX"
+-#define PRIoFAST16   "ho"
+-#define PRIuFAST16   "hu"
+-#define PRIxFAST16   "hx"
+-#define PRIXFAST16   "hX"
+-
+-#define PRIo32       "o"
+-#define PRIu32       "u"
+-#define PRIx32       "x"
+-#define PRIX32       "X"
+-#define PRIoLEAST32  "o"
+-#define PRIuLEAST32  "u"
+-#define PRIxLEAST32  "x"
+-#define PRIXLEAST32  "X"
+-#define PRIoFAST32   "o"
+-#define PRIuFAST32   "u"
+-#define PRIxFAST32   "x"
+-#define PRIXFAST32   "X"
+-
+-#define PRIo64       __PRI64_PREFIX "o"
+-#define PRIu64       __PRI64_PREFIX "u"
+-#define PRIx64       __PRI64_PREFIX "x"
+-#define PRIX64       __PRI64_PREFIX "X"
+-#define PRIoLEAST64  __PRI64_PREFIX "o"
+-#define PRIuLEAST64  __PRI64_PREFIX "u"
+-#define PRIxLEAST64  __PRI64_PREFIX "x"
+-#define PRIXLEAST64  __PRI64_PREFIX "X"
+-#define PRIoFAST64   __PRI64_PREFIX "o"
+-#define PRIuFAST64   __PRI64_PREFIX "u"
+-#define PRIxFAST64   __PRI64_PREFIX "x"
+-#define PRIXFAST64   __PRI64_PREFIX "X"
+-
+-#define PRIoMAX     __PRI64_PREFIX "o"
+-#define PRIuMAX     __PRI64_PREFIX "u"
+-#define PRIxMAX     __PRI64_PREFIX "x"
+-#define PRIXMAX     __PRI64_PREFIX "X"
+-
+-#define PRIoPTR     __PRIPTR_PREFIX "o"
+-#define PRIuPTR     __PRIPTR_PREFIX "u"
+-#define PRIxPTR     __PRIPTR_PREFIX "x"
+-#define PRIXPTR     __PRIPTR_PREFIX "X"
+-
+-// The fscanf macros for signed integers are:
+-#define SCNd8       "d"
+-#define SCNi8       "i"
+-#define SCNdLEAST8  "d"
+-#define SCNiLEAST8  "i"
+-#define SCNdFAST8   "d"
+-#define SCNiFAST8   "i"
+-
+-#define SCNd16       "hd"
+-#define SCNi16       "hi"
+-#define SCNdLEAST16  "hd"
+-#define SCNiLEAST16  "hi"
+-#define SCNdFAST16   "hd"
+-#define SCNiFAST16   "hi"
+-
+-#define SCNd32       "ld"
+-#define SCNi32       "li"
+-#define SCNdLEAST32  "ld"
+-#define SCNiLEAST32  "li"
+-#define SCNdFAST32   "ld"
+-#define SCNiFAST32   "li"
+-
+-#define SCNd64       "I64d"
+-#define SCNi64       "I64i"
+-#define SCNdLEAST64  "I64d"
+-#define SCNiLEAST64  "I64i"
+-#define SCNdFAST64   "I64d"
+-#define SCNiFAST64   "I64i"
+-
+-#define SCNdMAX     "I64d"
+-#define SCNiMAX     "I64i"
+-
+-#ifdef _WIN64 // [
+-#  define SCNdPTR     "I64d"
+-#  define SCNiPTR     "I64i"
+-#else  // _WIN64 ][
+-#  define SCNdPTR     "ld"
+-#  define SCNiPTR     "li"
+-#endif  // _WIN64 ]
+-
+-// The fscanf macros for unsigned integers are:
+-#define SCNo8       "o"
+-#define SCNu8       "u"
+-#define SCNx8       "x"
+-#define SCNX8       "X"
+-#define SCNoLEAST8  "o"
+-#define SCNuLEAST8  "u"
+-#define SCNxLEAST8  "x"
+-#define SCNXLEAST8  "X"
+-#define SCNoFAST8   "o"
+-#define SCNuFAST8   "u"
+-#define SCNxFAST8   "x"
+-#define SCNXFAST8   "X"
+-
+-#define SCNo16       "ho"
+-#define SCNu16       "hu"
+-#define SCNx16       "hx"
+-#define SCNX16       "hX"
+-#define SCNoLEAST16  "ho"
+-#define SCNuLEAST16  "hu"
+-#define SCNxLEAST16  "hx"
+-#define SCNXLEAST16  "hX"
+-#define SCNoFAST16   "ho"
+-#define SCNuFAST16   "hu"
+-#define SCNxFAST16   "hx"
+-#define SCNXFAST16   "hX"
+-
+-#define SCNo32       "lo"
+-#define SCNu32       "lu"
+-#define SCNx32       "lx"
+-#define SCNX32       "lX"
+-#define SCNoLEAST32  "lo"
+-#define SCNuLEAST32  "lu"
+-#define SCNxLEAST32  "lx"
+-#define SCNXLEAST32  "lX"
+-#define SCNoFAST32   "lo"
+-#define SCNuFAST32   "lu"
+-#define SCNxFAST32   "lx"
+-#define SCNXFAST32   "lX"
+-
+-#define SCNo64       "I64o"
+-#define SCNu64       "I64u"
+-#define SCNx64       "I64x"
+-#define SCNX64       "I64X"
+-#define SCNoLEAST64  "I64o"
+-#define SCNuLEAST64  "I64u"
+-#define SCNxLEAST64  "I64x"
+-#define SCNXLEAST64  "I64X"
+-#define SCNoFAST64   "I64o"
+-#define SCNuFAST64   "I64u"
+-#define SCNxFAST64   "I64x"
+-#define SCNXFAST64   "I64X"
+-
+-#define SCNoMAX     "I64o"
+-#define SCNuMAX     "I64u"
+-#define SCNxMAX     "I64x"
+-#define SCNXMAX     "I64X"
+-
+-#ifdef _WIN64 // [
+-#  define SCNoPTR     "I64o"
+-#  define SCNuPTR     "I64u"
+-#  define SCNxPTR     "I64x"
+-#  define SCNXPTR     "I64X"
+-#else  // _WIN64 ][
+-#  define SCNoPTR     "lo"
+-#  define SCNuPTR     "lu"
+-#  define SCNxPTR     "lx"
+-#  define SCNXPTR     "lX"
+-#endif  // _WIN64 ]
+-
+-#endif // __STDC_FORMAT_MACROS ]
+-
+-// 7.8.2 Functions for greatest-width integer types
+-
+-// 7.8.2.1 The imaxabs function
+-#define imaxabs _abs64
+-
+-// 7.8.2.2 The imaxdiv function
+-
+-// This is modified version of div() function from Microsoft's div.c found
+-// in %MSVC.NET%\crt\src\div.c
+-#ifdef STATIC_IMAXDIV // [
+-static
+-#else // STATIC_IMAXDIV ][
+-_inline
+-#endif // STATIC_IMAXDIV ]
+-imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom)
+-{
+-   imaxdiv_t result;
+-
+-   result.quot = numer / denom;
+-   result.rem = numer % denom;
+-
+-   if (numer < 0 && result.rem > 0) {
+-      // did division wrong; must fix up
+-      ++result.quot;
+-      result.rem -= denom;
+-   }
+-
+-   return result;
+-}
+-
+-// 7.8.2.3 The strtoimax and strtoumax functions
+-#define strtoimax _strtoi64
+-#define strtoumax _strtoui64
+-
+-// 7.8.2.4 The wcstoimax and wcstoumax functions
+-#define wcstoimax _wcstoi64
+-#define wcstoumax _wcstoui64
+-
+-
+-#endif // _MSC_INTTYPES_H_ ]
+diff -r 1da44232e82e -r 73d73a2ae3ad include/msvc_compat/stdbool.h
+--- a/include/msvc_compat/stdbool.h	Wed May 21 14:41:51 2014 -0700
++++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
+@@ -1,16 +0,0 @@
+-#ifndef stdbool_h
+-#define stdbool_h
+-
+-#include <wtypes.h>
+-
+-/* MSVC doesn't define _Bool or bool in C, but does have BOOL */
+-/* Note this doesn't pass autoconf's test because (bool) 0.5 != true */
+-typedef BOOL _Bool;
+-
+-#define bool _Bool
+-#define true 1
+-#define false 0
+-
+-#define __bool_true_false_are_defined 1
+-
+-#endif /* stdbool_h */
+diff -r 1da44232e82e -r 73d73a2ae3ad include/msvc_compat/stdint.h
+--- a/include/msvc_compat/stdint.h	Wed May 21 14:41:51 2014 -0700
++++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
+@@ -1,247 +0,0 @@
+-// ISO C9x  compliant stdint.h for Microsoft Visual Studio
+-// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 
+-// 
+-//  Copyright (c) 2006-2008 Alexander Chemeris
+-// 
+-// Redistribution and use in source and binary forms, with or without
+-// modification, are permitted provided that the following conditions are met:
+-// 
+-//   1. Redistributions of source code must retain the above copyright notice,
+-//      this list of conditions and the following disclaimer.
+-// 
+-//   2. Redistributions in binary form must reproduce the above copyright
+-//      notice, this list of conditions and the following disclaimer in the
+-//      documentation and/or other materials provided with the distribution.
+-// 
+-//   3. The name of the author may be used to endorse or promote products
+-//      derived from this software without specific prior written permission.
+-// 
+-// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+-// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+-// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+-// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+-// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+-// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
+-// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+-// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+-// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-// 
+-///////////////////////////////////////////////////////////////////////////////
+-
+-#ifndef _MSC_VER // [
+-#error "Use this header only with Microsoft Visual C++ compilers!"
+-#endif // _MSC_VER ]
+-
+-#ifndef _MSC_STDINT_H_ // [
+-#define _MSC_STDINT_H_
+-
+-#if _MSC_VER > 1000
+-#pragma once
+-#endif
+-
+-#include <limits.h>
+-
+-// For Visual Studio 6 in C++ mode and for many Visual Studio versions when
+-// compiling for ARM we should wrap <wchar.h> include with 'extern "C++" {}'
+-// or compiler give many errors like this:
+-//   error C2733: second C linkage of overloaded function 'wmemchr' not allowed
+-#ifdef __cplusplus
+-extern "C" {
+-#endif
+-#  include <wchar.h>
+-#ifdef __cplusplus
+-}
+-#endif
+-
+-// Define _W64 macros to mark types changing their size, like intptr_t.
+-#ifndef _W64
+-#  if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
+-#     define _W64 __w64
+-#  else
+-#     define _W64
+-#  endif
+-#endif
+-
+-
+-// 7.18.1 Integer types
+-
+-// 7.18.1.1 Exact-width integer types
+-
+-// Visual Studio 6 and Embedded Visual C++ 4 doesn't
+-// realize that, e.g. char has the same size as __int8
+-// so we give up on __intX for them.
+-#if (_MSC_VER < 1300)
+-   typedef signed char       int8_t;
+-   typedef signed short      int16_t;
+-   typedef signed int        int32_t;
+-   typedef unsigned char     uint8_t;
+-   typedef unsigned short    uint16_t;
+-   typedef unsigned int      uint32_t;
+-#else
+-   typedef signed __int8     int8_t;
+-   typedef signed __int16    int16_t;
+-   typedef signed __int32    int32_t;
+-   typedef unsigned __int8   uint8_t;
+-   typedef unsigned __int16  uint16_t;
+-   typedef unsigned __int32  uint32_t;
+-#endif
+-typedef signed __int64       int64_t;
+-typedef unsigned __int64     uint64_t;
+-
+-
+-// 7.18.1.2 Minimum-width integer types
+-typedef int8_t    int_least8_t;
+-typedef int16_t   int_least16_t;
+-typedef int32_t   int_least32_t;
+-typedef int64_t   int_least64_t;
+-typedef uint8_t   uint_least8_t;
+-typedef uint16_t  uint_least16_t;
+-typedef uint32_t  uint_least32_t;
+-typedef uint64_t  uint_least64_t;
+-
+-// 7.18.1.3 Fastest minimum-width integer types
+-typedef int8_t    int_fast8_t;
+-typedef int16_t   int_fast16_t;
+-typedef int32_t   int_fast32_t;
+-typedef int64_t   int_fast64_t;
+-typedef uint8_t   uint_fast8_t;
+-typedef uint16_t  uint_fast16_t;
+-typedef uint32_t  uint_fast32_t;
+-typedef uint64_t  uint_fast64_t;
+-
+-// 7.18.1.4 Integer types capable of holding object pointers
+-#ifdef _WIN64 // [
+-   typedef signed __int64    intptr_t;
+-   typedef unsigned __int64  uintptr_t;
+-#else // _WIN64 ][
+-   typedef _W64 signed int   intptr_t;
+-   typedef _W64 unsigned int uintptr_t;
+-#endif // _WIN64 ]
+-
+-// 7.18.1.5 Greatest-width integer types
+-typedef int64_t   intmax_t;
+-typedef uint64_t  uintmax_t;
+-
+-
+-// 7.18.2 Limits of specified-width integer types
+-
+-#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [   See footnote 220 at page 257 and footnote 221 at page 259
+-
+-// 7.18.2.1 Limits of exact-width integer types
+-#define INT8_MIN     ((int8_t)_I8_MIN)
+-#define INT8_MAX     _I8_MAX
+-#define INT16_MIN    ((int16_t)_I16_MIN)
+-#define INT16_MAX    _I16_MAX
+-#define INT32_MIN    ((int32_t)_I32_MIN)
+-#define INT32_MAX    _I32_MAX
+-#define INT64_MIN    ((int64_t)_I64_MIN)
+-#define INT64_MAX    _I64_MAX
+-#define UINT8_MAX    _UI8_MAX
+-#define UINT16_MAX   _UI16_MAX
+-#define UINT32_MAX   _UI32_MAX
+-#define UINT64_MAX   _UI64_MAX
+-
+-// 7.18.2.2 Limits of minimum-width integer types
+-#define INT_LEAST8_MIN    INT8_MIN
+-#define INT_LEAST8_MAX    INT8_MAX
+-#define INT_LEAST16_MIN   INT16_MIN
+-#define INT_LEAST16_MAX   INT16_MAX
+-#define INT_LEAST32_MIN   INT32_MIN
+-#define INT_LEAST32_MAX   INT32_MAX
+-#define INT_LEAST64_MIN   INT64_MIN
+-#define INT_LEAST64_MAX   INT64_MAX
+-#define UINT_LEAST8_MAX   UINT8_MAX
+-#define UINT_LEAST16_MAX  UINT16_MAX
+-#define UINT_LEAST32_MAX  UINT32_MAX
+-#define UINT_LEAST64_MAX  UINT64_MAX
+-
+-// 7.18.2.3 Limits of fastest minimum-width integer types
+-#define INT_FAST8_MIN    INT8_MIN
+-#define INT_FAST8_MAX    INT8_MAX
+-#define INT_FAST16_MIN   INT16_MIN
+-#define INT_FAST16_MAX   INT16_MAX
+-#define INT_FAST32_MIN   INT32_MIN
+-#define INT_FAST32_MAX   INT32_MAX
+-#define INT_FAST64_MIN   INT64_MIN
+-#define INT_FAST64_MAX   INT64_MAX
+-#define UINT_FAST8_MAX   UINT8_MAX
+-#define UINT_FAST16_MAX  UINT16_MAX
+-#define UINT_FAST32_MAX  UINT32_MAX
+-#define UINT_FAST64_MAX  UINT64_MAX
+-
+-// 7.18.2.4 Limits of integer types capable of holding object pointers
+-#ifdef _WIN64 // [
+-#  define INTPTR_MIN   INT64_MIN
+-#  define INTPTR_MAX   INT64_MAX
+-#  define UINTPTR_MAX  UINT64_MAX
+-#else // _WIN64 ][
+-#  define INTPTR_MIN   INT32_MIN
+-#  define INTPTR_MAX   INT32_MAX
+-#  define UINTPTR_MAX  UINT32_MAX
+-#endif // _WIN64 ]
+-
+-// 7.18.2.5 Limits of greatest-width integer types
+-#define INTMAX_MIN   INT64_MIN
+-#define INTMAX_MAX   INT64_MAX
+-#define UINTMAX_MAX  UINT64_MAX
+-
+-// 7.18.3 Limits of other integer types
+-
+-#ifdef _WIN64 // [
+-#  define PTRDIFF_MIN  _I64_MIN
+-#  define PTRDIFF_MAX  _I64_MAX
+-#else  // _WIN64 ][
+-#  define PTRDIFF_MIN  _I32_MIN
+-#  define PTRDIFF_MAX  _I32_MAX
+-#endif  // _WIN64 ]
+-
+-#define SIG_ATOMIC_MIN  INT_MIN
+-#define SIG_ATOMIC_MAX  INT_MAX
+-
+-#ifndef SIZE_MAX // [
+-#  ifdef _WIN64 // [
+-#     define SIZE_MAX  _UI64_MAX
+-#  else // _WIN64 ][
+-#     define SIZE_MAX  _UI32_MAX
+-#  endif // _WIN64 ]
+-#endif // SIZE_MAX ]
+-
+-// WCHAR_MIN and WCHAR_MAX are also defined in <wchar.h>
+-#ifndef WCHAR_MIN // [
+-#  define WCHAR_MIN  0
+-#endif  // WCHAR_MIN ]
+-#ifndef WCHAR_MAX // [
+-#  define WCHAR_MAX  _UI16_MAX
+-#endif  // WCHAR_MAX ]
+-
+-#define WINT_MIN  0
+-#define WINT_MAX  _UI16_MAX
+-
+-#endif // __STDC_LIMIT_MACROS ]
+-
+-
+-// 7.18.4 Limits of other integer types
+-
+-#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [   See footnote 224 at page 260
+-
+-// 7.18.4.1 Macros for minimum-width integer constants
+-
+-#define INT8_C(val)  val##i8
+-#define INT16_C(val) val##i16
+-#define INT32_C(val) val##i32
+-#define INT64_C(val) val##i64
+-
+-#define UINT8_C(val)  val##ui8
+-#define UINT16_C(val) val##ui16
+-#define UINT32_C(val) val##ui32
+-#define UINT64_C(val) val##ui64
+-
+-// 7.18.4.2 Macros for greatest-width integer constants
+-#define INTMAX_C   INT64_C
+-#define UINTMAX_C  UINT64_C
+-
+-#endif // __STDC_CONSTANT_MACROS ]
+-
+-
+-#endif // _MSC_STDINT_H_ ]
--- a/memory/jemalloc/moz.build
+++ b/memory/jemalloc/moz.build
@@ -38,16 +38,18 @@ if CONFIG['OS_TARGET'] == 'Darwin' and n
 
 LIBRARY_NAME = 'jemalloc'
 
 FORCE_STATIC_LIB = True
 
 if CONFIG['_MSC_VER']:
     DEFINES['DLLEXPORT'] = True
     LOCAL_INCLUDES += ['src/include/msvc_compat']
+    if not CONFIG['HAVE_INTTYPES_H']:
+        LOCAL_INCLUDES += ['src/include/msvc_compat/C99']
 
 if CONFIG['OS_TARGET'] == 'Linux':
     # For mremap
     DEFINES['_GNU_SOURCE'] = True
 
 DEFINES['abort'] = 'moz_abort'
 
 GENERATED_INCLUDES += ['src/include']
--- a/memory/jemalloc/src/configure
+++ b/memory/jemalloc/src/configure
@@ -4333,16 +4333,20 @@ fi
 
 if test "x${ac_cv_big_endian}" = "x1" ; then
   cat >>confdefs.h <<_ACEOF
 #define JEMALLOC_BIG_ENDIAN
 _ACEOF
 
 fi
 
+if test "x${je_cv_msvc}" = "xyes" -a "x${ac_cv_header_inttypes_h}" = "xno"; then
+  CPPFLAGS="$CPPFLAGS -I${srcroot}/include/msvc_compat/C99"
+fi
+
 # The cast to long int works around a bug in the HP C Compiler
 # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
 # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
 # This bug is HP SR number 8606223364.
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
 $as_echo_n "checking size of void *... " >&6; }
 if ${ac_cv_sizeof_void_p+:} false; then :
   $as_echo_n "(cached) " >&6
--- a/memory/jemalloc/src/configure.ac
+++ b/memory/jemalloc/src/configure.ac
@@ -150,16 +150,20 @@ if test "x$EXTRA_CFLAGS" != "x" ; then
 fi
 AC_PROG_CPP
 
 AC_C_BIGENDIAN([ac_cv_big_endian=1], [ac_cv_big_endian=0])
 if test "x${ac_cv_big_endian}" = "x1" ; then
   AC_DEFINE_UNQUOTED([JEMALLOC_BIG_ENDIAN], [ ])
 fi
 
+if test "x${je_cv_msvc}" = "xyes" -a "x${ac_cv_header_inttypes_h}" = "xno"; then
+  CPPFLAGS="$CPPFLAGS -I${srcroot}/include/msvc_compat/C99"
+fi
+
 AC_CHECK_SIZEOF([void *])
 if test "x${ac_cv_sizeof_void_p}" = "x8" ; then
   LG_SIZEOF_PTR=3
 elif test "x${ac_cv_sizeof_void_p}" = "x4" ; then
   LG_SIZEOF_PTR=2
 else
   AC_MSG_ERROR([Unsupported pointer size: ${ac_cv_sizeof_void_p}])
 fi
rename from memory/jemalloc/src/include/msvc_compat/inttypes.h
rename to memory/jemalloc/src/include/msvc_compat/C99/inttypes.h
rename from memory/jemalloc/src/include/msvc_compat/stdbool.h
rename to memory/jemalloc/src/include/msvc_compat/C99/stdbool.h
rename from memory/jemalloc/src/include/msvc_compat/stdint.h
rename to memory/jemalloc/src/include/msvc_compat/C99/stdint.h
--- a/memory/jemalloc/update.sh
+++ b/memory/jemalloc/update.sh
@@ -11,13 +11,14 @@ git clone "$UPSTREAM_REPO" src
 cd src
 git checkout "$UPSTREAM_COMMIT"
 autoconf
 git describe --long --abbrev=40 > VERSION
 rm -rf .git .gitignore autom4te.cache
 
 patch -p1 < ../0001-Use-a-configure-test-to-detect-whether-to-use-a-cons.patch
 patch -p1 < ../0002-Use-ULL-prefix-instead-of-LLU-for-unsigned-long-long.patch
+patch -p1 < ../0003-Don-t-use-msvc_compat-s-C99-headers-with-MSVC-versio.patch
 
 cd ..
 hg addremove -q src
 
 echo "jemalloc has now been updated.  Don't forget to run hg commit!"