#ifndef jsapi_h
#define jsapi_h
#include "mozilla/AlreadyAddRefed.h"
#include "mozilla/FloatingPoint.h"
#include "mozilla/MemoryReporting.h"
#include "mozilla/Range.h"
#include "mozilla/RangedPtr.h"
#include "mozilla/RefPtr.h"
#include "mozilla/Utf8.h"
#include "mozilla/Variant.h"
#include <stdarg.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include "jspubtd.h"
#include "js/AllocPolicy.h"
#include "js/CallArgs.h"
#include "js/CharacterEncoding.h"
#include "js/Class.h"
#include "js/CompileOptions.h"
#include "js/ErrorReport.h"
#include "js/GCVector.h"
#include "js/HashTable.h"
#include "js/Id.h"
#include "js/OffThreadScriptCompilation.h"
#include "js/Principals.h"
#include "js/PropertyDescriptor.h"
#include "js/Realm.h"
#include "js/RefCounted.h"
#include "js/RootingAPI.h"
#include "js/TracingAPI.h"
#include "js/Transcoding.h"
#include "js/UniquePtr.h"
#include "js/Utility.h"
#include "js/Value.h"
#include "js/Vector.h"
struct JSFreeOp;
struct JSFunctionSpec;
struct JSPropertySpec;
namespace JS {
template <typename UnitT>
class SourceText;
class TwoByteChars;
template <size_t N>
class MOZ_RAII AutoValueArray : public AutoGCRooter {
const size_t length_;
Value elements_[N];
public:
explicit AutoValueArray(JSContext* cx MOZ_GUARD_OBJECT_NOTIFIER_PARAM)
: AutoGCRooter(cx, AutoGCRooter::Tag::ValueArray), length_(N) {
mozilla::PodArrayZero(elements_);
MOZ_GUARD_OBJECT_NOTIFIER_INIT;
}
unsigned length() const { return length_; }
const Value* begin() const { return elements_; }
Value* begin() { return elements_; }
HandleValue operator[](unsigned i) const {
MOZ_ASSERT(i < N);
return HandleValue::fromMarkedLocation(&elements_[i]);
}
MutableHandleValue operator[](unsigned i) {
MOZ_ASSERT(i < N);
return MutableHandleValue::fromMarkedLocation(&elements_[i]);
}
MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
};
using ValueVector = JS::GCVector<JS::Value>;
using IdVector = JS::GCVector<jsid>;
using ScriptVector = JS::GCVector<JSScript*>;
using StringVector = JS::GCVector<JSString*>;
class MOZ_RAII JS_PUBLIC_API CustomAutoRooter : private AutoGCRooter {
public:
template <typename CX>
explicit CustomAutoRooter(const CX& cx MOZ_GUARD_OBJECT_NOTIFIER_PARAM)
: AutoGCRooter(cx, AutoGCRooter::Tag::Custom) {
MOZ_GUARD_OBJECT_NOTIFIER_INIT;
}
friend void AutoGCRooter::trace(JSTracer* trc);
protected:
virtual ~CustomAutoRooter() {}
virtual void trace(JSTracer* trc) = 0;
private:
MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
};
class HandleValueArray {
const size_t length_;
const Value* const elements_;
HandleValueArray(size_t len, const Value* elements)
: length_(len), elements_(elements) {}
public:
explicit HandleValueArray(HandleValue value)
: length_(1), elements_(value.address()) {}
MOZ_IMPLICIT HandleValueArray(const AutoValueVector& values)
: length_(values.length()), elements_(values.begin()) {}
template <size_t N>
MOZ_IMPLICIT HandleValueArray(const AutoValueArray<N>& values)
: length_(N), elements_(values.begin()) {}
MOZ_IMPLICIT HandleValueArray(const JS::CallArgs& args)
: length_(args.length()), elements_(args.array()) {}
static HandleValueArray fromMarkedLocation(size_t len,
const Value* elements) {
return HandleValueArray(len, elements);
}
static HandleValueArray subarray(const HandleValueArray& values,
size_t startIndex, size_t len) {
MOZ_ASSERT(startIndex + len <= values.length());
return HandleValueArray(len, values.begin() + startIndex);
}
static HandleValueArray empty() { return HandleValueArray(0, nullptr); }
size_t length() const { return length_; }
const Value* begin() const { return elements_; }
HandleValue operator[](size_t i) const {
MOZ_ASSERT(i < length_);
return HandleValue::fromMarkedLocation(&elements_[i]);
}
};
}
typedef bool (*JSInterruptCallback)(JSContext* cx);
typedef JSObject* (*JSWrapObjectCallback)(JSContext* cx,
JS::HandleObject existing,
JS::HandleObject obj);
typedef void (*JSPreWrapCallback)(JSContext* cx, JS::HandleObject scope,
JS::HandleObject obj,
JS::HandleObject objectPassedToWrap,
JS::MutableHandleObject retObj);
struct JSWrapObjectCallbacks {
JSWrapObjectCallback wrap;
JSPreWrapCallback preWrap;
};
typedef void (*JSDestroyCompartmentCallback)(JSFreeOp* fop,
JS::Compartment* compartment);
typedef size_t (*JSSizeOfIncludingThisCompartmentCallback)(
mozilla::MallocSizeOf mallocSizeOf, JS::Compartment* compartment);
using JSExternalStringSizeofCallback =
size_t (*)(JSString* str, mozilla::MallocSizeOf mallocSizeOf);
struct JSErrorInterceptor {
virtual void interceptError(JSContext* cx, JS::HandleValue error) = 0;
};
static MOZ_ALWAYS_INLINE JS::Value JS_NumberValue(double d) {
int32_t i;
d = JS::CanonicalizeNaN(d);
if (mozilla::NumberIsInt32(d, &i)) {
return JS::Int32Value(i);
}
return JS::DoubleValue(d);
}
JS_PUBLIC_API bool JS_StringHasBeenPinned(JSContext* cx, JSString* str);
extern JS_PUBLIC_API int64_t JS_Now(void);
extern JS_PUBLIC_API JS::Value JS_GetNaNValue(JSContext* cx);
extern JS_PUBLIC_API JS::Value JS_GetNegativeInfinityValue(JSContext* cx);
extern JS_PUBLIC_API JS::Value JS_GetPositiveInfinityValue(JSContext* cx);
extern JS_PUBLIC_API JS::Value JS_GetEmptyStringValue(JSContext* cx);
extern JS_PUBLIC_API JSString* JS_GetEmptyString(JSContext* cx);
extern JS_PUBLIC_API bool JS_ValueToObject(JSContext* cx, JS::HandleValue v,
JS::MutableHandleObject objp);
extern JS_PUBLIC_API JSFunction* JS_ValueToFunction(JSContext* cx,
JS::HandleValue v);
extern JS_PUBLIC_API JSFunction* JS_ValueToConstructor(JSContext* cx,
JS::HandleValue v);
extern JS_PUBLIC_API JSString* JS_ValueToSource(JSContext* cx,
JS::Handle<JS::Value> v);
extern JS_PUBLIC_API bool JS_DoubleIsInt32(double d, int32_t* ip);
extern JS_PUBLIC_API JSType JS_TypeOfValue(JSContext* cx,
JS::Handle<JS::Value> v);
namespace JS {
extern JS_PUBLIC_API const char* InformalValueTypeName(const JS::Value& v);
}
extern JS_PUBLIC_API bool JS_IsBuiltinEvalFunction(JSFunction* fun);
extern JS_PUBLIC_API bool JS_IsBuiltinFunctionConstructor(JSFunction* fun);
extern JS_PUBLIC_API JSContext* JS_NewContext(
uint32_t maxbytes, uint32_t maxNurseryBytes = JS::DefaultNurseryBytes,
JSRuntime* parentRuntime = nullptr);
extern JS_PUBLIC_API void JS_YieldCooperativeContext(JSContext* cx);
extern JS_PUBLIC_API void JS_ResumeCooperativeContext(JSContext* cx);
extern JS_PUBLIC_API JSContext* JS_NewCooperativeContext(
JSContext* siblingContext);
extern JS_PUBLIC_API void JS_DestroyContext(JSContext* cx);
JS_PUBLIC_API void* JS_GetContextPrivate(JSContext* cx);
JS_PUBLIC_API void JS_SetContextPrivate(JSContext* cx, void* data);
extern JS_PUBLIC_API JSRuntime* JS_GetParentRuntime(JSContext* cx);
extern JS_PUBLIC_API JSRuntime* JS_GetRuntime(JSContext* cx);
extern JS_PUBLIC_API void JS_SetFutexCanWait(JSContext* cx);
namespace js {
void AssertHeapIsIdle();
}
namespace JS {
JS_PUBLIC_API bool InitSelfHostedCode(JSContext* cx);
JS_PUBLIC_API void AssertObjectBelongsToCurrentThread(JSObject* obj);
}
extern JS_PUBLIC_API const char* JS_GetImplementationVersion(void);
extern JS_PUBLIC_API void JS_SetDestroyCompartmentCallback(
JSContext* cx, JSDestroyCompartmentCallback callback);
extern JS_PUBLIC_API void JS_SetSizeOfIncludingThisCompartmentCallback(
JSContext* cx, JSSizeOfIncludingThisCompartmentCallback callback);
extern JS_PUBLIC_API void JS_SetWrapObjectCallbacks(
JSContext* cx, const JSWrapObjectCallbacks* callbacks);
extern JS_PUBLIC_API void JS_SetExternalStringSizeofCallback(
JSContext* cx, JSExternalStringSizeofCallback callback);
#if defined(NIGHTLY_BUILD)
extern JS_PUBLIC_API void JS_SetErrorInterceptorCallback(
JSRuntime*, JSErrorInterceptor* callback);
extern JS_PUBLIC_API JSErrorInterceptor* JS_GetErrorInterceptorCallback(
JSRuntime*);
extern JS_PUBLIC_API mozilla::Maybe<JSExnType> JS_GetErrorType(
const JS::Value& val);
#endif
extern JS_PUBLIC_API void JS_SetCompartmentPrivate(JS::Compartment* compartment,
void* data);
extern JS_PUBLIC_API void* JS_GetCompartmentPrivate(
JS::Compartment* compartment);
extern JS_PUBLIC_API void JS_SetZoneUserData(JS::Zone* zone, void* data);
extern JS_PUBLIC_API void* JS_GetZoneUserData(JS::Zone* zone);
extern JS_PUBLIC_API bool JS_WrapObject(JSContext* cx,
JS::MutableHandleObject objp);
extern JS_PUBLIC_API bool JS_WrapValue(JSContext* cx,
JS::MutableHandleValue vp);
extern JS_PUBLIC_API JSObject* JS_TransplantObject(JSContext* cx,
JS::HandleObject origobj,
JS::HandleObject target);
extern JS_PUBLIC_API bool JS_RefreshCrossCompartmentWrappers(
JSContext* cx, JS::Handle<JSObject*> obj);
class MOZ_RAII JS_PUBLIC_API JSAutoRealm {
JSContext* cx_;
JS::Realm* oldRealm_;
public:
JSAutoRealm(JSContext* cx, JSObject* target MOZ_GUARD_OBJECT_NOTIFIER_PARAM);
JSAutoRealm(JSContext* cx, JSScript* target MOZ_GUARD_OBJECT_NOTIFIER_PARAM);
~JSAutoRealm();
MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
};
class MOZ_RAII JS_PUBLIC_API JSAutoNullableRealm {
JSContext* cx_;
JS::Realm* oldRealm_;
public:
explicit JSAutoNullableRealm(
JSContext* cx, JSObject* targetOrNull MOZ_GUARD_OBJECT_NOTIFIER_PARAM);
~JSAutoNullableRealm();
MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
};
namespace JS {
extern JS_PUBLIC_API JS::Realm* EnterRealm(JSContext* cx, JSObject* target);
extern JS_PUBLIC_API void LeaveRealm(JSContext* cx, JS::Realm* oldRealm);
using IterateRealmCallback = void (*)(JSContext* cx, void* data,
Handle<Realm*> realm);
extern JS_PUBLIC_API void IterateRealms(JSContext* cx, void* data,
IterateRealmCallback realmCallback);
extern JS_PUBLIC_API void IterateRealmsWithPrincipals(
JSContext* cx, JSPrincipals* principals, void* data,
IterateRealmCallback realmCallback);
extern JS_PUBLIC_API void IterateRealmsInCompartment(
JSContext* cx, JS::Compartment* compartment, void* data,
IterateRealmCallback realmCallback);
}
namespace JS {
enum class CompartmentIterResult { KeepGoing, Stop };
}
typedef JS::CompartmentIterResult (*JSIterateCompartmentCallback)(
JSContext* cx, void* data, JS::Compartment* compartment);
extern JS_PUBLIC_API void JS_IterateCompartments(
JSContext* cx, void* data,
JSIterateCompartmentCallback compartmentCallback);
extern JS_PUBLIC_API void JS_IterateCompartmentsInZone(
JSContext* cx, JS::Zone* zone, void* data,
JSIterateCompartmentCallback compartmentCallback);
extern JS_PUBLIC_API void JS_MarkCrossZoneId(JSContext* cx, jsid id);
extern JS_PUBLIC_API void JS_MarkCrossZoneIdValue(JSContext* cx,
const JS::Value& value);
extern JS_PUBLIC_API bool JS_ResolveStandardClass(JSContext* cx,
JS::HandleObject obj,
JS::HandleId id,
bool* resolved);
extern JS_PUBLIC_API bool JS_MayResolveStandardClass(const JSAtomState& names,
jsid id,
JSObject* maybeObj);
extern JS_PUBLIC_API bool JS_EnumerateStandardClasses(JSContext* cx,
JS::HandleObject obj);
extern JS_PUBLIC_API bool JS_NewEnumerateStandardClasses(
JSContext* cx, JS::HandleObject obj, JS::AutoIdVector& properties,
bool enumerableOnly);
extern JS_PUBLIC_API bool JS_NewEnumerateStandardClassesIncludingResolved(
JSContext* cx, JS::HandleObject obj, JS::AutoIdVector& properties,
bool enumerableOnly);
extern JS_PUBLIC_API bool JS_GetClassObject(JSContext* cx, JSProtoKey key,
JS::MutableHandle<JSObject*> objp);
extern JS_PUBLIC_API bool JS_GetClassPrototype(
JSContext* cx, JSProtoKey key, JS::MutableHandle<JSObject*> objp);
namespace JS {
extern JS_PUBLIC_API JSProtoKey IdentifyStandardInstance(JSObject* obj);
extern JS_PUBLIC_API JSProtoKey IdentifyStandardPrototype(JSObject* obj);
extern JS_PUBLIC_API JSProtoKey
IdentifyStandardInstanceOrPrototype(JSObject* obj);
extern JS_PUBLIC_API JSProtoKey IdentifyStandardConstructor(JSObject* obj);
extern JS_PUBLIC_API void ProtoKeyToId(JSContext* cx, JSProtoKey key,
JS::MutableHandleId idp);
}
extern JS_PUBLIC_API JSProtoKey JS_IdToProtoKey(JSContext* cx, JS::HandleId id);
extern JS_PUBLIC_API bool JS_IsGlobalObject(JSObject* obj);
extern JS_PUBLIC_API JSObject* JS_GlobalLexicalEnvironment(JSObject* obj);
extern JS_PUBLIC_API bool JS_HasExtensibleLexicalEnvironment(JSObject* obj);
extern JS_PUBLIC_API JSObject* JS_ExtensibleLexicalEnvironment(JSObject* obj);
namespace JS {
extern JS_PUBLIC_API JSObject* CurrentGlobalOrNull(JSContext* cx);
extern JS_PUBLIC_API JSObject* GetNonCCWObjectGlobal(JSObject* obj);
}
extern JS_PUBLIC_API bool JS_InitReflectParse(JSContext* cx,
JS::HandleObject global);
extern JS_PUBLIC_API bool JS_DefineProfilingFunctions(JSContext* cx,
JS::HandleObject obj);
extern JS_PUBLIC_API bool JS_DefineDebuggerObject(JSContext* cx,
JS::HandleObject obj);
namespace JS {
extern JS_PUBLIC_API void SetProfileTimelineRecordingEnabled(bool enabled);
extern JS_PUBLIC_API bool IsProfileTimelineRecordingEnabled();
}
#ifdef JS_HAS_CTYPES
extern JS_PUBLIC_API bool JS_InitCTypesClass(JSContext* cx,
JS::HandleObject global);
typedef char* (*JSCTypesUnicodeToNativeFun)(JSContext* cx,
const char16_t* source,
size_t slen);
struct JSCTypesCallbacks {
JSCTypesUnicodeToNativeFun unicodeToNative;
};
extern JS_PUBLIC_API void JS_SetCTypesCallbacks(
JSObject* ctypesObj, const JSCTypesCallbacks* callbacks);
#endif
class JS_PUBLIC_API JSMallocAllocPolicy : public js::AllocPolicyBase {
public:
void reportAllocOverflow() const {}
MOZ_MUST_USE bool checkSimulatedOOM() const { return true; }
};
extern JS_PUBLIC_API void JS_SetNativeStackQuota(
JSContext* cx, size_t systemCodeStackSize,
size_t trustedScriptStackSize = 0, size_t untrustedScriptStackSize = 0);
extern JS_PUBLIC_API bool JS_ValueToId(JSContext* cx, JS::HandleValue v,
JS::MutableHandleId idp);
extern JS_PUBLIC_API bool JS_StringToId(JSContext* cx, JS::HandleString s,
JS::MutableHandleId idp);
extern JS_PUBLIC_API bool JS_IdToValue(JSContext* cx, jsid id,
JS::MutableHandle<JS::Value> vp);
namespace JS {
extern JS_PUBLIC_API bool ToPrimitive(JSContext* cx, JS::HandleObject obj,
JSType hint, JS::MutableHandleValue vp);
extern JS_PUBLIC_API bool GetFirstArgumentAsTypeHint(JSContext* cx,
CallArgs args,
JSType* result);
}
template <typename T>
struct JSConstScalarSpec {
const char* name;
T val;
};
using JSConstDoubleSpec = JSConstScalarSpec<double>;
using JSConstIntegerSpec = JSConstScalarSpec<int32_t>;
extern JS_PUBLIC_API JSObject* JS_InitClass(
JSContext* cx, JS::HandleObject obj, JS::HandleObject parent_proto,
const JSClass* clasp, JSNative constructor, unsigned nargs,
const JSPropertySpec* ps, const JSFunctionSpec* fs,
const JSPropertySpec* static_ps, const JSFunctionSpec* static_fs);
extern JS_PUBLIC_API bool JS_LinkConstructorAndPrototype(
JSContext* cx, JS::Handle<JSObject*> ctor, JS::Handle<JSObject*> proto);
extern JS_PUBLIC_API const JSClass* JS_GetClass(JSObject* obj);
extern JS_PUBLIC_API bool JS_InstanceOf(JSContext* cx,
JS::Handle<JSObject*> obj,
const JSClass* clasp,
JS::CallArgs* args);
extern JS_PUBLIC_API bool JS_HasInstance(JSContext* cx,
JS::Handle<JSObject*> obj,
JS::Handle<JS::Value> v, bool* bp);
namespace JS {
extern JS_PUBLIC_API bool OrdinaryHasInstance(JSContext* cx,
HandleObject objArg,
HandleValue v, bool* bp);
extern JS_PUBLIC_API bool InstanceofOperator(JSContext* cx, HandleObject obj,
HandleValue v, bool* bp);
}
extern JS_PUBLIC_API void* JS_GetPrivate(JSObject* obj);
extern JS_PUBLIC_API void JS_SetPrivate(JSObject* obj, void* data);
extern JS_PUBLIC_API void* JS_GetInstancePrivate(JSContext* cx,
JS::Handle<JSObject*> obj,
const JSClass* clasp,
JS::CallArgs* args);
extern JS_PUBLIC_API JSObject* JS_GetConstructor(JSContext* cx,
JS::Handle<JSObject*> proto);
namespace JS {
enum class CompartmentSpecifier {
NewCompartmentInSystemZone,
NewCompartmentInExistingZone,
NewCompartmentAndZone,
ExistingCompartment,
};
class JS_PUBLIC_API RealmCreationOptions {
public:
RealmCreationOptions()
: traceGlobal_(nullptr),
compSpec_(CompartmentSpecifier::NewCompartmentAndZone),
comp_(nullptr),
invisibleToDebugger_(false),
mergeable_(false),
preserveJitCode_(false),
cloneSingletons_(false),
sharedMemoryAndAtomics_(false),
streams_(false),
bigint_(false),
fields_(false),
secureContext_(false),
clampAndJitterTime_(true) {}
JSTraceOp getTrace() const { return traceGlobal_; }
RealmCreationOptions& setTrace(JSTraceOp op) {
traceGlobal_ = op;
return *this;
}
JS::Zone* zone() const {
MOZ_ASSERT(compSpec_ == CompartmentSpecifier::NewCompartmentInExistingZone);
return zone_;
}
JS::Compartment* compartment() const {
MOZ_ASSERT(compSpec_ == CompartmentSpecifier::ExistingCompartment);
return comp_;
}
CompartmentSpecifier compartmentSpecifier() const { return compSpec_; }
RealmCreationOptions& setNewCompartmentInSystemZone();
RealmCreationOptions& setNewCompartmentInExistingZone(JSObject* obj);
RealmCreationOptions& setNewCompartmentAndZone();
RealmCreationOptions& setExistingCompartment(JSObject* obj);
RealmCreationOptions& setExistingCompartment(JS::Compartment* compartment);
bool invisibleToDebugger() const { return invisibleToDebugger_; }
RealmCreationOptions& setInvisibleToDebugger(bool flag) {
invisibleToDebugger_ = flag;
return *this;
}
bool mergeable() const { return mergeable_; }
RealmCreationOptions& setMergeable(bool flag) {
mergeable_ = flag;
return *this;
}
bool preserveJitCode() const { return preserveJitCode_; }
RealmCreationOptions& setPreserveJitCode(bool flag) {
preserveJitCode_ = flag;
return *this;
}
bool cloneSingletons() const { return cloneSingletons_; }
RealmCreationOptions& setCloneSingletons(bool flag) {
cloneSingletons_ = flag;
return *this;
}
bool getSharedMemoryAndAtomicsEnabled() const;
RealmCreationOptions& setSharedMemoryAndAtomicsEnabled(bool flag);
bool getStreamsEnabled() const { return streams_; }
RealmCreationOptions& setStreamsEnabled(bool flag) {
streams_ = flag;
return *this;
}
bool getBigIntEnabled() const { return bigint_; }
RealmCreationOptions& setBigIntEnabled(bool flag) {
bigint_ = flag;
return *this;
}
bool getFieldsEnabled() const { return fields_; }
RealmCreationOptions& setFieldsEnabled(bool flag) {
fields_ = flag;
return *this;
}
bool secureContext() const { return secureContext_; }
RealmCreationOptions& setSecureContext(bool flag) {
secureContext_ = flag;
return *this;
}
bool clampAndJitterTime() const { return clampAndJitterTime_; }
RealmCreationOptions& setClampAndJitterTime(bool flag) {
clampAndJitterTime_ = flag;
return *this;
}
private:
JSTraceOp traceGlobal_;
CompartmentSpecifier compSpec_;
union {
JS::Compartment* comp_;
JS::Zone* zone_;
};
bool invisibleToDebugger_;
bool mergeable_;
bool preserveJitCode_;
bool cloneSingletons_;
bool sharedMemoryAndAtomics_;
bool streams_;
bool bigint_;
bool fields_;
bool secureContext_;
bool clampAndJitterTime_;
};
class JS_PUBLIC_API RealmBehaviors {
public:
class Override {
public:
Override() : mode_(Default) {}
bool get(bool defaultValue) const {
if (mode_ == Default) {
return defaultValue;
}
return mode_ == ForceTrue;
}
void set(bool overrideValue) {
mode_ = overrideValue ? ForceTrue : ForceFalse;
}
void reset() { mode_ = Default; }
private:
enum Mode { Default, ForceTrue, ForceFalse };
Mode mode_;
};
RealmBehaviors()
: discardSource_(false),
disableLazyParsing_(false),
singletonsAsTemplates_(true) {}
bool discardSource() const { return discardSource_; }
RealmBehaviors& setDiscardSource(bool flag) {
discardSource_ = flag;
return *this;
}
bool disableLazyParsing() const { return disableLazyParsing_; }
RealmBehaviors& setDisableLazyParsing(bool flag) {
disableLazyParsing_ = flag;
return *this;
}
bool extraWarnings(JSContext* cx) const;
Override& extraWarningsOverride() { return extraWarningsOverride_; }
bool getSingletonsAsTemplates() const { return singletonsAsTemplates_; }
RealmBehaviors& setSingletonsAsValues() {
singletonsAsTemplates_ = false;
return *this;
}
private:
bool discardSource_;
bool disableLazyParsing_;
Override extraWarningsOverride_;
bool singletonsAsTemplates_;
};
class JS_PUBLIC_API RealmOptions {
public:
explicit RealmOptions() : creationOptions_(), behaviors_() {}
RealmOptions(const RealmCreationOptions& realmCreation,
const RealmBehaviors& realmBehaviors)
: creationOptions_(realmCreation), behaviors_(realmBehaviors) {}
RealmCreationOptions& creationOptions() { return creationOptions_; }
const RealmCreationOptions& creationOptions() const {
return creationOptions_;
}
RealmBehaviors& behaviors() { return behaviors_; }
const RealmBehaviors& behaviors() const { return behaviors_; }
private:
RealmCreationOptions creationOptions_;
RealmBehaviors behaviors_;
};
JS_PUBLIC_API const RealmCreationOptions& RealmCreationOptionsRef(
JS::Realm* realm);
JS_PUBLIC_API const RealmCreationOptions& RealmCreationOptionsRef(
JSContext* cx);
JS_PUBLIC_API RealmBehaviors& RealmBehaviorsRef(JS::Realm* realm);
JS_PUBLIC_API RealmBehaviors& RealmBehaviorsRef(JSContext* cx);
enum OnNewGlobalHookOption { FireOnNewGlobalHook, DontFireOnNewGlobalHook };
}
extern JS_PUBLIC_API JSObject* JS_NewGlobalObject(
JSContext* cx, const JSClass* clasp, JSPrincipals* principals,
JS::OnNewGlobalHookOption hookOption, const JS::RealmOptions& options);
extern JS_PUBLIC_API void JS_GlobalObjectTraceHook(JSTracer* trc,
JSObject* global);
namespace JS {
extern JS_PUBLIC_DATA const JSClassOps DefaultGlobalClassOps;
}
extern JS_PUBLIC_API void JS_FireOnNewGlobalObject(JSContext* cx,
JS::HandleObject global);
extern JS_PUBLIC_API JSObject* JS_NewObject(JSContext* cx,
const JSClass* clasp);
extern JS_PUBLIC_API bool JS_IsNative(JSObject* obj);
extern JS_PUBLIC_API JSObject* JS_NewObjectWithGivenProto(
JSContext* cx, const JSClass* clasp, JS::Handle<JSObject*> proto);
extern JS_PUBLIC_API JSObject* JS_NewPlainObject(JSContext* cx);
extern JS_PUBLIC_API bool JS_DeepFreezeObject(JSContext* cx,
JS::Handle<JSObject*> obj);
extern JS_PUBLIC_API bool JS_FreezeObject(JSContext* cx,
JS::Handle<JSObject*> obj);
extern JS_PUBLIC_API bool JS_GetPrototype(JSContext* cx, JS::HandleObject obj,
JS::MutableHandleObject result);
extern JS_PUBLIC_API bool JS_GetPrototypeIfOrdinary(
JSContext* cx, JS::HandleObject obj, bool* isOrdinary,
JS::MutableHandleObject result);
extern JS_PUBLIC_API bool JS_SetPrototype(JSContext* cx, JS::HandleObject obj,
JS::HandleObject proto);
extern JS_PUBLIC_API bool JS_IsExtensible(JSContext* cx, JS::HandleObject obj,
bool* extensible);
extern JS_PUBLIC_API bool JS_PreventExtensions(JSContext* cx,
JS::HandleObject obj,
JS::ObjectOpResult& result);
extern JS_PUBLIC_API bool JS_SetImmutablePrototype(JSContext* cx,
JS::HandleObject obj,
bool* succeeded);
extern JS_PUBLIC_API bool JS_GetOwnPropertyDescriptorById(
JSContext* cx, JS::HandleObject obj, JS::HandleId id,
JS::MutableHandle<JS::PropertyDescriptor> desc);
extern JS_PUBLIC_API bool JS_GetOwnPropertyDescriptor(
JSContext* cx, JS::HandleObject obj, const char* name,
JS::MutableHandle<JS::PropertyDescriptor> desc);
extern JS_PUBLIC_API bool JS_GetOwnUCPropertyDescriptor(
JSContext* cx, JS::HandleObject obj, const char16_t* name, size_t namelen,
JS::MutableHandle<JS::PropertyDescriptor> desc);
extern JS_PUBLIC_API bool JS_GetPropertyDescriptorById(
JSContext* cx, JS::HandleObject obj, JS::HandleId id,
JS::MutableHandle<JS::PropertyDescriptor> desc);
extern JS_PUBLIC_API bool JS_GetPropertyDescriptor(
JSContext* cx, JS::HandleObject obj, const char* name,
JS::MutableHandle<JS::PropertyDescriptor> desc);
extern JS_PUBLIC_API bool JS_GetUCPropertyDescriptor(
JSContext* cx, JS::HandleObject obj, const char16_t* name, size_t namelen,
JS::MutableHandle<JS::PropertyDescriptor> desc);
extern JS_PUBLIC_API bool JS_DefinePropertyById(
JSContext* cx, JS::HandleObject obj, JS::HandleId id,
JS::Handle<JS::PropertyDescriptor> desc, JS::ObjectOpResult& result);
extern JS_PUBLIC_API bool JS_DefinePropertyById(
JSContext* cx, JS::HandleObject obj, JS::HandleId id,
JS::Handle<JS::PropertyDescriptor> desc);
extern JS_PUBLIC_API bool JS_DefinePropertyById(JSContext* cx,
JS::HandleObject obj,
JS::HandleId id,
JS::HandleValue value,
unsigned attrs);
extern JS_PUBLIC_API bool JS_DefinePropertyById(
JSContext* cx, JS::HandleObject obj, JS::HandleId id, JSNative getter,
JSNative setter, unsigned attrs);
extern JS_PUBLIC_API bool JS_DefinePropertyById(
JSContext* cx, JS::HandleObject obj, JS::HandleId id,
JS::HandleObject getter, JS::HandleObject setter, unsigned attrs);
extern JS_PUBLIC_API bool JS_DefinePropertyById(JSContext* cx,
JS::HandleObject obj,
JS::HandleId id,
JS::HandleObject value,
unsigned attrs);
extern JS_PUBLIC_API bool JS_DefinePropertyById(JSContext* cx,
JS::HandleObject obj,
JS::HandleId id,
JS::HandleString value,
unsigned attrs);
extern JS_PUBLIC_API bool JS_DefinePropertyById(JSContext* cx,
JS::HandleObject obj,
JS::HandleId id, int32_t value,
unsigned attrs);
extern JS_PUBLIC_API bool JS_DefinePropertyById(JSContext* cx,
JS::HandleObject obj,
JS::HandleId id, uint32_t value,
unsigned attrs);
extern JS_PUBLIC_API bool JS_DefinePropertyById(JSContext* cx,
JS::HandleObject obj,
JS::HandleId id, double value,
unsigned attrs);
extern JS_PUBLIC_API bool JS_DefineProperty(JSContext* cx, JS::HandleObject obj,
const char* name,
JS::HandleValue value,
unsigned attrs);
extern JS_PUBLIC_API bool JS_DefineProperty(JSContext* cx, JS::HandleObject obj,
const char* name, JSNative getter,
JSNative setter, unsigned attrs);
extern JS_PUBLIC_API bool JS_DefineProperty(JSContext* cx, JS::HandleObject obj,
const char* name,
JS::HandleObject getter,
JS::HandleObject setter,
unsigned attrs);
extern JS_PUBLIC_API bool JS_DefineProperty(JSContext* cx, JS::HandleObject obj,
const char* name,
JS::HandleObject value,
unsigned attrs);
extern JS_PUBLIC_API bool JS_DefineProperty(JSContext* cx, JS::HandleObject obj,
const char* name,
JS::HandleString value,
unsigned attrs);
extern JS_PUBLIC_API bool JS_DefineProperty(JSContext* cx, JS::HandleObject obj,
const char* name, int32_t value,
unsigned attrs);
extern JS_PUBLIC_API bool JS_DefineProperty(JSContext* cx, JS::HandleObject obj,
const char* name, uint32_t value,
unsigned attrs);
extern JS_PUBLIC_API bool JS_DefineProperty(JSContext* cx, JS::HandleObject obj,
const char* name, double value,
unsigned attrs);
extern JS_PUBLIC_API bool JS_DefineUCProperty(
JSContext* cx, JS::HandleObject obj, const char16_t* name, size_t namelen,
JS::Handle<JS::PropertyDescriptor> desc, JS::ObjectOpResult& result);
extern JS_PUBLIC_API bool JS_DefineUCProperty(
JSContext* cx, JS::HandleObject obj, const char16_t* name, size_t namelen,
JS::Handle<JS::PropertyDescriptor> desc);
extern JS_PUBLIC_API bool JS_DefineUCProperty(
JSContext* cx, JS::HandleObject obj, const char16_t* name, size_t namelen,
JS::HandleValue value, unsigned attrs);
extern JS_PUBLIC_API bool JS_DefineUCProperty(
JSContext* cx, JS::HandleObject obj, const char16_t* name, size_t namelen,
JS::HandleObject getter, JS::HandleObject setter, unsigned attrs);
extern JS_PUBLIC_API bool JS_DefineUCProperty(
JSContext* cx, JS::HandleObject obj, const char16_t* name, size_t namelen,
JS::HandleObject value, unsigned attrs);
extern JS_PUBLIC_API bool JS_DefineUCProperty(
JSContext* cx, JS::HandleObject obj, const char16_t* name, size_t namelen,
JS::HandleString value, unsigned attrs);
extern JS_PUBLIC_API bool JS_DefineUCProperty(JSContext* cx,
JS::HandleObject obj,
const char16_t* name,
size_t namelen, int32_t value,
unsigned attrs);
extern JS_PUBLIC_API bool JS_DefineUCProperty(JSContext* cx,
JS::HandleObject obj,
const char16_t* name,
size_t namelen, uint32_t value,
unsigned attrs);
extern JS_PUBLIC_API bool JS_DefineUCProperty(JSContext* cx,
JS::HandleObject obj,
const char16_t* name,
size_t namelen, double value,
unsigned attrs);
extern JS_PUBLIC_API bool JS_DefineElement(JSContext* cx, JS::HandleObject obj,
uint32_t index,
JS::HandleValue value,
unsigned attrs);
extern JS_PUBLIC_API bool JS_DefineElement(JSContext* cx, JS::HandleObject obj,
uint32_t index,
JS::HandleObject getter,
JS::HandleObject setter,
unsigned attrs);
extern JS_PUBLIC_API bool JS_DefineElement(JSContext* cx, JS::HandleObject obj,
uint32_t index,
JS::HandleObject value,
unsigned attrs);
extern JS_PUBLIC_API bool JS_DefineElement(JSContext* cx, JS::HandleObject obj,
uint32_t index,
JS::HandleString value,
unsigned attrs);
extern JS_PUBLIC_API bool JS_DefineElement(JSContext* cx, JS::HandleObject obj,
uint32_t index, int32_t value,
unsigned attrs);
extern JS_PUBLIC_API bool JS_DefineElement(JSContext* cx, JS::HandleObject obj,
uint32_t index, uint32_t value,
unsigned attrs);
extern JS_PUBLIC_API bool JS_DefineElement(JSContext* cx, JS::HandleObject obj,
uint32_t index, double value,
unsigned attrs);
extern JS_PUBLIC_API bool JS_HasPropertyById(JSContext* cx,
JS::HandleObject obj,
JS::HandleId id, bool* foundp);
extern JS_PUBLIC_API bool JS_HasProperty(JSContext* cx, JS::HandleObject obj,
const char* name, bool* foundp);
extern JS_PUBLIC_API bool JS_HasUCProperty(JSContext* cx, JS::HandleObject obj,
const char16_t* name, size_t namelen,
bool* vp);
extern JS_PUBLIC_API bool JS_HasElement(JSContext* cx, JS::HandleObject obj,
uint32_t index, bool* foundp);
extern JS_PUBLIC_API bool JS_HasOwnPropertyById(JSContext* cx,
JS::HandleObject obj,
JS::HandleId id, bool* foundp);
extern JS_PUBLIC_API bool JS_HasOwnProperty(JSContext* cx, JS::HandleObject obj,
const char* name, bool* foundp);
extern JS_PUBLIC_API bool JS_ForwardGetPropertyTo(JSContext* cx,
JS::HandleObject obj,
JS::HandleId id,
JS::HandleValue receiver,
JS::MutableHandleValue vp);
extern JS_PUBLIC_API bool JS_ForwardGetElementTo(JSContext* cx,
JS::HandleObject obj,
uint32_t index,
JS::HandleObject receiver,
JS::MutableHandleValue vp);
extern JS_PUBLIC_API bool JS_GetPropertyById(JSContext* cx,
JS::HandleObject obj,
JS::HandleId id,
JS::MutableHandleValue vp);
extern JS_PUBLIC_API bool JS_GetProperty(JSContext* cx, JS::HandleObject obj,
const char* name,
JS::MutableHandleValue vp);
extern JS_PUBLIC_API bool JS_GetUCProperty(JSContext* cx, JS::HandleObject obj,
const char16_t* name, size_t namelen,
JS::MutableHandleValue vp);
extern JS_PUBLIC_API bool JS_GetElement(JSContext* cx, JS::HandleObject obj,
uint32_t index,
JS::MutableHandleValue vp);
extern JS_PUBLIC_API bool JS_ForwardSetPropertyTo(
JSContext* cx, JS::HandleObject obj, JS::HandleId id, JS::HandleValue v,
JS::HandleValue receiver, JS::ObjectOpResult& result);
extern JS_PUBLIC_API bool JS_SetPropertyById(JSContext* cx,
JS::HandleObject obj,
JS::HandleId id,
JS::HandleValue v);
extern JS_PUBLIC_API bool JS_SetProperty(JSContext* cx, JS::HandleObject obj,
const char* name, JS::HandleValue v);
extern JS_PUBLIC_API bool JS_SetUCProperty(JSContext* cx, JS::HandleObject obj,
const char16_t* name, size_t namelen,
JS::HandleValue v);
extern JS_PUBLIC_API bool JS_SetElement(JSContext* cx, JS::HandleObject obj,
uint32_t index, JS::HandleValue v);
extern JS_PUBLIC_API bool JS_SetElement(JSContext* cx, JS::HandleObject obj,
uint32_t index, JS::HandleObject v);
extern JS_PUBLIC_API bool JS_SetElement(JSContext* cx, JS::HandleObject obj,
uint32_t index, JS::HandleString v);
extern JS_PUBLIC_API bool JS_SetElement(JSContext* cx, JS::HandleObject obj,
uint32_t index, int32_t v);
extern JS_PUBLIC_API bool JS_SetElement(JSContext* cx, JS::HandleObject obj,
uint32_t index, uint32_t v);
extern JS_PUBLIC_API bool JS_SetElement(JSContext* cx, JS::HandleObject obj,
uint32_t index, double v);
extern JS_PUBLIC_API bool JS_DeletePropertyById(JSContext* cx,
JS::HandleObject obj,
JS::HandleId id,
JS::ObjectOpResult& result);
extern JS_PUBLIC_API bool JS_DeleteProperty(JSContext* cx, JS::HandleObject obj,
const char* name,
JS::ObjectOpResult& result);
extern JS_PUBLIC_API bool JS_DeleteUCProperty(JSContext* cx,
JS::HandleObject obj,
const char16_t* name,
size_t namelen,
JS::ObjectOpResult& result);
extern JS_PUBLIC_API bool JS_DeleteElement(JSContext* cx, JS::HandleObject obj,
uint32_t index,
JS::ObjectOpResult& result);
extern JS_PUBLIC_API bool JS_DeletePropertyById(JSContext* cx,
JS::HandleObject obj, jsid id);
extern JS_PUBLIC_API bool JS_DeleteProperty(JSContext* cx, JS::HandleObject obj,
const char* name);
extern JS_PUBLIC_API bool JS_DeleteElement(JSContext* cx, JS::HandleObject obj,
uint32_t index);
extern JS_PUBLIC_API bool JS_Enumerate(JSContext* cx, JS::HandleObject obj,
JS::MutableHandle<JS::IdVector> props);
extern JS_PUBLIC_API bool JS_AssignObject(JSContext* cx,
JS::HandleObject target,
JS::HandleObject src);
namespace JS {
extern JS_PUBLIC_API bool IsCallable(JSObject* obj);
extern JS_PUBLIC_API bool IsConstructor(JSObject* obj);
}
extern JS_PUBLIC_API bool JS_CallFunctionValue(JSContext* cx,
JS::HandleObject obj,
JS::HandleValue fval,
const JS::HandleValueArray& args,
JS::MutableHandleValue rval);
extern JS_PUBLIC_API bool JS_CallFunction(JSContext* cx, JS::HandleObject obj,
JS::HandleFunction fun,
const JS::HandleValueArray& args,
JS::MutableHandleValue rval);
extern JS_PUBLIC_API bool JS_CallFunctionName(JSContext* cx,
JS::HandleObject obj,
const char* name,
const JS::HandleValueArray& args,
JS::MutableHandleValue rval);
namespace JS {
static inline bool Call(JSContext* cx, JS::HandleObject thisObj,
JS::HandleFunction fun,
const JS::HandleValueArray& args,
MutableHandleValue rval) {
return !!JS_CallFunction(cx, thisObj, fun, args, rval);
}
static inline bool Call(JSContext* cx, JS::HandleObject thisObj,
JS::HandleValue fun, const JS::HandleValueArray& args,
MutableHandleValue rval) {
return !!JS_CallFunctionValue(cx, thisObj, fun, args, rval);
}
static inline bool Call(JSContext* cx, JS::HandleObject thisObj,
const char* name, const JS::HandleValueArray& args,
MutableHandleValue rval) {
return !!JS_CallFunctionName(cx, thisObj, name, args, rval);
}
extern JS_PUBLIC_API bool Call(JSContext* cx, JS::HandleValue thisv,
JS::HandleValue fun,
const JS::HandleValueArray& args,
MutableHandleValue rval);
static inline bool Call(JSContext* cx, JS::HandleValue thisv,
JS::HandleObject funObj,
const JS::HandleValueArray& args,
MutableHandleValue rval) {
MOZ_ASSERT(funObj);
JS::RootedValue fun(cx, JS::ObjectValue(*funObj));
return Call(cx, thisv, fun, args, rval);
}
extern JS_PUBLIC_API bool Construct(JSContext* cx, JS::HandleValue fun,
HandleObject newTarget,
const JS::HandleValueArray& args,
MutableHandleObject objp);
extern JS_PUBLIC_API bool Construct(JSContext* cx, JS::HandleValue fun,
const JS::HandleValueArray& args,
MutableHandleObject objp);
}
extern JS_PUBLIC_API JSObject* JS_New(JSContext* cx, JS::HandleObject ctor,
const JS::HandleValueArray& args);
extern JS_PUBLIC_API JSObject* JS_DefineObject(JSContext* cx,
JS::HandleObject obj,
const char* name,
const JSClass* clasp = nullptr,
unsigned attrs = 0);
extern JS_PUBLIC_API bool JS_DefineConstDoubles(JSContext* cx,
JS::HandleObject obj,
const JSConstDoubleSpec* cds);
extern JS_PUBLIC_API bool JS_DefineConstIntegers(JSContext* cx,
JS::HandleObject obj,
const JSConstIntegerSpec* cis);
extern JS_PUBLIC_API bool JS_DefineProperties(JSContext* cx,
JS::HandleObject obj,
const JSPropertySpec* ps);
extern JS_PUBLIC_API bool JS_AlreadyHasOwnPropertyById(JSContext* cx,
JS::HandleObject obj,
JS::HandleId id,
bool* foundp);
extern JS_PUBLIC_API bool JS_AlreadyHasOwnProperty(JSContext* cx,
JS::HandleObject obj,
const char* name,
bool* foundp);
extern JS_PUBLIC_API bool JS_AlreadyHasOwnUCProperty(JSContext* cx,
JS::HandleObject obj,
const char16_t* name,
size_t namelen,
bool* foundp);
extern JS_PUBLIC_API bool JS_AlreadyHasOwnElement(JSContext* cx,
JS::HandleObject obj,
uint32_t index, bool* foundp);
extern JS_PUBLIC_API JSObject* JS_NewArrayObject(
JSContext* cx, const JS::HandleValueArray& contents);
extern JS_PUBLIC_API JSObject* JS_NewArrayObject(JSContext* cx, size_t length);
extern JS_PUBLIC_API bool JS_IsArrayObject(JSContext* cx, JS::HandleValue value,
bool* isArray);
extern JS_PUBLIC_API bool JS_IsArrayObject(JSContext* cx, JS::HandleObject obj,
bool* isArray);
extern JS_PUBLIC_API bool JS_GetArrayLength(JSContext* cx,
JS::Handle<JSObject*> obj,
uint32_t* lengthp);
extern JS_PUBLIC_API bool JS_SetArrayLength(JSContext* cx,
JS::Handle<JSObject*> obj,
uint32_t length);
namespace JS {
extern JS_PUBLIC_API bool IsMapObject(JSContext* cx, JS::HandleObject obj,
bool* isMap);
extern JS_PUBLIC_API bool IsSetObject(JSContext* cx, JS::HandleObject obj,
bool* isSet);
}
JS_PUBLIC_API void JS_SetAllNonReservedSlotsToUndefined(JSContext* cx,
JSObject* objArg);
extern JS_PUBLIC_API JS::Value JS_GetReservedSlot(JSObject* obj,
uint32_t index);
extern JS_PUBLIC_API void JS_SetReservedSlot(JSObject* obj, uint32_t index,
const JS::Value& v);
static constexpr unsigned JSFUN_CONSTRUCTOR = 0x400;
static constexpr unsigned JSFUN_FLAGS_MASK = 0x400;
static_assert((JSPROP_FLAGS_MASK & JSFUN_FLAGS_MASK) == 0,
"JSFUN_* flags do not overlap JSPROP_* flags, because bits from "
"the two flag-sets appear in the same flag in some APIs");
extern JS_PUBLIC_API JSFunction* JS_NewFunction(JSContext* cx, JSNative call,
unsigned nargs, unsigned flags,
const char* name);
namespace JS {
extern JS_PUBLIC_API JSFunction* GetSelfHostedFunction(
JSContext* cx, const char* selfHostedName, HandleId id, unsigned nargs);
extern JS_PUBLIC_API JSFunction* NewFunctionFromSpec(JSContext* cx,
const JSFunctionSpec* fs,
HandleId id);
}
extern JS_PUBLIC_API JSObject* JS_GetFunctionObject(JSFunction* fun);
extern JS_PUBLIC_API JSString* JS_GetFunctionId(JSFunction* fun);
extern JS_PUBLIC_API JSString* JS_GetFunctionDisplayId(JSFunction* fun);
extern JS_PUBLIC_API uint16_t JS_GetFunctionArity(JSFunction* fun);
JS_PUBLIC_API bool JS_GetFunctionLength(JSContext* cx, JS::HandleFunction fun,
uint16_t* length);
extern JS_PUBLIC_API bool JS_ObjectIsFunction(JSObject* obj);
extern JS_PUBLIC_API bool JS_IsNativeFunction(JSObject* funobj, JSNative call);
extern JS_PUBLIC_API bool JS_IsConstructor(JSFunction* fun);
extern JS_PUBLIC_API bool JS_DefineFunctions(JSContext* cx,
JS::Handle<JSObject*> obj,
const JSFunctionSpec* fs);
extern JS_PUBLIC_API JSFunction* JS_DefineFunction(
JSContext* cx, JS::Handle<JSObject*> obj, const char* name, JSNative call,
unsigned nargs, unsigned attrs);
extern JS_PUBLIC_API JSFunction* JS_DefineUCFunction(
JSContext* cx, JS::Handle<JSObject*> obj, const char16_t* name,
size_t namelen, JSNative call, unsigned nargs, unsigned attrs);
extern JS_PUBLIC_API JSFunction* JS_DefineFunctionById(
JSContext* cx, JS::Handle<JSObject*> obj, JS::Handle<jsid> id,
JSNative call, unsigned nargs, unsigned attrs);
extern JS_PUBLIC_API bool JS_IsFunctionBound(JSFunction* fun);
extern JS_PUBLIC_API JSObject* JS_GetBoundFunctionTarget(JSFunction* fun);
namespace JS {
extern JS_PUBLIC_API JSObject* CloneFunctionObject(JSContext* cx,
HandleObject funobj);
extern JS_PUBLIC_API JSObject* CloneFunctionObject(
JSContext* cx, HandleObject funobj, AutoObjectVector& scopeChain);
}
extern JS_PUBLIC_API JSObject* JS_GetGlobalFromScript(JSScript* script);
extern JS_PUBLIC_API const char* JS_GetScriptFilename(JSScript* script);
extern JS_PUBLIC_API unsigned JS_GetScriptBaseLineNumber(JSContext* cx,
JSScript* script);
extern JS_PUBLIC_API JSScript* JS_GetFunctionScript(JSContext* cx,
JS::HandleFunction fun);
extern JS_PUBLIC_API JSString* JS_DecompileScript(JSContext* cx,
JS::Handle<JSScript*> script);
extern JS_PUBLIC_API JSString* JS_DecompileFunction(
JSContext* cx, JS::Handle<JSFunction*> fun);
namespace JS {
using ModuleResolveHook = JSObject* (*)(JSContext*, HandleValue, HandleString);
extern JS_PUBLIC_API ModuleResolveHook GetModuleResolveHook(JSRuntime* rt);
extern JS_PUBLIC_API void SetModuleResolveHook(JSRuntime* rt,
ModuleResolveHook func);
using ModuleMetadataHook = bool (*)(JSContext*, HandleValue, HandleObject);
extern JS_PUBLIC_API ModuleMetadataHook GetModuleMetadataHook(JSRuntime* rt);
extern JS_PUBLIC_API void SetModuleMetadataHook(JSRuntime* rt,
ModuleMetadataHook func);
using ModuleDynamicImportHook = bool (*)(JSContext* cx,
HandleValue referencingPrivate,
HandleString specifier,
HandleObject promise);
extern JS_PUBLIC_API ModuleDynamicImportHook
GetModuleDynamicImportHook(JSRuntime* rt);
extern JS_PUBLIC_API void SetModuleDynamicImportHook(
JSRuntime* rt, ModuleDynamicImportHook func);
extern JS_PUBLIC_API bool FinishDynamicModuleImport(
JSContext* cx, HandleValue referencingPrivate, HandleString specifier,
HandleObject promise);
extern JS_PUBLIC_API bool CompileModule(JSContext* cx,
const ReadOnlyCompileOptions& options,
SourceText<char16_t>& srcBuf,
JS::MutableHandleObject moduleRecord);
extern JS_PUBLIC_API void SetModulePrivate(JSObject* module,
const JS::Value& value);
extern JS_PUBLIC_API JS::Value GetModulePrivate(JSObject* module);
extern JS_PUBLIC_API void SetScriptPrivate(JSScript* script,
const JS::Value& value);
extern JS_PUBLIC_API JS::Value GetScriptPrivate(JSScript* script);
extern JS_PUBLIC_API JS::Value GetScriptedCallerPrivate(JSContext* cx);
using ScriptPrivateReferenceHook = void (*)(const JS::Value&);
extern JS_PUBLIC_API void SetScriptPrivateReferenceHooks(
JSRuntime* rt, ScriptPrivateReferenceHook addRefHook,
ScriptPrivateReferenceHook releaseHook);
extern JS_PUBLIC_API bool ModuleInstantiate(JSContext* cx,
JS::HandleObject moduleRecord);
extern JS_PUBLIC_API bool ModuleEvaluate(JSContext* cx,
JS::HandleObject moduleRecord);
extern JS_PUBLIC_API JSObject* GetRequestedModules(
JSContext* cx, JS::HandleObject moduleRecord);
extern JS_PUBLIC_API JSString* GetRequestedModuleSpecifier(
JSContext* cx, JS::HandleValue requestedModuleObject);
extern JS_PUBLIC_API void GetRequestedModuleSourcePos(
JSContext* cx, JS::HandleValue requestedModuleObject, uint32_t* lineNumber,
uint32_t* columnNumber);
extern JS_PUBLIC_API JSScript* GetModuleScript(JS::HandleObject moduleRecord);
}
#if defined(JS_BUILD_BINAST)
namespace JS {
extern JS_PUBLIC_API JSScript* DecodeBinAST(
JSContext* cx, const ReadOnlyCompileOptions& options, FILE* file);
extern JS_PUBLIC_API JSScript* DecodeBinAST(
JSContext* cx, const ReadOnlyCompileOptions& options, const uint8_t* buf,
size_t length);
extern JS_PUBLIC_API bool CanDecodeBinASTOffThread(
JSContext* cx, const ReadOnlyCompileOptions& options, size_t length);
extern JS_PUBLIC_API bool DecodeBinASTOffThread(
JSContext* cx, const ReadOnlyCompileOptions& options, const uint8_t* buf,
size_t length, OffThreadCompileCallback callback, void* callbackData);
extern JS_PUBLIC_API JSScript* FinishOffThreadBinASTDecode(
JSContext* cx, OffThreadToken* token);
}
#endif
extern JS_PUBLIC_API bool JS_CheckForInterrupt(JSContext* cx);
extern JS_PUBLIC_API bool JS_AddInterruptCallback(JSContext* cx,
JSInterruptCallback callback);
extern JS_PUBLIC_API bool JS_DisableInterruptCallback(JSContext* cx);
extern JS_PUBLIC_API void JS_ResetInterruptCallback(JSContext* cx, bool enable);
extern JS_PUBLIC_API void JS_RequestInterruptCallback(JSContext* cx);
extern JS_PUBLIC_API void JS_RequestInterruptCallbackCanWait(JSContext* cx);
namespace JS {
class OptimizedEncodingListener {
protected:
virtual ~OptimizedEncodingListener() {}
public:
virtual MozExternalRefCountType MOZ_XPCOM_ABI AddRef() = 0;
virtual MozExternalRefCountType MOZ_XPCOM_ABI Release() = 0;
virtual void storeOptimizedEncoding(const uint8_t* bytes, size_t length) = 0;
};
class JS_PUBLIC_API StreamConsumer {
protected:
StreamConsumer() = default;
virtual ~StreamConsumer() = default;
public:
virtual bool consumeChunk(const uint8_t* begin, size_t length) = 0;
virtual void streamEnd(OptimizedEncodingListener* listener = nullptr) = 0;
virtual void streamError(size_t errorCode) = 0;
virtual void consumeOptimizedEncoding(const uint8_t* begin,
size_t length) = 0;
virtual void noteResponseURLs(const char* maybeUrl,
const char* maybeSourceMapUrl) = 0;
};
enum class MimeType { Wasm };
typedef bool (*ConsumeStreamCallback)(JSContext* cx, JS::HandleObject obj,
MimeType mimeType,
StreamConsumer* consumer);
typedef void (*ReportStreamErrorCallback)(JSContext* cx, size_t errorCode);
extern JS_PUBLIC_API void InitConsumeStreamCallback(
JSContext* cx, ConsumeStreamCallback consume,
ReportStreamErrorCallback report);
class MOZ_STACK_CLASS JS_PUBLIC_API AutoSetAsyncStackForNewCalls {
JSContext* cx;
RootedObject oldAsyncStack;
const char* oldAsyncCause;
bool oldAsyncCallIsExplicit;
public:
enum class AsyncCallKind {
IMPLICIT,
EXPLICIT
};
AutoSetAsyncStackForNewCalls(JSContext* cx, HandleObject stack,
const char* asyncCause,
AsyncCallKind kind = AsyncCallKind::IMPLICIT);
~AutoSetAsyncStackForNewCalls();
};
}
extern JS_PUBLIC_API JSString* JS_NewStringCopyN(JSContext* cx, const char* s,
size_t n);
extern JS_PUBLIC_API JSString* JS_NewStringCopyZ(JSContext* cx, const char* s);
extern JS_PUBLIC_API JSString* JS_NewStringCopyUTF8Z(
JSContext* cx, const JS::ConstUTF8CharsZ s);
extern JS_PUBLIC_API JSString* JS_NewStringCopyUTF8N(JSContext* cx,
const JS::UTF8Chars s);
extern JS_PUBLIC_API JSString* JS_AtomizeAndPinJSString(JSContext* cx,
JS::HandleString str);
extern JS_PUBLIC_API JSString* JS_AtomizeStringN(JSContext* cx, const char* s,
size_t length);
extern JS_PUBLIC_API JSString* JS_AtomizeString(JSContext* cx, const char* s);
extern JS_PUBLIC_API JSString* JS_AtomizeAndPinStringN(JSContext* cx,
const char* s,
size_t length);
extern JS_PUBLIC_API JSString* JS_AtomizeAndPinString(JSContext* cx,
const char* s);
extern JS_PUBLIC_API JSString* JS_NewLatin1String(
JSContext* cx, js::UniquePtr<JS::Latin1Char[], JS::FreePolicy> chars,
size_t length);
extern JS_PUBLIC_API JSString* JS_NewUCString(JSContext* cx,
JS::UniqueTwoByteChars chars,
size_t length);
extern JS_PUBLIC_API JSString* JS_NewUCStringDontDeflate(
JSContext* cx, JS::UniqueTwoByteChars chars, size_t length);
extern JS_PUBLIC_API JSString* JS_NewUCStringCopyN(JSContext* cx,
const char16_t* s, size_t n);
extern JS_PUBLIC_API JSString* JS_NewUCStringCopyZ(JSContext* cx,
const char16_t* s);
extern JS_PUBLIC_API JSString* JS_AtomizeUCStringN(JSContext* cx,
const char16_t* s,
size_t length);
extern JS_PUBLIC_API JSString* JS_AtomizeUCString(JSContext* cx,
const char16_t* s);
extern JS_PUBLIC_API JSString* JS_AtomizeAndPinUCStringN(JSContext* cx,
const char16_t* s,
size_t length);
extern JS_PUBLIC_API JSString* JS_AtomizeAndPinUCString(JSContext* cx,
const char16_t* s);
extern JS_PUBLIC_API bool JS_CompareStrings(JSContext* cx, JSString* str1,
JSString* str2, int32_t* result);
extern JS_PUBLIC_API bool JS_StringEqualsAscii(JSContext* cx, JSString* str,
const char* asciiBytes,
bool* match);
extern JS_PUBLIC_API size_t JS_PutEscapedString(JSContext* cx, char* buffer,
size_t size, JSString* str,
char quote);
extern JS_PUBLIC_API size_t JS_GetStringLength(JSString* str);
extern JS_PUBLIC_API bool JS_StringIsFlat(JSString* str);
extern JS_PUBLIC_API bool JS_StringHasLatin1Chars(JSString* str);
extern JS_PUBLIC_API const JS::Latin1Char* JS_GetLatin1StringCharsAndLength(
JSContext* cx, const JS::AutoRequireNoGC& nogc, JSString* str,
size_t* length);
extern JS_PUBLIC_API const char16_t* JS_GetTwoByteStringCharsAndLength(
JSContext* cx, const JS::AutoRequireNoGC& nogc, JSString* str,
size_t* length);
extern JS_PUBLIC_API bool JS_GetStringCharAt(JSContext* cx, JSString* str,
size_t index, char16_t* res);
extern JS_PUBLIC_API char16_t JS_GetFlatStringCharAt(JSFlatString* str,
size_t index);
extern JS_PUBLIC_API const char16_t* JS_GetTwoByteExternalStringChars(
JSString* str);
extern JS_PUBLIC_API bool JS_CopyStringChars(JSContext* cx,
mozilla::Range<char16_t> dest,
JSString* str);
extern JS_PUBLIC_API JSFlatString* JS_FlattenString(JSContext* cx,
JSString* str);
extern JS_PUBLIC_API const JS::Latin1Char* JS_GetLatin1FlatStringChars(
const JS::AutoRequireNoGC& nogc, JSFlatString* str);
extern JS_PUBLIC_API const char16_t* JS_GetTwoByteFlatStringChars(
const JS::AutoRequireNoGC& nogc, JSFlatString* str);
static MOZ_ALWAYS_INLINE JSFlatString* JSID_TO_FLAT_STRING(jsid id) {
MOZ_ASSERT(JSID_IS_STRING(id));
return (JSFlatString*)JSID_TO_STRING(id);
}
static MOZ_ALWAYS_INLINE JSFlatString* JS_ASSERT_STRING_IS_FLAT(JSString* str) {
MOZ_ASSERT(JS_StringIsFlat(str));
return (JSFlatString*)str;
}
static MOZ_ALWAYS_INLINE JSString* JS_FORGET_STRING_FLATNESS(
JSFlatString* fstr) {
return (JSString*)fstr;
}
extern JS_PUBLIC_API bool JS_FlatStringEqualsAscii(JSFlatString* str,
const char* asciiBytes);
extern JS_PUBLIC_API size_t JS_PutEscapedFlatString(char* buffer, size_t size,
JSFlatString* str,
char quote);
extern JS_PUBLIC_API JSString* JS_NewDependentString(JSContext* cx,
JS::HandleString str,
size_t start,
size_t length);
extern JS_PUBLIC_API JSString* JS_ConcatStrings(JSContext* cx,
JS::HandleString left,
JS::HandleString right);
JS_PUBLIC_API bool JS_DecodeBytes(JSContext* cx, const char* src, size_t srclen,
char16_t* dst, size_t* dstlenp);
JS_PUBLIC_API size_t JS_GetStringEncodingLength(JSContext* cx, JSString* str);
MOZ_MUST_USE JS_PUBLIC_API bool JS_EncodeStringToBuffer(JSContext* cx,
JSString* str,
char* buffer,
size_t length);
namespace JS {
JS_PUBLIC_API bool PropertySpecNameEqualsId(const char* name, HandleId id);
JS_PUBLIC_API bool PropertySpecNameToPermanentId(JSContext* cx,
const char* name, jsid* idp);
}
namespace JS {
const uint16_t MaxNumErrorArguments = 10;
};
extern JS_PUBLIC_API void JS_ReportErrorASCII(JSContext* cx, const char* format,
...) MOZ_FORMAT_PRINTF(2, 3);
extern JS_PUBLIC_API void JS_ReportErrorLatin1(JSContext* cx,
const char* format, ...)
MOZ_FORMAT_PRINTF(2, 3);
extern JS_PUBLIC_API void JS_ReportErrorUTF8(JSContext* cx, const char* format,
...) MOZ_FORMAT_PRINTF(2, 3);
extern JS_PUBLIC_API void JS_ReportErrorNumberASCII(
JSContext* cx, JSErrorCallback errorCallback, void* userRef,
const unsigned errorNumber, ...);
extern JS_PUBLIC_API void JS_ReportErrorNumberASCIIVA(
JSContext* cx, JSErrorCallback errorCallback, void* userRef,
const unsigned errorNumber, va_list ap);
extern JS_PUBLIC_API void JS_ReportErrorNumberLatin1(
JSContext* cx, JSErrorCallback errorCallback, void* userRef,
const unsigned errorNumber, ...);
#ifdef va_start
extern JS_PUBLIC_API void JS_ReportErrorNumberLatin1VA(
JSContext* cx, JSErrorCallback errorCallback, void* userRef,
const unsigned errorNumber, va_list ap);
#endif
extern JS_PUBLIC_API void JS_ReportErrorNumberUTF8(
JSContext* cx, JSErrorCallback errorCallback, void* userRef,
const unsigned errorNumber, ...);
#ifdef va_start
extern JS_PUBLIC_API void JS_ReportErrorNumberUTF8VA(
JSContext* cx, JSErrorCallback errorCallback, void* userRef,
const unsigned errorNumber, va_list ap);
#endif
extern JS_PUBLIC_API void JS_ReportErrorNumberUC(JSContext* cx,
JSErrorCallback errorCallback,
void* userRef,
const unsigned errorNumber,
...);
extern JS_PUBLIC_API void JS_ReportErrorNumberUCArray(
JSContext* cx, JSErrorCallback errorCallback, void* userRef,
const unsigned errorNumber, const char16_t** args);
extern JS_PUBLIC_API bool JS_ReportWarningASCII(JSContext* cx,
const char* format, ...)
MOZ_FORMAT_PRINTF(2, 3);
extern JS_PUBLIC_API bool JS_ReportWarningLatin1(JSContext* cx,
const char* format, ...)
MOZ_FORMAT_PRINTF(2, 3);
extern JS_PUBLIC_API bool JS_ReportWarningUTF8(JSContext* cx,
const char* format, ...)
MOZ_FORMAT_PRINTF(2, 3);
extern JS_PUBLIC_API bool JS_ReportErrorFlagsAndNumberASCII(
JSContext* cx, unsigned flags, JSErrorCallback errorCallback, void* userRef,
const unsigned errorNumber, ...);
extern JS_PUBLIC_API bool JS_ReportErrorFlagsAndNumberLatin1(
JSContext* cx, unsigned flags, JSErrorCallback errorCallback, void* userRef,
const unsigned errorNumber, ...);
extern JS_PUBLIC_API bool JS_ReportErrorFlagsAndNumberUTF8(
JSContext* cx, unsigned flags, JSErrorCallback errorCallback, void* userRef,
const unsigned errorNumber, ...);
extern JS_PUBLIC_API bool JS_ReportErrorFlagsAndNumberUC(
JSContext* cx, unsigned flags, JSErrorCallback errorCallback, void* userRef,
const unsigned errorNumber, ...);
extern MOZ_COLD JS_PUBLIC_API void JS_ReportOutOfMemory(JSContext* cx);
extern JS_PUBLIC_API void JS_ReportAllocationOverflow(JSContext* cx);
namespace JS {
using WarningReporter = void (*)(JSContext* cx, JSErrorReport* report);
extern JS_PUBLIC_API WarningReporter
SetWarningReporter(JSContext* cx, WarningReporter reporter);
extern JS_PUBLIC_API WarningReporter GetWarningReporter(JSContext* cx);
class MOZ_RAII JS_PUBLIC_API AutoSuppressWarningReporter {
JSContext* context_;
WarningReporter prevReporter_;
public:
explicit AutoSuppressWarningReporter(JSContext* cx) : context_(cx) {
prevReporter_ = SetWarningReporter(context_, nullptr);
}
~AutoSuppressWarningReporter() {
#ifdef DEBUG
WarningReporter reporter =
#endif
SetWarningReporter(context_, prevReporter_);
MOZ_ASSERT(reporter == nullptr, "Unexpected WarningReporter active");
SetWarningReporter(context_, prevReporter_);
}
};
extern JS_PUBLIC_API bool CreateError(
JSContext* cx, JSExnType type, HandleObject stack, HandleString fileName,
uint32_t lineNumber, uint32_t columnNumber, JSErrorReport* report,
HandleString message, MutableHandleValue rval);
extern JS_PUBLIC_API JSObject* NewWeakMapObject(JSContext* cx);
extern JS_PUBLIC_API bool IsWeakMapObject(JSObject* obj);
extern JS_PUBLIC_API bool GetWeakMapEntry(JSContext* cx,
JS::HandleObject mapObj,
JS::HandleObject key,
JS::MutableHandleValue val);
extern JS_PUBLIC_API bool SetWeakMapEntry(JSContext* cx,
JS::HandleObject mapObj,
JS::HandleObject key,
JS::HandleValue val);
extern JS_PUBLIC_API JSObject* NewMapObject(JSContext* cx);
extern JS_PUBLIC_API uint32_t MapSize(JSContext* cx, HandleObject obj);
extern JS_PUBLIC_API bool MapGet(JSContext* cx, HandleObject obj,
HandleValue key, MutableHandleValue rval);
extern JS_PUBLIC_API bool MapHas(JSContext* cx, HandleObject obj,
HandleValue key, bool* rval);
extern JS_PUBLIC_API bool MapSet(JSContext* cx, HandleObject obj,
HandleValue key, HandleValue val);
extern JS_PUBLIC_API bool MapDelete(JSContext* cx, HandleObject obj,
HandleValue key, bool* rval);
extern JS_PUBLIC_API bool MapClear(JSContext* cx, HandleObject obj);
extern JS_PUBLIC_API bool MapKeys(JSContext* cx, HandleObject obj,
MutableHandleValue rval);
extern JS_PUBLIC_API bool MapValues(JSContext* cx, HandleObject obj,
MutableHandleValue rval);
extern JS_PUBLIC_API bool MapEntries(JSContext* cx, HandleObject obj,
MutableHandleValue rval);
extern JS_PUBLIC_API bool MapForEach(JSContext* cx, HandleObject obj,
HandleValue callbackFn,
HandleValue thisVal);
extern JS_PUBLIC_API JSObject* NewSetObject(JSContext* cx);
extern JS_PUBLIC_API uint32_t SetSize(JSContext* cx, HandleObject obj);
extern JS_PUBLIC_API bool SetHas(JSContext* cx, HandleObject obj,
HandleValue key, bool* rval);
extern JS_PUBLIC_API bool SetDelete(JSContext* cx, HandleObject obj,
HandleValue key, bool* rval);
extern JS_PUBLIC_API bool SetAdd(JSContext* cx, HandleObject obj,
HandleValue key);
extern JS_PUBLIC_API bool SetClear(JSContext* cx, HandleObject obj);
extern JS_PUBLIC_API bool SetKeys(JSContext* cx, HandleObject obj,
MutableHandleValue rval);
extern JS_PUBLIC_API bool SetValues(JSContext* cx, HandleObject obj,
MutableHandleValue rval);
extern JS_PUBLIC_API bool SetEntries(JSContext* cx, HandleObject obj,
MutableHandleValue rval);
extern JS_PUBLIC_API bool SetForEach(JSContext* cx, HandleObject obj,
HandleValue callbackFn,
HandleValue thisVal);
}
#define JSREG_FOLD 0x01u
#define JSREG_GLOB 0x02u
#define JSREG_MULTILINE 0x04u
#define JSREG_STICKY 0x08u
#define JSREG_UNICODE 0x10u
extern JS_PUBLIC_API JSObject* JS_NewRegExpObject(JSContext* cx,
const char* bytes,
size_t length,
unsigned flags);
extern JS_PUBLIC_API JSObject* JS_NewUCRegExpObject(JSContext* cx,
const char16_t* chars,
size_t length,
unsigned flags);
extern JS_PUBLIC_API bool JS_SetRegExpInput(JSContext* cx, JS::HandleObject obj,
JS::HandleString input);
extern JS_PUBLIC_API bool JS_ClearRegExpStatics(JSContext* cx,
JS::HandleObject obj);
extern JS_PUBLIC_API bool JS_ExecuteRegExp(JSContext* cx, JS::HandleObject obj,
JS::HandleObject reobj,
char16_t* chars, size_t length,
size_t* indexp, bool test,
JS::MutableHandleValue rval);
extern JS_PUBLIC_API bool JS_ExecuteRegExpNoStatics(
JSContext* cx, JS::HandleObject reobj, char16_t* chars, size_t length,
size_t* indexp, bool test, JS::MutableHandleValue rval);
extern JS_PUBLIC_API bool JS_ObjectIsRegExp(JSContext* cx, JS::HandleObject obj,
bool* isRegExp);
extern JS_PUBLIC_API unsigned JS_GetRegExpFlags(JSContext* cx,
JS::HandleObject obj);
extern JS_PUBLIC_API JSString* JS_GetRegExpSource(JSContext* cx,
JS::HandleObject obj);
extern JS_PUBLIC_API bool JS_IsExceptionPending(JSContext* cx);
extern JS_PUBLIC_API bool JS_GetPendingException(JSContext* cx,
JS::MutableHandleValue vp);
extern JS_PUBLIC_API void JS_SetPendingException(JSContext* cx,
JS::HandleValue v);
extern JS_PUBLIC_API void JS_ClearPendingException(JSContext* cx);
namespace JS {
class JS_PUBLIC_API AutoSaveExceptionState {
private:
JSContext* context;
bool wasPropagatingForcedReturn;
bool wasOverRecursed;
bool wasThrowing;
RootedValue exceptionValue;
public:
explicit AutoSaveExceptionState(JSContext* cx);
~AutoSaveExceptionState();
void drop() {
wasPropagatingForcedReturn = false;
wasOverRecursed = false;
wasThrowing = false;
exceptionValue.setUndefined();
}
void restore();
};
}
extern JS_PUBLIC_API JSExceptionState* JS_SaveExceptionState(JSContext* cx);
extern JS_PUBLIC_API void JS_RestoreExceptionState(JSContext* cx,
JSExceptionState* state);
extern JS_PUBLIC_API void JS_DropExceptionState(JSContext* cx,
JSExceptionState* state);
extern JS_PUBLIC_API JSErrorReport* JS_ErrorFromException(JSContext* cx,
JS::HandleObject obj);
namespace JS {
extern JS_PUBLIC_API JSObject* ExceptionStackOrNull(JS::HandleObject obj);
extern JS_PUBLIC_API uint64_t ExceptionTimeWarpTarget(JS::HandleValue exn);
}
extern JS_PUBLIC_API void JS_AbortIfWrongThread(JSContext* cx);
extern JS_PUBLIC_API JSObject* JS_NewObjectForConstructor(
JSContext* cx, const JSClass* clasp, const JS::CallArgs& args);
#ifdef JS_GC_ZEAL
# define JS_DEFAULT_ZEAL_FREQ 100
extern JS_PUBLIC_API void JS_GetGCZealBits(JSContext* cx, uint32_t* zealBits,
uint32_t* frequency,
uint32_t* nextScheduled);
extern JS_PUBLIC_API void JS_SetGCZeal(JSContext* cx, uint8_t zeal,
uint32_t frequency);
extern JS_PUBLIC_API void JS_UnsetGCZeal(JSContext* cx, uint8_t zeal);
extern JS_PUBLIC_API void JS_ScheduleGC(JSContext* cx, uint32_t count);
#endif
extern JS_PUBLIC_API void JS_SetParallelParsingEnabled(JSContext* cx,
bool enabled);
extern JS_PUBLIC_API void JS_SetOffthreadIonCompilationEnabled(JSContext* cx,
bool enabled);
#define JIT_COMPILER_OPTIONS(Register) \
Register(BASELINE_WARMUP_TRIGGER, "baseline.warmup.trigger") \
Register(ION_NORMAL_WARMUP_TRIGGER, "ion.warmup.trigger") \
Register(ION_FULL_WARMUP_TRIGGER, "ion.full.warmup.trigger") \
Register(ION_GVN_ENABLE, "ion.gvn.enable") \
Register(ION_FORCE_IC, "ion.forceinlineCaches") \
Register(ION_ENABLE, "ion.enable") \
Register(ION_CHECK_RANGE_ANALYSIS, "ion.check-range-analysis") \
Register(ION_FREQUENT_BAILOUT_THRESHOLD, "ion.frequent-bailout-threshold") \
Register(BASELINE_ENABLE, "baseline.enable") \
Register(OFFTHREAD_COMPILATION_ENABLE, "offthread-compilation.enable") \
Register(FULL_DEBUG_CHECKS, "jit.full-debug-checks") \
Register(JUMP_THRESHOLD, "jump-threshold") \
Register(TRACK_OPTIMIZATIONS, "jit.track-optimizations")\
Register(UNBOXED_OBJECTS, "unboxed_objects") \
Register(SIMULATOR_ALWAYS_INTERRUPT, "simulator.always-interrupt") \
Register(SPECTRE_INDEX_MASKING, "spectre.index-masking") \
Register(SPECTRE_OBJECT_MITIGATIONS_BARRIERS, "spectre.object-mitigations.barriers") \
Register(SPECTRE_OBJECT_MITIGATIONS_MISC, "spectre.object-mitigations.misc") \
Register(SPECTRE_STRING_MITIGATIONS, "spectre.string-mitigations") \
Register(SPECTRE_VALUE_MASKING, "spectre.value-masking") \
Register(SPECTRE_JIT_TO_CXX_CALLS, "spectre.jit-to-C++-calls") \
Register(WASM_FOLD_OFFSETS, "wasm.fold-offsets") \
Register(WASM_DELAY_TIER2, "wasm.delay-tier2")
typedef enum JSJitCompilerOption {
#define JIT_COMPILER_DECLARE(key, str) JSJITCOMPILER_##key,
JIT_COMPILER_OPTIONS(JIT_COMPILER_DECLARE)
#undef JIT_COMPILER_DECLARE
JSJITCOMPILER_NOT_AN_OPTION
} JSJitCompilerOption;
extern JS_PUBLIC_API void JS_SetGlobalJitCompilerOption(JSContext* cx,
JSJitCompilerOption opt,
uint32_t value);
extern JS_PUBLIC_API bool JS_GetGlobalJitCompilerOption(JSContext* cx,
JSJitCompilerOption opt,
uint32_t* valueOut);
extern JS_PUBLIC_API bool JS_IndexToId(JSContext* cx, uint32_t index,
JS::MutableHandleId);
extern JS_PUBLIC_API bool JS_CharsToId(JSContext* cx, JS::TwoByteChars chars,
JS::MutableHandleId);
extern JS_PUBLIC_API bool JS_IsIdentifier(JSContext* cx, JS::HandleString str,
bool* isIdentifier);
extern JS_PUBLIC_API bool JS_IsIdentifier(const char16_t* chars, size_t length);
namespace js {
class ScriptSource;
}
namespace JS {
class MOZ_RAII JS_PUBLIC_API AutoFilename {
private:
js::ScriptSource* ss_;
mozilla::Variant<const char*, UniqueChars> filename_;
AutoFilename(const AutoFilename&) = delete;
AutoFilename& operator=(const AutoFilename&) = delete;
public:
AutoFilename()
: ss_(nullptr), filename_(mozilla::AsVariant<const char*>(nullptr)) {}
~AutoFilename() { reset(); }
void reset();
void setOwned(UniqueChars&& filename);
void setUnowned(const char* filename);
void setScriptSource(js::ScriptSource* ss);
const char* get() const;
};
extern JS_PUBLIC_API bool DescribeScriptedCaller(
JSContext* cx, AutoFilename* filename = nullptr, unsigned* lineno = nullptr,
unsigned* column = nullptr);
extern JS_PUBLIC_API JSObject* GetScriptedCallerGlobal(JSContext* cx);
extern JS_PUBLIC_API void HideScriptedCaller(JSContext* cx);
extern JS_PUBLIC_API void UnhideScriptedCaller(JSContext* cx);
class MOZ_RAII AutoHideScriptedCaller {
public:
explicit AutoHideScriptedCaller(JSContext* cx MOZ_GUARD_OBJECT_NOTIFIER_PARAM)
: mContext(cx) {
MOZ_GUARD_OBJECT_NOTIFIER_INIT;
HideScriptedCaller(mContext);
}
~AutoHideScriptedCaller() { UnhideScriptedCaller(mContext); }
protected:
JSContext* mContext;
MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
};
}
namespace js {
enum class StackFormat { SpiderMonkey, V8, Default };
extern JS_PUBLIC_API void SetStackFormat(JSContext* cx, StackFormat format);
extern JS_PUBLIC_API StackFormat GetStackFormat(JSContext* cx);
}
namespace JS {
struct WasmModule : js::AtomicRefCounted<WasmModule> {
virtual ~WasmModule() {}
virtual JSObject* createObject(JSContext* cx) = 0;
};
extern JS_PUBLIC_API bool IsWasmModuleObject(HandleObject obj);
extern JS_PUBLIC_API RefPtr<WasmModule> GetWasmModule(HandleObject obj);
extern JS_PUBLIC_API RefPtr<WasmModule> DeserializeWasmModule(
PRFileDesc* bytecode, JS::UniqueChars filename, unsigned line);
class MOZ_STACK_CLASS JS_PUBLIC_API ForOfIterator {
protected:
JSContext* cx_;
JS::RootedObject iterator;
JS::RootedValue nextMethod;
uint32_t index;
static const uint32_t NOT_ARRAY = UINT32_MAX;
ForOfIterator(const ForOfIterator&) = delete;
ForOfIterator& operator=(const ForOfIterator&) = delete;
public:
explicit ForOfIterator(JSContext* cx)
: cx_(cx), iterator(cx_), nextMethod(cx), index(NOT_ARRAY) {}
enum NonIterableBehavior { ThrowOnNonIterable, AllowNonIterable };
bool init(JS::HandleValue iterable,
NonIterableBehavior nonIterableBehavior = ThrowOnNonIterable);
bool next(JS::MutableHandleValue val, bool* done);
void closeThrow();
bool valueIsIterable() const { return iterator; }
private:
inline bool nextFromOptimizedArray(MutableHandleValue val, bool* done);
};
typedef void (*LargeAllocationFailureCallback)();
extern JS_PUBLIC_API void SetProcessLargeAllocationFailureCallback(
LargeAllocationFailureCallback afc);
typedef void (*OutOfMemoryCallback)(JSContext* cx, void* data);
extern JS_PUBLIC_API void SetOutOfMemoryCallback(JSContext* cx,
OutOfMemoryCallback cb,
void* data);
struct AllFrames {};
struct MaxFrames {
uint32_t maxFrames;
explicit MaxFrames(uint32_t max) : maxFrames(max) { MOZ_ASSERT(max > 0); }
};
struct JS_PUBLIC_API FirstSubsumedFrame {
JSContext* cx;
JSPrincipals* principals;
bool ignoreSelfHosted;
explicit FirstSubsumedFrame(JSContext* cx,
bool ignoreSelfHostedFrames = true);
explicit FirstSubsumedFrame(JSContext* ctx, JSPrincipals* p,
bool ignoreSelfHostedFrames = true)
: cx(ctx), principals(p), ignoreSelfHosted(ignoreSelfHostedFrames) {
if (principals) {
JS_HoldPrincipals(principals);
}
}
FirstSubsumedFrame(const FirstSubsumedFrame&) = delete;
FirstSubsumedFrame& operator=(const FirstSubsumedFrame&) = delete;
FirstSubsumedFrame(FirstSubsumedFrame&& rhs)
: principals(rhs.principals), ignoreSelfHosted(rhs.ignoreSelfHosted) {
MOZ_ASSERT(this != &rhs, "self move disallowed");
rhs.principals = nullptr;
}
FirstSubsumedFrame& operator=(FirstSubsumedFrame&& rhs) {
new (this) FirstSubsumedFrame(std::move(rhs));
return *this;
}
~FirstSubsumedFrame() {
if (principals) {
JS_DropPrincipals(cx, principals);
}
}
};
using StackCapture = mozilla::Variant<AllFrames, MaxFrames, FirstSubsumedFrame>;
extern JS_PUBLIC_API bool CaptureCurrentStack(
JSContext* cx, MutableHandleObject stackp,
StackCapture&& capture = StackCapture(AllFrames()));
extern JS_PUBLIC_API bool CopyAsyncStack(
JSContext* cx, HandleObject asyncStack, HandleString asyncCause,
MutableHandleObject stackp, const mozilla::Maybe<size_t>& maxFrameCount);
extern JS_PUBLIC_API bool BuildStackString(
JSContext* cx, JSPrincipals* principals, HandleObject stack,
MutableHandleString stringp, size_t indent = 0,
js::StackFormat stackFormat = js::StackFormat::Default);
extern JS_PUBLIC_API bool IsMaybeWrappedSavedFrame(JSObject* obj);
extern JS_PUBLIC_API bool IsUnwrappedSavedFrame(JSObject* obj);
}
namespace js {
extern JS_PUBLIC_API void NoteIntentionalCrash();
}
namespace js {
enum class CompletionKind { Normal, Return, Throw };
}
#endif