Blame js/src/jstypes.h

Packit f0b94e
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
Packit f0b94e
 * vim: set ts=8 sts=4 et sw=4 tw=99:
Packit f0b94e
 * This Source Code Form is subject to the terms of the Mozilla Public
Packit f0b94e
 * License, v. 2.0. If a copy of the MPL was not distributed with this
Packit f0b94e
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
Packit f0b94e
Packit f0b94e
/*
Packit f0b94e
** File:                jstypes.h
Packit f0b94e
** Description: Definitions of NSPR's basic types
Packit f0b94e
**
Packit f0b94e
** Prototypes and macros used to make up for deficiencies in ANSI environments
Packit f0b94e
** that we have found.
Packit f0b94e
**
Packit f0b94e
** Since we do not wrap <stdlib.h> and all the other standard headers, authors
Packit f0b94e
** of portable code will not know in general that they need these definitions.
Packit f0b94e
** Instead of requiring these authors to find the dependent uses in their code
Packit f0b94e
** and take the following steps only in those C files, we take steps once here
Packit f0b94e
** for all C files.
Packit f0b94e
**/
Packit f0b94e
Packit f0b94e
#ifndef jstypes_h
Packit f0b94e
#define jstypes_h
Packit f0b94e
Packit f0b94e
#include "mozilla/Attributes.h"
Packit f0b94e
#include "mozilla/Casting.h"
Packit f0b94e
#include "mozilla/Types.h"
Packit f0b94e
Packit f0b94e
// jstypes.h is (or should be!) included by every file in SpiderMonkey.
Packit f0b94e
// js-config.h also should be included by every file. So include it here.
Packit f0b94e
// XXX: including it in js/RequiredDefines.h should be a better option, since
Packit f0b94e
// that is by definition the header file that should be included in all
Packit f0b94e
// SpiderMonkey code.  However, Gecko doesn't do this!  See bug 909576.
Packit f0b94e
#include "js-config.h"
Packit f0b94e
Packit f0b94e
/***********************************************************************
Packit f0b94e
** MACROS:      JS_EXTERN_API
Packit f0b94e
**              JS_EXPORT_API
Packit f0b94e
** DESCRIPTION:
Packit f0b94e
**      These are only for externally visible routines and globals.  For
Packit f0b94e
**      internal routines, just use "extern" for type checking and that
Packit f0b94e
**      will not export internal cross-file or forward-declared symbols.
Packit f0b94e
**      Define a macro for declaring procedures return types. We use this to
Packit f0b94e
**      deal with windoze specific type hackery for DLL definitions. Use
Packit f0b94e
**      JS_EXTERN_API when the prototype for the method is declared. Use
Packit f0b94e
**      JS_EXPORT_API for the implementation of the method.
Packit f0b94e
**
Packit f0b94e
** Example:
Packit f0b94e
**   in dowhim.h
Packit f0b94e
**     JS_EXTERN_API( void ) DoWhatIMean( void );
Packit f0b94e
**   in dowhim.c
Packit f0b94e
**     JS_EXPORT_API( void ) DoWhatIMean( void ) { return; }
Packit f0b94e
**
Packit f0b94e
**
Packit f0b94e
***********************************************************************/
Packit f0b94e
Packit f0b94e
#define JS_EXTERN_API(type) extern MOZ_EXPORT type
Packit f0b94e
#define JS_EXPORT_API(type) MOZ_EXPORT type
Packit f0b94e
#define JS_EXPORT_DATA(type) MOZ_EXPORT type
Packit f0b94e
#define JS_IMPORT_API(type) MOZ_IMPORT_API type
Packit f0b94e
#define JS_IMPORT_DATA(type) MOZ_IMPORT_DATA type
Packit f0b94e
Packit f0b94e
/*
Packit f0b94e
 * The linkage of JS API functions differs depending on whether the file is
Packit f0b94e
 * used within the JS library or not. Any source file within the JS
Packit f0b94e
 * interpreter should define EXPORT_JS_API whereas any client of the library
Packit f0b94e
 * should not. STATIC_JS_API is used to build JS as a static library.
Packit f0b94e
 */
Packit f0b94e
#if defined(STATIC_JS_API)
Packit f0b94e
#define JS_PUBLIC_API
Packit f0b94e
#define JS_PUBLIC_DATA
Packit f0b94e
#define JS_FRIEND_API
Packit f0b94e
#define JS_FRIEND_DATA
Packit f0b94e
#elif defined(EXPORT_JS_API) || defined(STATIC_EXPORTABLE_JS_API)
Packit f0b94e
#define JS_PUBLIC_API MOZ_EXPORT
Packit f0b94e
#define JS_PUBLIC_DATA MOZ_EXPORT
Packit f0b94e
#define JS_FRIEND_API MOZ_EXPORT
Packit f0b94e
#define JS_FRIEND_DATA MOZ_EXPORT
Packit f0b94e
#else
Packit f0b94e
#define JS_PUBLIC_API MOZ_IMPORT_API
Packit f0b94e
#define JS_PUBLIC_DATA MOZ_IMPORT_DATA
Packit f0b94e
#define JS_FRIEND_API MOZ_IMPORT_API
Packit f0b94e
#define JS_FRIEND_DATA MOZ_IMPORT_DATA
Packit f0b94e
#endif
Packit f0b94e
Packit f0b94e
#if defined(_MSC_VER) && defined(_M_IX86)
Packit f0b94e
#define JS_FASTCALL __fastcall
Packit f0b94e
#elif defined(__GNUC__) && defined(__i386__)
Packit f0b94e
#define JS_FASTCALL __attribute__((fastcall))
Packit f0b94e
#else
Packit f0b94e
#define JS_FASTCALL
Packit f0b94e
#define JS_NO_FASTCALL
Packit f0b94e
#endif
Packit f0b94e
Packit f0b94e
// gcc is buggy and warns on our attempts to JS_PUBLIC_API our
Packit f0b94e
// forward-declarations or explicit template instantiations.  See
Packit f0b94e
// <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=50044>.  Add a way to detect
Packit f0b94e
// that so we can locally disable that warning.
Packit f0b94e
#if MOZ_IS_GCC
Packit f0b94e
#if MOZ_GCC_VERSION_AT_MOST(8, 0, 0)
Packit f0b94e
#define JS_BROKEN_GCC_ATTRIBUTE_WARNING
Packit f0b94e
#endif
Packit f0b94e
#endif
Packit f0b94e
Packit f0b94e
/***********************************************************************
Packit f0b94e
** MACROS:      JS_BEGIN_MACRO
Packit f0b94e
**              JS_END_MACRO
Packit f0b94e
** DESCRIPTION:
Packit f0b94e
**      Macro body brackets so that macros with compound statement definitions
Packit f0b94e
**      behave syntactically more like functions when called.
Packit f0b94e
***********************************************************************/
Packit f0b94e
#define JS_BEGIN_MACRO do {
Packit f0b94e
#if defined(_MSC_VER)
Packit f0b94e
#define JS_END_MACRO                                                  \
Packit f0b94e
  }                                                                   \
Packit f0b94e
  __pragma(warning(push)) __pragma(warning(disable : 4127)) while (0) \
Packit f0b94e
      __pragma(warning(pop))
Packit f0b94e
#else
Packit f0b94e
#define JS_END_MACRO \
Packit f0b94e
  }                  \
Packit f0b94e
  while (0)
Packit f0b94e
#endif
Packit f0b94e
Packit f0b94e
/***********************************************************************
Packit f0b94e
** MACROS:      JS_BIT
Packit f0b94e
**              JS_BITMASK
Packit f0b94e
** DESCRIPTION:
Packit f0b94e
** Bit masking macros.  XXX n must be <= 31 to be portable
Packit f0b94e
***********************************************************************/
Packit f0b94e
#define JS_BIT(n) ((uint32_t)1 << (n))
Packit f0b94e
#define JS_BITMASK(n) (JS_BIT(n) - 1)
Packit f0b94e
Packit f0b94e
/***********************************************************************
Packit f0b94e
** MACROS:      JS_HOWMANY
Packit f0b94e
**              JS_ROUNDUP
Packit f0b94e
** DESCRIPTION:
Packit f0b94e
**      Commonly used macros for operations on compatible types.
Packit f0b94e
***********************************************************************/
Packit f0b94e
#define JS_HOWMANY(x, y) (((x) + (y)-1) / (y))
Packit f0b94e
#define JS_ROUNDUP(x, y) (JS_HOWMANY(x, y) * (y))
Packit f0b94e
Packit f0b94e
#define JS_BITS_PER_BYTE 8
Packit f0b94e
#define JS_BITS_PER_BYTE_LOG2 3
Packit f0b94e
Packit 924777
#if (defined(__SIZEOF_POINTER__) && __SIZEOF_POINTER__ == 8) || \
Packit 924777
    (defined(UINTPTR_MAX) && UINTPTR_MAX == 0xFFFFFFFFFFFFFFFFu)
Packit f0b94e
#define JS_BITS_PER_WORD 64
Packit f0b94e
#else
Packit f0b94e
#define JS_BITS_PER_WORD 32
Packit f0b94e
#endif
Packit f0b94e
Packit 924777
static_assert(sizeof(void*) == 8 ? JS_BITS_PER_WORD == 64
Packit 924777
                                 : JS_BITS_PER_WORD == 32,
Packit 924777
              "preprocessor and compiler must agree");
Packit 924777
Packit f0b94e
/***********************************************************************
Packit f0b94e
** MACROS:      JS_FUNC_TO_DATA_PTR
Packit f0b94e
**              JS_DATA_TO_FUNC_PTR
Packit f0b94e
** DESCRIPTION:
Packit f0b94e
**      Macros to convert between function and data pointers of the same
Packit f0b94e
**      size. Use them like this:
Packit f0b94e
**
Packit f0b94e
**      JSGetterOp nativeGetter;
Packit f0b94e
**      JSObject* scriptedGetter;
Packit f0b94e
**      ...
Packit f0b94e
**      scriptedGetter = JS_FUNC_TO_DATA_PTR(JSObject*, nativeGetter);
Packit f0b94e
**      ...
Packit f0b94e
**      nativeGetter = JS_DATA_TO_FUNC_PTR(JSGetterOp, scriptedGetter);
Packit f0b94e
**
Packit f0b94e
***********************************************************************/
Packit f0b94e
Packit f0b94e
#define JS_FUNC_TO_DATA_PTR(type, fun) (mozilla::BitwiseCast<type>(fun))
Packit f0b94e
#define JS_DATA_TO_FUNC_PTR(type, ptr) (mozilla::BitwiseCast<type>(ptr))
Packit f0b94e
Packit f0b94e
#ifdef __GNUC__
Packit f0b94e
#define JS_EXTENSION __extension__
Packit f0b94e
#define JS_EXTENSION_(s) __extension__({ s; })
Packit f0b94e
#else
Packit f0b94e
#define JS_EXTENSION
Packit f0b94e
#define JS_EXTENSION_(s) s
Packit f0b94e
#endif
Packit f0b94e
Packit f0b94e
#endif /* jstypes_h */