mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-25 05:41:12 +00:00
Bug 465640: Use autoconf to declare stdint types on platforms that don't have stdint.h r=bsmedberg
At configure time, check for <stdint.h>. If we don't have it, find integer types of various sizes. On Windows, where we can't run compilation tests in configure, hard-code definitions suggesting the use of the built-in __intN types for the exact-size types, and <stddef.h> for the pointer-sized types. Use namespace-clean names for the preprocessor macros we define. Since these types are used in the public JavaScript API, the configure script needs to place the definitions it finds in js-config.h, the installed configure-generated header, so it can be used by jsapi.h and that gang. New header js/src/jsstdint.h does what it takes to get definitions for the exact-size and pointer-size integral types. It includes <stdint.h> when available, uses the types found by configure.in to define the {,u}int{8,16,32,64,ptr}_t types itself, or uses the __intN types and the <stddef.h> header. Remove now-unnecessary and possibly conflicting definitions of intN_t types from js/src/nanojit/avmplus.h.
This commit is contained in:
parent
9e4c216172
commit
8d8846acd1
73
build/autoconf/moznbytetype.m4
Normal file
73
build/autoconf/moznbytetype.m4
Normal file
@ -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])
|
||||
])
|
@ -193,6 +193,7 @@ INSTALLED_HEADERS = \
|
||||
jsscript.h \
|
||||
jsstaticcheck.h \
|
||||
jsstddef.h \
|
||||
jsstdint.h \
|
||||
jsstr.h \
|
||||
jstracer.h \
|
||||
jstypes.h \
|
||||
|
2
js/src/aclocal.m4
vendored
2
js/src/aclocal.m4
vendored
@ -6,4 +6,4 @@ 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
|
||||
|
73
js/src/build/autoconf/moznbytetype.m4
Normal file
73
js/src/build/autoconf/moznbytetype.m4
Normal file
@ -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])
|
||||
])
|
@ -593,6 +593,16 @@ 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
|
||||
@ -2530,6 +2540,28 @@ 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)
|
||||
|
@ -52,4 +52,26 @@
|
||||
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___ */
|
||||
|
96
js/src/jsstdint.h
Normal file
96
js/src/jsstdint.h
Normal file
@ -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___ */
|
@ -55,6 +55,7 @@
|
||||
#define jstypes_h___
|
||||
|
||||
#include <stddef.h>
|
||||
#include "jsstdint.h"
|
||||
|
||||
/***********************************************************************
|
||||
** MACROS: JS_EXTERN_API
|
||||
|
@ -82,23 +82,6 @@ void NanoAssertFail();
|
||||
#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()
|
||||
|
Loading…
Reference in New Issue
Block a user