1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2  * vim: set ts=8 sts=2 et sw=2 tw=80:
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 jspubtd_h
8 #define jspubtd_h
9 
10 /*
11  * JS public API typedefs.
12  */
13 
14 #include "jstypes.h"
15 
16 #include "js/ProtoKey.h"
17 #include "js/Result.h"
18 #include "js/TraceKind.h"
19 #include "js/TypeDecls.h"
20 
21 #if defined(JS_GC_ZEAL) || defined(DEBUG)
22 #  define JSGC_HASH_TABLE_CHECKS
23 #endif
24 
25 namespace JS {
26 
27 class CallArgs;
28 
29 class JS_PUBLIC_API RealmOptions;
30 
31 }  // namespace JS
32 
33 /* Result of typeof operator enumeration. */
34 enum JSType {
35   JSTYPE_UNDEFINED, /* undefined */
36   JSTYPE_OBJECT,    /* object */
37   JSTYPE_FUNCTION,  /* function */
38   JSTYPE_STRING,    /* string */
39   JSTYPE_NUMBER,    /* number */
40   JSTYPE_BOOLEAN,   /* boolean */
41   JSTYPE_SYMBOL,    /* symbol */
42   JSTYPE_BIGINT,    /* BigInt */
43 #ifdef ENABLE_RECORD_TUPLE
44   JSTYPE_RECORD, /* record */
45   JSTYPE_TUPLE,  /* tuple */
46 #endif
47   JSTYPE_LIMIT
48 };
49 
50 /* Dense index into cached prototypes and class atoms for standard objects. */
51 enum JSProtoKey {
52 #define PROTOKEY_AND_INITIALIZER(name, clasp) JSProto_##name,
53   JS_FOR_EACH_PROTOTYPE(PROTOKEY_AND_INITIALIZER)
54 #undef PROTOKEY_AND_INITIALIZER
55       JSProto_LIMIT
56 };
57 
58 /* Struct forward declarations. */
59 struct JSClass;
60 class JSErrorReport;
61 struct JSFunctionSpec;
62 struct JSPrincipals;
63 struct JSPropertySpec;
64 struct JSSecurityCallbacks;
65 struct JSStructuredCloneCallbacks;
66 struct JSStructuredCloneReader;
67 struct JSStructuredCloneWriter;
68 class JS_PUBLIC_API JSTracer;
69 
70 class JSLinearString;
71 
72 template <typename T>
73 struct JSConstScalarSpec;
74 using JSConstDoubleSpec = JSConstScalarSpec<double>;
75 using JSConstIntegerSpec = JSConstScalarSpec<int32_t>;
76 
77 namespace js {
78 
79 inline JS::Realm* GetContextRealm(const JSContext* cx);
80 inline JS::Compartment* GetContextCompartment(const JSContext* cx);
81 inline JS::Zone* GetContextZone(const JSContext* cx);
82 
83 // Whether the current thread is permitted access to any part of the specified
84 // runtime or zone.
85 JS_PUBLIC_API bool CurrentThreadCanAccessRuntime(const JSRuntime* rt);
86 
87 #ifdef DEBUG
88 JS_PUBLIC_API bool CurrentThreadIsPerformingGC();
89 #endif
90 
91 }  // namespace js
92 
93 namespace JS {
94 
95 class JS_PUBLIC_API PropertyDescriptor;
96 
97 // Decorates the Unlinking phase of CycleCollection so that accidental use
98 // of barriered accessors results in assertions instead of leaks.
99 class MOZ_STACK_CLASS JS_PUBLIC_API AutoEnterCycleCollection {
100 #ifdef DEBUG
101   JSRuntime* runtime_;
102 
103  public:
104   explicit AutoEnterCycleCollection(JSRuntime* rt);
105   ~AutoEnterCycleCollection();
106 #else
107  public:
108   explicit AutoEnterCycleCollection(JSRuntime* rt) {}
109   ~AutoEnterCycleCollection() {}
110 #endif
111 };
112 
113 } /* namespace JS */
114 
115 extern "C" {
116 
117 // Defined in NSPR prio.h.
118 using PRFileDesc = struct PRFileDesc;
119 }
120 
121 #endif /* jspubtd_h */
122