Merge bug 454632.
authorNick Kreeger <nick.kreeger@park.edu>
Tue, 13 Jan 2009 11:14:01 -0800
changeset 23619 5a53d161e4b44c9d728b24960f41bc65131be715
parent 23618 f957a14faefdce34f35b3720cccf6bf41c3f81b2 (current diff)
parent 23617 557bc4bcdc30869b043f4c4a5b1f853850e5325f (diff)
child 23620 f0a8064d5a8e08bb9d80acf3608165fb47e5fb28
push id4641
push usernick.kreeger@park.edu
push dateTue, 13 Jan 2009 19:15:48 +0000
treeherdermozilla-central@5a53d161e4b4 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs454632
milestone1.9.2a1pre
Merge bug 454632.
new file mode 100644
--- /dev/null
+++ b/build/autoconf/moznbytetype.m4
@@ -0,0 +1,73 @@
+dnl ***** BEGIN LICENSE BLOCK *****
+dnl Version: MPL 1.1/GPL 2.0/LGPL 2.1
+dnl
+dnl The contents of this file are subject to the Mozilla Public License Version
+dnl 1.1 (the "License"); you may not use this file except in compliance with
+dnl the License. You may obtain a copy of the License at
+dnl http://www.mozilla.org/MPL/
+dnl
+dnl Software distributed under the License is distributed on an "AS IS" basis,
+dnl WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+dnl for the specific language governing rights and limitations under the
+dnl License.
+dnl
+dnl The Original Code is mozilla.org code.
+dnl
+dnl The Initial Developer of the Original Code is
+dnl   The Mozilla Foundation
+dnl Portions created by the Initial Developer are Copyright (C) 2008
+dnl the Initial Developer. All Rights Reserved.
+dnl
+dnl Contributor(s):
+dnl   Jim Blandy
+dnl
+dnl Alternatively, the contents of this file may be used under the terms of
+dnl either of the GNU General Public License Version 2 or later (the "GPL"),
+dnl or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+dnl in which case the provisions of the GPL or the LGPL are applicable instead
+dnl of those above. If you wish to allow use of your version of this file only
+dnl under the terms of either the GPL or the LGPL, and not to allow others to
+dnl use your version of this file under the terms of the MPL, indicate your
+dnl decision by deleting the provisions above and replace them with the notice
+dnl and other provisions required by the GPL or the LGPL. If you do not delete
+dnl the provisions above, a recipient may use your version of this file under
+dnl the terms of any one of the MPL, the GPL or the LGPL.
+dnl
+dnl ***** END LICENSE BLOCK *****
+
+dnl MOZ_N_BYTE_TYPE(TYPENAME, SIZE, POSSIBLE-TYPES)
+dnl
+dnl Check to see which of POSSIBLE-TYPES has a size of SIZE.  If we
+dnl find one, define TYPENAME to be the size-BYTE type.  If no type
+dnl matches, exit the configure script with an error message.  Types
+dnl whose written form contains spaces should appear in POSSIBLE-TYPES
+dnl enclosed by shell quotes.
+dnl
+dnl The cache variable moz_cv_n_byte_type_TYPENAME gets set to the
+dnl type, if found.
+dnl 
+dnl for example:
+dnl MOZ_N_BYTE_TYPE([JS_INT32_T], [4], [int long 'long long' short])
+dnl
+AC_DEFUN(MOZ_N_BYTE_TYPE,
+[
+dnl The simplest approach would simply be to run a program that says
+dnl   printf ("%d\n", sizeof ($type));
+dnl But that won't work when cross-compiling; this will.
+AC_CACHE_CHECK([for a $2-byte type], moz_cv_n_byte_type_$1, [
+  moz_cv_n_byte_type_$1=
+  for type in $3; do
+    AC_TRY_COMPILE([],
+                   [
+                     int a[sizeof ($type) == $2 ? 1 : -1];
+                     return;
+                   ],
+                   [moz_cv_n_byte_type_$1=$type; break], [])
+  done
+  if ! test "$moz_cv_n_byte_type_$1"; then
+    AC_MSG_ERROR([Couldn't find a $2-byte type])
+  fi
+])
+AC_DEFINE_UNQUOTED($1, [$moz_cv_n_byte_type_$1],
+                   [a $2-byte type on the target machine])
+])
--- a/js/src/Makefile.in
+++ b/js/src/Makefile.in
@@ -188,16 +188,17 @@ INSTALLED_HEADERS = \
 		jsprvtd.h \
 		jspubtd.h \
 		jsregexp.h \
 		jsscan.h \
 		jsscope.h \
 		jsscript.h \
 		jsstaticcheck.h \
 		jsstddef.h \
+		jsstdint.h \
 		jsstr.h \
 		jstracer.h \
 		jstypes.h \
 		jsutil.h \
 		jsversion.h \
 		jsxdrapi.h \
 		jsxml.h \
 		$(NULL)
--- a/js/src/aclocal.m4
+++ b/js/src/aclocal.m4
@@ -1,9 +1,9 @@
 dnl
 dnl Local autoconf macros used with mozilla
 dnl The contents of this file are under the Public Domain.
 dnl 
 
 builtin(include, build/autoconf/pkg.m4)dnl
 builtin(include, build/autoconf/nspr.m4)dnl
 builtin(include, build/autoconf/altoptions.m4)dnl
-
+builtin(include, build/autoconf/moznbytetype.m4)dnl
new file mode 100644
--- /dev/null
+++ b/js/src/build/autoconf/moznbytetype.m4
@@ -0,0 +1,73 @@
+dnl ***** BEGIN LICENSE BLOCK *****
+dnl Version: MPL 1.1/GPL 2.0/LGPL 2.1
+dnl
+dnl The contents of this file are subject to the Mozilla Public License Version
+dnl 1.1 (the "License"); you may not use this file except in compliance with
+dnl the License. You may obtain a copy of the License at
+dnl http://www.mozilla.org/MPL/
+dnl
+dnl Software distributed under the License is distributed on an "AS IS" basis,
+dnl WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+dnl for the specific language governing rights and limitations under the
+dnl License.
+dnl
+dnl The Original Code is mozilla.org code.
+dnl
+dnl The Initial Developer of the Original Code is
+dnl   The Mozilla Foundation
+dnl Portions created by the Initial Developer are Copyright (C) 2008
+dnl the Initial Developer. All Rights Reserved.
+dnl
+dnl Contributor(s):
+dnl   Jim Blandy
+dnl
+dnl Alternatively, the contents of this file may be used under the terms of
+dnl either of the GNU General Public License Version 2 or later (the "GPL"),
+dnl or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+dnl in which case the provisions of the GPL or the LGPL are applicable instead
+dnl of those above. If you wish to allow use of your version of this file only
+dnl under the terms of either the GPL or the LGPL, and not to allow others to
+dnl use your version of this file under the terms of the MPL, indicate your
+dnl decision by deleting the provisions above and replace them with the notice
+dnl and other provisions required by the GPL or the LGPL. If you do not delete
+dnl the provisions above, a recipient may use your version of this file under
+dnl the terms of any one of the MPL, the GPL or the LGPL.
+dnl
+dnl ***** END LICENSE BLOCK *****
+
+dnl MOZ_N_BYTE_TYPE(TYPENAME, SIZE, POSSIBLE-TYPES)
+dnl
+dnl Check to see which of POSSIBLE-TYPES has a size of SIZE.  If we
+dnl find one, define TYPENAME to be the size-BYTE type.  If no type
+dnl matches, exit the configure script with an error message.  Types
+dnl whose written form contains spaces should appear in POSSIBLE-TYPES
+dnl enclosed by shell quotes.
+dnl
+dnl The cache variable moz_cv_n_byte_type_TYPENAME gets set to the
+dnl type, if found.
+dnl 
+dnl for example:
+dnl MOZ_N_BYTE_TYPE([JS_INT32_T], [4], [int long 'long long' short])
+dnl
+AC_DEFUN(MOZ_N_BYTE_TYPE,
+[
+dnl The simplest approach would simply be to run a program that says
+dnl   printf ("%d\n", sizeof ($type));
+dnl But that won't work when cross-compiling; this will.
+AC_CACHE_CHECK([for a $2-byte type], moz_cv_n_byte_type_$1, [
+  moz_cv_n_byte_type_$1=
+  for type in $3; do
+    AC_TRY_COMPILE([],
+                   [
+                     int a[sizeof ($type) == $2 ? 1 : -1];
+                     return;
+                   ],
+                   [moz_cv_n_byte_type_$1=$type; break], [])
+  done
+  if ! test "$moz_cv_n_byte_type_$1"; then
+    AC_MSG_ERROR([Couldn't find a $2-byte type])
+  fi
+])
+AC_DEFINE_UNQUOTED($1, [$moz_cv_n_byte_type_$1],
+                   [a $2-byte type on the target machine])
+])
--- a/js/src/configure.in
+++ b/js/src/configure.in
@@ -588,16 +588,26 @@ fi
 
 AC_PROG_CPP
 AC_PROG_CXXCPP
 
 if test -n "$_WIN32_MSVC"; then
     SKIP_PATH_CHECKS=1
     SKIP_COMPILER_CHECKS=1
     SKIP_LIBRARY_CHECKS=1
+
+    # Since we're skipping compiler and library checks, hard-code
+    # some facts here.
+
+    # Windows lacks <stdint.h>, but has __int8, and so on.
+    AC_DEFINE(JS_HAVE___INTN)
+    # Windows <stddef.h> defines intptr_t and uintptr_t.
+    # VS2005: http://msdn.microsoft.com/en-us/library/323b6b3k(VS.80).aspx
+    # VS2008: http://msdn.microsoft.com/en-us/library/323b6b3k.aspx
+    AC_DEFINE(JS_STDDEF_H_HAS_INTPTR_T)
 fi
 
 fi # COMPILE_ENVIRONMENT
 
 if test "$cross_compiling"  = "yes"; then
     CROSS_COMPILE=1
 else
     CROSS_COMPILE=
@@ -2525,16 +2535,38 @@ AC_CACHE_VAL(ac_cv_siginfo_t,
                  [ac_cv_siginfo_t=false])])
 if test "$ac_cv_siginfo_t" = true ; then
   AC_DEFINE(HAVE_SIGINFO_T)
   AC_MSG_RESULT(yes)
 else
   AC_MSG_RESULT(no)
 fi
 
+dnl Find exact-width integer types, or figure them out
+dnl ourselves.
+dnl ========================================================
+dnl Once this is working, we can delete the code for int16_t,
+dnl etc. below.
+
+AC_CHECK_HEADER(stdint.h)
+if test "$ac_cv_header_stdint_h" = yes; then
+    AC_DEFINE(JS_HAVE_STDINT_H)
+else
+    dnl We'll figure them out for ourselves.  List more likely types
+    dnl earlier.  If we ever really encounter a size for which none of
+    dnl the listed types are appropriate, we'll get a configure-time
+    dnl error; just add the right answer.
+    MOZ_N_BYTE_TYPE(JS_INT8_TYPE,  1, [char])
+    MOZ_N_BYTE_TYPE(JS_INT16_TYPE, 2, [short int long])
+    MOZ_N_BYTE_TYPE(JS_INT32_TYPE, 4, [int long 'long long' short])
+    MOZ_N_BYTE_TYPE(JS_INT64_TYPE, 8, [int long 'long long'])
+    MOZ_N_BYTE_TYPE(JS_INTPTR_TYPE, sizeof (void *),
+                                      [int long 'long long' short])
+fi
+
 dnl Check for int16_t, int32_t, int64_t, int64, uint, uint_t, and uint16_t.
 dnl ========================================================
 AC_MSG_CHECKING(for int16_t)
 AC_CACHE_VAL(ac_cv_int16_t,
  [AC_TRY_COMPILE([#include <stdio.h>
                   #include <sys/types.h>],
                  [int16_t foo = 0;],
                  [ac_cv_int16_t=true],
--- a/js/src/js-config.h.in
+++ b/js/src/js-config.h.in
@@ -47,9 +47,31 @@
 
 /* Define to 1 if SpiderMonkey should support multi-threaded clients.  */
 #undef JS_THREADSAFE
 
 /* Define to 1 if SpiderMonkey should support the ability to perform
    entirely too much GC.  */
 #undef JS_GC_ZEAL
 
+/* Define to 1 if the public SpiderMonkey headers may assume that the
+   system <stdint.h> is present and useable.  Otherwise, they should
+   include "jsstdint.h", which uses values guessed at configuration
+   time.  */
+#undef JS_HAVE_STDINT_H
+
+/* Define to 1 if the public SpiderMonkey headers may assume that the
+   N-byte __intN types are defined by the compiler.  */
+#undef JS_HAVE___INTN
+
+/* Define to 1 if #including <stddef.h> provides definitions for
+   intptr_t and uintptr_t.  */
+#undef JS_STDDEF_H_HAS_INTPTR_T
+
+/* The configure script defines these if it doesn't #define
+   JS_HAVE_STDINT_H.  */
+#undef JS_INT8_TYPE
+#undef JS_INT16_TYPE
+#undef JS_INT32_TYPE
+#undef JS_INT64_TYPE
+#undef JS_INTPTR_TYPE
+
 #endif /* js_config_h___ */
new file mode 100644
--- /dev/null
+++ b/js/src/jsstdint.h
@@ -0,0 +1,96 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: set ts=8 sw=4 et tw=78:
+ *
+ * ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is mozilla.org code.
+ *
+ * The Initial Developer of the Original Code is
+ * Jim Blandy
+ * Portions created by the Initial Developer are Copyright (C) 2008
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+/* This header provides definitions for the <stdint.h> types we use,
+   even on systems that lack <stdint.h>.  */
+
+#ifndef jsstdint_h___
+#define jsstdint_h___
+
+#include "js-config.h"
+
+/* If we have a working stdint.h, use it.  */
+#if defined(JS_HAVE_STDINT_H)
+#include <stdint.h>
+
+/* If the configure script was able to find appropriate types for us,
+   use those.  */
+#elif defined(JS_INT8_TYPE)
+
+typedef signed   JS_INT8_TYPE   int8_t;
+typedef signed   JS_INT16_TYPE  int16_t;
+typedef signed   JS_INT32_TYPE  int32_t;
+typedef signed   JS_INT64_TYPE  int64_t;
+typedef signed   JS_INTPTR_TYPE intptr_t;
+
+typedef unsigned JS_INT8_TYPE   uint8_t;
+typedef unsigned JS_INT16_TYPE  uint16_t;
+typedef unsigned JS_INT32_TYPE  uint32_t;
+typedef unsigned JS_INT64_TYPE  uint64_t;
+typedef unsigned JS_INTPTR_TYPE uintptr_t;
+
+#else
+
+/* Microsoft Visual C/C++ has built-in __intN types.  */
+#if defined(JS_HAVE___INTN)
+
+typedef __int8 int8_t;
+typedef __int16 int16_t;
+typedef __int32 int32_t;
+typedef __int64 int64_t;
+
+typedef unsigned __int8 uint8_t;
+typedef unsigned __int16 uint16_t;
+typedef unsigned __int32 uint32_t;
+typedef unsigned __int64 uint64_t;
+
+#else
+#error "couldn't find exact-width integer types"
+#endif
+
+/* Microsoft Visual C/C++ defines intptr_t and uintptr_t in <stddef.h>.  */
+#if defined(JS_STDDEF_H_HAS_INTPTR_T)
+#include <stddef.h>
+#else
+#error "couldn't find definitions for intptr_t, uintptr_t"
+#endif
+
+#endif /* JS_HAVE_STDINT_H */
+
+#endif /* jsstdint_h___ */
--- a/js/src/jstypes.h
+++ b/js/src/jstypes.h
@@ -50,16 +50,17 @@
 ** and take the following steps only in those C files, we take steps once here
 ** for all C files.
 **/
 
 #ifndef jstypes_h___
 #define jstypes_h___
 
 #include <stddef.h>
+#include "jsstdint.h"
 
 /***********************************************************************
 ** MACROS:      JS_EXTERN_API
 **              JS_EXPORT_API
 ** DESCRIPTION:
 **      These are only for externally visible routines and globals.  For
 **      internal routines, just use "extern" for type checking and that
 **      will not export internal cross-file or forward-declared symbols.
--- a/js/src/nanojit/avmplus.h
+++ b/js/src/nanojit/avmplus.h
@@ -77,33 +77,16 @@
 #ifdef _DEBUG
 void NanoAssertFail();
 #endif
 
 #define AvmAssert(x) assert(x)
 #define AvmAssertMsg(x, y) 
 #define AvmDebugLog(x) printf x
 
-#ifdef _MSC_VER
-/*
- * Can we just take a moment to think about what it means that MSVC doesn't have stdint.h in 2008?
- * Thanks for your time.
- */
-typedef JSUint8  uint8_t;
-typedef JSInt8   int8_t;
-typedef JSUint16 uint16_t;
-typedef JSInt16  int16_t;
-typedef JSUint32 uint32_t;
-typedef JSInt32  int32_t;
-typedef JSUint64 uint64_t;
-typedef JSInt64  int64_t;
-#else
-#include <stdint.h>
-#endif
-
 #if defined(AVMPLUS_IA32)
 #if defined(_MSC_VER)
 __declspec(naked) static inline __int64 rdtsc()
 {
     __asm
     {
         rdtsc;
         ret;