1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- 2 * vim: set ts=8 sts=4 et sw=4 tw=99: 3 * This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef js_ProtoKey_h 8 #define js_ProtoKey_h 9 10 /* A higher-order macro for enumerating all JSProtoKey values. */ 11 /* 12 * Consumers define macros as follows: 13 * macro(name, init, clasp) 14 * name: The canonical name of the class. 15 * init: Initialization function. These are |extern "C";|, and clients 16 * should use |extern "C" {}| as appropriate when using this macro. 17 * clasp: The JSClass for this object, or "dummy" if it doesn't exist. 18 * 19 * 20 * Consumers wishing to iterate over all the JSProtoKey values, can use 21 * JS_FOR_EACH_PROTOTYPE. However, there are certain values that don't 22 * correspond to real constructors, like Null or constructors that are disabled 23 * via preprocessor directives. We still need to include these in the JSProtoKey 24 * list in order to maintain binary XDR compatibility, but we need to provide a 25 * tool to handle them differently. JS_FOR_PROTOTYPES fills this niche. 26 * 27 * Consumers pass two macros to JS_FOR_PROTOTYPES - |real| and |imaginary|. The 28 * former is invoked for entries that have real client-exposed constructors, and 29 * the latter is called for the rest. Consumers that don't care about this 30 * distinction can simply pass the same macro to both, which is exactly what 31 * JS_FOR_EACH_PROTOTYPE does. 32 */ 33 34 #define CLASP(NAME) (&NAME##Class) 35 #define OCLASP(NAME) (&NAME##Object::class_) 36 #define TYPED_ARRAY_CLASP(TYPE) (&TypedArrayObject::classes[Scalar::TYPE]) 37 #define ERROR_CLASP(TYPE) (&ErrorObject::classes[TYPE]) 38 39 #ifdef EXPOSE_INTL_API 40 #define IF_INTL(REAL, IMAGINARY) REAL 41 #else 42 #define IF_INTL(REAL, IMAGINARY) IMAGINARY 43 #endif 44 45 #ifdef ENABLE_BINARYDATA 46 #define IF_BDATA(real, imaginary) real 47 #else 48 #define IF_BDATA(real, imaginary) imaginary 49 #endif 50 51 #ifdef ENABLE_SIMD 52 #define IF_SIMD(real, imaginary) real 53 #else 54 #define IF_SIMD(real, imaginary) imaginary 55 #endif 56 57 #ifdef ENABLE_SHARED_ARRAY_BUFFER 58 #define IF_SAB(real, imaginary) real 59 #else 60 #define IF_SAB(real, imaginary) imaginary 61 #endif 62 63 #define JS_FOR_PROTOTYPES_(REAL, IMAGINARY, REAL_IF_INTL, REAL_IF_BDATA, \ 64 REAL_IF_SAB, REAL_IF_SIMD) \ 65 IMAGINARY(Null, InitNullClass, dummy) \ 66 REAL(Object, InitViaClassSpec, OCLASP(Plain)) \ 67 REAL(Function, InitViaClassSpec, &JSFunction::class_) \ 68 REAL(Array, InitViaClassSpec, OCLASP(Array)) \ 69 REAL(Boolean, InitBooleanClass, OCLASP(Boolean)) \ 70 REAL(JSON, InitJSONClass, CLASP(JSON)) \ 71 REAL(Date, InitViaClassSpec, OCLASP(Date)) \ 72 REAL(Math, InitMathClass, CLASP(Math)) \ 73 REAL(Number, InitNumberClass, OCLASP(Number)) \ 74 REAL(String, InitStringClass, OCLASP(String)) \ 75 REAL(RegExp, InitViaClassSpec, OCLASP(RegExp)) \ 76 REAL(Error, InitViaClassSpec, ERROR_CLASP(JSEXN_ERR)) \ 77 REAL(InternalError, InitViaClassSpec, ERROR_CLASP(JSEXN_INTERNALERR)) \ 78 REAL(EvalError, InitViaClassSpec, ERROR_CLASP(JSEXN_EVALERR)) \ 79 REAL(RangeError, InitViaClassSpec, ERROR_CLASP(JSEXN_RANGEERR)) \ 80 REAL(ReferenceError, InitViaClassSpec, ERROR_CLASP(JSEXN_REFERENCEERR)) \ 81 REAL(SyntaxError, InitViaClassSpec, ERROR_CLASP(JSEXN_SYNTAXERR)) \ 82 REAL(TypeError, InitViaClassSpec, ERROR_CLASP(JSEXN_TYPEERR)) \ 83 REAL(URIError, InitViaClassSpec, ERROR_CLASP(JSEXN_URIERR)) \ 84 REAL(DebuggeeWouldRun, InitViaClassSpec, \ 85 ERROR_CLASP(JSEXN_DEBUGGEEWOULDRUN)) \ 86 REAL(CompileError, InitViaClassSpec, ERROR_CLASP(JSEXN_WASMCOMPILEERROR)) \ 87 REAL(LinkError, InitViaClassSpec, ERROR_CLASP(JSEXN_WASMLINKERROR)) \ 88 REAL(RuntimeError, InitViaClassSpec, ERROR_CLASP(JSEXN_WASMRUNTIMEERROR)) \ 89 IMAGINARY(Iterator, dummy, dummy) \ 90 REAL(ArrayBuffer, InitViaClassSpec, OCLASP(ArrayBuffer)) \ 91 REAL(Int8Array, InitViaClassSpec, TYPED_ARRAY_CLASP(Int8)) \ 92 REAL(Uint8Array, InitViaClassSpec, TYPED_ARRAY_CLASP(Uint8)) \ 93 REAL(Int16Array, InitViaClassSpec, TYPED_ARRAY_CLASP(Int16)) \ 94 REAL(Uint16Array, InitViaClassSpec, TYPED_ARRAY_CLASP(Uint16)) \ 95 REAL(Int32Array, InitViaClassSpec, TYPED_ARRAY_CLASP(Int32)) \ 96 REAL(Uint32Array, InitViaClassSpec, TYPED_ARRAY_CLASP(Uint32)) \ 97 REAL(Float32Array, InitViaClassSpec, TYPED_ARRAY_CLASP(Float32)) \ 98 REAL(Float64Array, InitViaClassSpec, TYPED_ARRAY_CLASP(Float64)) \ 99 REAL(Uint8ClampedArray, InitViaClassSpec, TYPED_ARRAY_CLASP(Uint8Clamped)) \ 100 REAL(Proxy, InitProxyClass, js::ProxyClassPtr) \ 101 REAL(WeakMap, InitWeakMapClass, OCLASP(WeakMap)) \ 102 REAL(Map, InitViaClassSpec, OCLASP(Map)) \ 103 REAL(Set, InitViaClassSpec, OCLASP(Set)) \ 104 REAL(DataView, InitViaClassSpec, OCLASP(DataView)) \ 105 REAL(Symbol, InitSymbolClass, OCLASP(Symbol)) \ 106 REAL_IF_SAB(SharedArrayBuffer, InitViaClassSpec, OCLASP(SharedArrayBuffer)) \ 107 REAL_IF_INTL(Intl, InitIntlClass, CLASP(Intl)) \ 108 REAL_IF_BDATA(TypedObject, InitTypedObjectModuleObject, \ 109 OCLASP(TypedObjectModule)) \ 110 REAL(Reflect, InitReflect, nullptr) \ 111 REAL_IF_SIMD(SIMD, InitSimdClass, OCLASP(Simd)) \ 112 REAL(WeakSet, InitWeakSetClass, OCLASP(WeakSet)) \ 113 REAL(TypedArray, InitViaClassSpec, \ 114 &js::TypedArrayObject::sharedTypedArrayPrototypeClass) \ 115 REAL_IF_SAB(Atomics, InitAtomicsClass, OCLASP(Atomics)) \ 116 REAL(SavedFrame, InitViaClassSpec, &js::SavedFrame::class_) \ 117 REAL(Promise, InitViaClassSpec, OCLASP(Promise)) \ 118 REAL(ReadableStream, InitViaClassSpec, &js::ReadableStream::class_) \ 119 REAL(ReadableStreamDefaultReader, InitViaClassSpec, \ 120 &js::ReadableStreamDefaultReader::class_) \ 121 REAL(ReadableStreamBYOBReader, InitViaClassSpec, \ 122 &js::ReadableStreamBYOBReader::class_) \ 123 REAL(ReadableStreamDefaultController, InitViaClassSpec, \ 124 &js::ReadableStreamDefaultController::class_) \ 125 REAL(ReadableByteStreamController, InitViaClassSpec, \ 126 &js::ReadableByteStreamController::class_) \ 127 REAL(ReadableStreamBYOBRequest, InitViaClassSpec, \ 128 &js::ReadableStreamBYOBRequest::class_) \ 129 IMAGINARY(WritableStream, dummy, dummy) \ 130 IMAGINARY(WritableStreamDefaultWriter, dummy, dummy) \ 131 IMAGINARY(WritableStreamDefaultController, dummy, dummy) \ 132 REAL(ByteLengthQueuingStrategy, InitViaClassSpec, \ 133 &js::ByteLengthQueuingStrategy::class_) \ 134 REAL(CountQueuingStrategy, InitViaClassSpec, \ 135 &js::CountQueuingStrategy::class_) \ 136 REAL(WebAssembly, InitWebAssemblyClass, CLASP(WebAssembly)) \ 137 IMAGINARY(WasmModule, dummy, dummy) \ 138 IMAGINARY(WasmInstance, dummy, dummy) \ 139 IMAGINARY(WasmMemory, dummy, dummy) \ 140 IMAGINARY(WasmTable, dummy, dummy) \ 141 IMAGINARY(WasmGlobal, dummy, dummy) 142 143 #define JS_FOR_PROTOTYPES(REAL, IMAGINARY) \ 144 JS_FOR_PROTOTYPES_(REAL, IMAGINARY, IF_INTL(REAL, IMAGINARY), \ 145 IF_BDATA(REAL, IMAGINARY), IF_SAB(REAL, IMAGINARY), \ 146 IF_SIMD(REAL, IMAGINARY)) 147 148 #define JS_FOR_EACH_PROTOTYPE(MACRO) JS_FOR_PROTOTYPES(MACRO, MACRO) 149 150 #endif /* js_ProtoKey_h */ 151