diff --git a/js/src/Makefile.in b/js/src/Makefile.in index 80177e95bef9..e416af2dea2a 100644 --- a/js/src/Makefile.in +++ b/js/src/Makefile.in @@ -176,6 +176,7 @@ INSTALLED_HEADERS = \ jsgc.h \ jshash.h \ jsinterp.h \ + jsinttypes.h \ jsiter.h \ jslock.h \ jslong.h \ @@ -196,7 +197,6 @@ INSTALLED_HEADERS = \ jsscope.h \ jsscript.h \ jsstaticcheck.h \ - jsstdint.h \ jsstr.h \ jstracer.h \ jstypes.h \ diff --git a/js/src/js-config.h.in b/js/src/js-config.h.in index e0eb95a27a2c..5e667e31064e 100644 --- a/js/src/js-config.h.in +++ b/js/src/js-config.h.in @@ -52,14 +52,12 @@ entirely too much GC. */ #undef JS_GC_ZEAL -/* Define to 1 if the public SpiderMonkey headers may assume that the - system is present and useable. Otherwise, they should - include "jsstdint.h", which uses values guessed at configuration - time. */ +/* Define to 1 if the standard header is present and + useable. See jstypes.h and jsstdint.h. */ #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. */ +/* Define to 1 if the N-byte __intN types are defined by the + compiler. */ #undef JS_HAVE___INTN /* Define to 1 if #including provides definitions for diff --git a/js/src/jsinttypes.h b/js/src/jsinttypes.h new file mode 100644 index 000000000000..e239551f90c3 --- /dev/null +++ b/js/src/jsinttypes.h @@ -0,0 +1,139 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** 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 SpiderMonkey JavaScript 1.9 code, released + * May 28, 2008. + * + * The Initial Developer of the Original Code is + * Jim Blandy + * Portions created by the Initial Developer are Copyright (C) 2009 + * the Initial Developer. All Rights Reserved. + * + * 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 ***** */ + +#ifndef jsinttypes_h___ +#define jsinttypes_h___ + +#include "js-config.h" + +/* + * Types: + * JSInt, JSUint (for = 8, 16, 32, and 64) + * JSIntPtr, JSUIntPtr + * + * JSInt and JSUint are signed and unsigned types known to be + * bits long. Note that neither JSInt8 nor JSUInt8 is necessarily + * equivalent to a plain "char". + * + * JSIntPtr and JSUintPtr are signed and unsigned types capable of + * holding an object pointer. + * + * Use these types in public SpiderMonkey header files, not the + * corresponding types from the C standard header. Windows + * doesn't support , and Microsoft says it has no plans to + * do so in the future; this means that projects that embed + * SpiderMonkey often take matters into their own hands and define the + * standard types themselves. If we define them in our public + * headers, our definitions may conflict with embedders' (see bug + * 479258). The JS* types are in our namespace, and can be used + * without troubling anyone. + * + * Internal SpiderMonkey code wishing to use the type names ISO C + * defines in the standard header can #include + * "jsstdint.h", which provides those types regardless of whether + * itself is available. + */ + +#if defined(JS_HAVE_STDINT_H) + +#include + +typedef int8_t JSInt8; +typedef int16_t JSInt16; +typedef int32_t JSInt32; +typedef int64_t JSInt64; +typedef intptr_t JSIntPtr; + +typedef uint8_t JSUint8; +typedef uint16_t JSUint16; +typedef uint32_t JSUint32; +typedef uint64_t JSUint64; +typedef uintptr_t JSUintPtr; + +#else + +#if defined(JS_HAVE___INTN) + +typedef __int8 JSInt8; +typedef __int16 JSInt16; +typedef __int32 JSInt32; +typedef __int64 JSInt64; + +typedef unsigned __int8 JSUint8; +typedef unsigned __int16 JSUint16; +typedef unsigned __int32 JSUint32; +typedef unsigned __int64 JSUint64; + +#elif defined(JS_INT8_TYPE) + +typedef signed JS_INT8_TYPE JSInt8; +typedef signed JS_INT16_TYPE JSInt16; +typedef signed JS_INT32_TYPE JSInt32; +typedef signed JS_INT64_TYPE JSInt64; + +typedef unsigned JS_INT8_TYPE JSUint8; +typedef unsigned JS_INT16_TYPE JSUint16; +typedef unsigned JS_INT32_TYPE JSUint32; +typedef unsigned JS_INT64_TYPE JSUint64; + +#else +#error "couldn't find exact-width integer types" +#endif + +/* Microsoft Visual C/C++ defines intptr_t and uintptr_t in . */ +#if defined(JS_STDDEF_H_HAS_INTPTR_T) +#include +typedef intptr_t JSIntPtr; +typedef uintptr_t JSUintPtr; + +/* Windows Mobile defines intptr_t and uintptr_t in . Why not? */ +#elif defined(JS_CRTDEFS_H_HAS_INTPTR_T) +#include +typedef intptr_t JSIntPtr; +typedef uintptr_t JSUintPtr; + +/* Failing that, the configure script will have found something. */ +#elif defined(JS_INTPTR_TYPE) +typedef signed JS_INTPTR_TYPE JSIntPtr; +typedef unsigned JS_INTPTR_TYPE JSUintPtr; + +#else +#error "couldn't find pointer-sized integer types" +#endif + +#endif /* JS_HAVE_STDINT_H */ + +#endif /* jsinttypes_h___ */ diff --git a/js/src/jsstdint.h b/js/src/jsstdint.h index 126892709651..1ce569aea1b5 100644 --- a/js/src/jsstdint.h +++ b/js/src/jsstdint.h @@ -37,63 +37,46 @@ * * ***** END LICENSE BLOCK ***** */ -/* This header provides definitions for the types we use, - even on systems that lack . */ +/* + * This header provides definitions for the types we use, + * even on systems that lack . + * + * NOTE: This header should only be included in private SpiderMonkey + * code; public headers should use only the JS{Int,Uint}N types; see + * the comment for them in "jsinttypes.h". + * + * At the moment, these types are not widely used within SpiderMonkey; + * this file is meant to make existing uses portable, and to allow us + * to transition portably to using them more, if desired. + */ #ifndef jsstdint_h___ #define jsstdint_h___ -#include "js-config.h" +#include "jsinttypes.h" -/* If we have a working stdint.h, use it. */ -#if defined(JS_HAVE_STDINT_H) -#include +/* If we have a working stdint.h, then jsinttypes.h has already + defined the standard integer types. Otherwise, define the standard + names in terms of the 'JS' types. */ +#if ! defined(JS_HAVE_STDINT_H) -/* If the configure script was able to find appropriate types for us, - use those. */ -#elif defined(JS_INT8_TYPE) +typedef JSInt8 int8_t; +typedef JSInt16 int16_t; +typedef JSInt32 int32_t; +typedef JSInt64 int64_t; -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 JSUint8 uint8_t; +typedef JSUint16 uint16_t; +typedef JSUint32 uint32_t; +typedef JSUint64 uint64_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 . */ -#if defined(JS_STDDEF_H_HAS_INTPTR_T) -#include - -/* Windows Mobile defines intptr_t and uintptr_t in . Why not? */ -#elif defined(JS_CRTDEFS_H_HAS_INTPTR_T) -#include - -#else -#error "couldn't find definitions for intptr_t, uintptr_t" +/* If JS_STDDEF_H_HAS_INTPTR_T or JS_CRTDEFS_H_HAS_INTPTR_T are + defined, then jsinttypes.h included the given header, which + introduced definitions for intptr_t and uintptr_t. Otherwise, + define the standard names in terms of the 'JS' types. */ +#if !defined(JS_STDDEF_H_HAS_INTPTR_T) && !defined(JS_CRTDEFS_H_HAS_INTPTR_T) +typedef JSIntPtr intptr_t; +typedef JSUintPtr uintptr_t; #endif #endif /* JS_HAVE_STDINT_H */ diff --git a/js/src/jstypes.h b/js/src/jstypes.h index 81dc5af728e6..17b9d7d893d6 100644 --- a/js/src/jstypes.h +++ b/js/src/jstypes.h @@ -55,7 +55,7 @@ #define jstypes_h___ #include -#include "jsstdint.h" +#include "js-config.h" /*********************************************************************** ** MACROS: JS_EXTERN_API @@ -279,53 +279,10 @@ # include "jsautocfg.h" /* Use auto-detected configuration */ #endif +#include "jsinttypes.h" + JS_BEGIN_EXTERN_C -/************************************************************************ -** TYPES: JSUint8 -** JSInt8 -** DESCRIPTION: -** The int8 types are known to be 8 bits each. There is no type that -** is equivalent to a plain "char". -************************************************************************/ - -typedef uint8_t JSUint8; -typedef int8_t JSInt8; - -/************************************************************************ -** TYPES: JSUint16 -** JSInt16 -** DESCRIPTION: -** The int16 types are known to be 16 bits each. -************************************************************************/ - -typedef uint16_t JSUint16; -typedef int16_t JSInt16; - -/************************************************************************ -** TYPES: JSUint32 -** JSInt32 -** DESCRIPTION: -** The int32 types are known to be 32 bits each. -************************************************************************/ - -typedef uint32_t JSUint32; -typedef int32_t JSInt32; - -/************************************************************************ -** TYPES: JSUint64 -** JSInt64 -** DESCRIPTION: -** The int64 types are known to be 64 bits each. Care must be used when -** declaring variables of type JSUint64 or JSInt64. Different hardware -** architectures and even different compilers have varying support for -** 64 bit values. The only guaranteed portability requires the use of -** the JSLL_ macros (see jslong.h). -************************************************************************/ - -typedef uint64_t JSUint64; -typedef int64_t JSInt64; - /************************************************************************ ** TYPES: JSUintn ** JSIntn @@ -367,7 +324,7 @@ typedef ptrdiff_t JSPtrdiff; ** A type for pointer difference. Variables of this type are suitable ** for storing a pointer or pointer sutraction. ************************************************************************/ -typedef uintptr_t JSUptrdiff; +typedef JSUintPtr JSUptrdiff; /************************************************************************ ** TYPES: JSBool @@ -392,8 +349,8 @@ typedef JSUint8 JSPackedBool; /* ** A JSWord is an integer that is the same size as a void* */ -typedef intptr_t JSWord; -typedef uintptr_t JSUword; +typedef JSIntPtr JSWord; +typedef JSUintPtr JSUword; #include "jsotypes.h" diff --git a/js/src/nanojit/avmplus.h b/js/src/nanojit/avmplus.h index dd0ce9c98857..9605ce7a90ba 100644 --- a/js/src/nanojit/avmplus.h +++ b/js/src/nanojit/avmplus.h @@ -45,6 +45,7 @@ #endif #include "jstypes.h" +#include "jsstdint.h" #if !defined(AVMPLUS_LITTLE_ENDIAN) && !defined(AVMPLUS_BIG_ENDIAN) #ifdef IS_BIG_ENDIAN