summaryrefslogtreecommitdiff
path: root/js/src/jsprototypes.h
blob: 34f835bc1d6ba5e4de8ca889e84bb5d0f48a401e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef jsprototypes_h
#define jsprototypes_h

/* A higher-order macro for enumerating all JSProtoKey values. */
/*
 * Consumers define macros as follows:
 * macro(name, init, clasp)
 *   name:    The canonical name of the class.
 *   init:    Initialization function. These are |extern "C";|, and clients should use
 *            |extern "C" {}| as appropriate when using this macro.
 *   clasp:   The JSClass for this object, or "dummy" if it doesn't exist.
 *
 *
 * Consumers wishing to iterate over all the JSProtoKey values, can use
 * JS_FOR_EACH_PROTOTYPE. However, there are certain values that don't correspond
 * to real constructors, like Null or constructors that are disabled via
 * preprocessor directives. We still need to include these in the JSProtoKey list
 * in order to maintain binary XDR compatibility, but we need to provide a tool
 * to handle them differently. JS_FOR_PROTOTYPES fills this niche.
 *
 * Consumers pass two macros to JS_FOR_PROTOTYPES - |real| and |imaginary|. The
 * former is invoked for entries that have real client-exposed constructors, and
 * the latter is called for the rest. Consumers that don't care about this
 * distinction can simply pass the same macro to both, which is exactly what
 * JS_FOR_EACH_PROTOTYPE does.
 */

#define CLASP(name)                 (&name##Class)
#define OCLASP(name)                (&name##Object::class_)
#define TYPED_ARRAY_CLASP(type)     (&TypedArrayObject::classes[Scalar::type])
#define ERROR_CLASP(type)           (&ErrorObject::classes[type])

#define IF_INTL(real,imaginary) real

#ifdef ENABLE_BINARYDATA
#define IF_BDATA(real,imaginary) real
#else
#define IF_BDATA(real,imaginary) imaginary
#endif

#ifdef ENABLE_SIMD
# define IF_SIMD(real,imaginary) real
#else
# define IF_SIMD(real,imaginary) imaginary
#endif

#ifdef ENABLE_SHARED_ARRAY_BUFFER
#define IF_SAB(real,imaginary) real
#else
#define IF_SAB(real,imaginary) imaginary
#endif

#define JS_FOR_PROTOTYPES(real,imaginary) \
    imaginary(Null,             InitNullClass,          dummy) \
    real(Object,                InitViaClassSpec,       OCLASP(Plain)) \
    real(Function,              InitViaClassSpec,       &JSFunction::class_) \
    real(Array,                 InitViaClassSpec,       OCLASP(Array)) \
    real(Boolean,               InitBooleanClass,       OCLASP(Boolean)) \
    real(JSON,                  InitJSONClass,          CLASP(JSON)) \
    real(Date,                  InitViaClassSpec,       OCLASP(Date)) \
    real(Math,                  InitMathClass,          CLASP(Math)) \
    real(Number,                InitNumberClass,        OCLASP(Number)) \
    real(String,                InitStringClass,        OCLASP(String)) \
    real(RegExp,                InitViaClassSpec,       OCLASP(RegExp)) \
    real(Error,                 InitViaClassSpec,       ERROR_CLASP(JSEXN_ERR)) \
    real(InternalError,         InitViaClassSpec,       ERROR_CLASP(JSEXN_INTERNALERR)) \
    real(AggregateError,        InitViaClassSpec,       ERROR_CLASP(JSEXN_AGGREGATEERR)) \
    real(EvalError,             InitViaClassSpec,       ERROR_CLASP(JSEXN_EVALERR)) \
    real(RangeError,            InitViaClassSpec,       ERROR_CLASP(JSEXN_RANGEERR)) \
    real(ReferenceError,        InitViaClassSpec,       ERROR_CLASP(JSEXN_REFERENCEERR)) \
    real(SyntaxError,           InitViaClassSpec,       ERROR_CLASP(JSEXN_SYNTAXERR)) \
    real(TypeError,             InitViaClassSpec,       ERROR_CLASP(JSEXN_TYPEERR)) \
    real(URIError,              InitViaClassSpec,       ERROR_CLASP(JSEXN_URIERR)) \
    real(DebuggeeWouldRun,      InitViaClassSpec,       ERROR_CLASP(JSEXN_DEBUGGEEWOULDRUN)) \
    real(CompileError,          InitViaClassSpec,       ERROR_CLASP(JSEXN_WASMCOMPILEERROR)) \
    real(RuntimeError,          InitViaClassSpec,       ERROR_CLASP(JSEXN_WASMRUNTIMEERROR)) \
    real(Iterator,              InitLegacyIteratorClass,OCLASP(PropertyIterator)) \
    real(StopIteration,         InitStopIterationClass, OCLASP(StopIteration)) \
    real(ArrayBuffer,           InitViaClassSpec,       OCLASP(ArrayBuffer)) \
    real(Int8Array,             InitViaClassSpec,       TYPED_ARRAY_CLASP(Int8)) \
    real(Uint8Array,            InitViaClassSpec,       TYPED_ARRAY_CLASP(Uint8)) \
    real(Int16Array,            InitViaClassSpec,       TYPED_ARRAY_CLASP(Int16)) \
    real(Uint16Array,           InitViaClassSpec,       TYPED_ARRAY_CLASP(Uint16)) \
    real(Int32Array,            InitViaClassSpec,       TYPED_ARRAY_CLASP(Int32)) \
    real(Uint32Array,           InitViaClassSpec,       TYPED_ARRAY_CLASP(Uint32)) \
    real(Float32Array,          InitViaClassSpec,       TYPED_ARRAY_CLASP(Float32)) \
    real(Float64Array,          InitViaClassSpec,       TYPED_ARRAY_CLASP(Float64)) \
    real(Uint8ClampedArray,     InitViaClassSpec,       TYPED_ARRAY_CLASP(Uint8Clamped)) \
    real(BigInt64Array,         InitViaClassSpec,       TYPED_ARRAY_CLASP(BigInt64))         \
    real(BigUint64Array,        InitViaClassSpec,       TYPED_ARRAY_CLASP(BigUint64))       \
    real(BigInt,                InitViaClassSpec,       OCLASP(BigInt)) \
    real(Proxy,                 InitProxyClass,         js::ProxyClassPtr) \
    real(WeakMap,               InitWeakMapClass,       OCLASP(WeakMap)) \
    real(Map,                   InitMapClass,           OCLASP(Map)) \
    real(Set,                   InitSetClass,           OCLASP(Set)) \
    real(DataView,              InitDataViewClass,      OCLASP(DataView)) \
    real(Symbol,                InitSymbolClass,        OCLASP(Symbol)) \
IF_SAB(real,imaginary)(SharedArrayBuffer,     InitViaClassSpec, OCLASP(SharedArrayBuffer)) \
IF_INTL(real,imaginary) (Intl,                InitIntlClass,          CLASP(Intl)) \
IF_BDATA(real,imaginary)(TypedObject,         InitTypedObjectModuleObject,   OCLASP(TypedObjectModule)) \
    real(Reflect,               InitReflect,            nullptr) \
IF_SIMD(real,imaginary)(SIMD,   InitSimdClass, OCLASP(Simd)) \
    real(WeakSet,               InitWeakSetClass,       OCLASP(WeakSet)) \
    real(TypedArray,            InitViaClassSpec,       &js::TypedArrayObject::sharedTypedArrayPrototypeClass) \
IF_SAB(real,imaginary)(Atomics, InitAtomicsClass, OCLASP(Atomics)) \
    real(SavedFrame,            InitViaClassSpec,       &js::SavedFrame::class_) \
    real(WebAssembly,           InitWebAssemblyClass,   CLASP(WebAssembly)) \
    imaginary(WasmModule,       dummy,                  dummy) \
    imaginary(WasmInstance,     dummy,                  dummy) \
    imaginary(WasmMemory,       dummy,                  dummy) \
    imaginary(WasmTable,        dummy,                  dummy) \
    real(Promise,               InitViaClassSpec,       OCLASP(Promise)) \

#define JS_FOR_EACH_PROTOTYPE(macro) JS_FOR_PROTOTYPES(macro,macro)

#endif /* jsprototypes_h */