| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492 |
- //-------------------------------------------------------------------------------------------------------
- // Copyright (C) Microsoft. All rights reserved.
- // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- //-------------------------------------------------------------------------------------------------------
- #pragma once
- namespace Js
- {
- struct JavascriptPromiseResolveOrRejectFunctionAlreadyResolvedWrapper
- {
- Field(bool) alreadyResolved;
- };
- class JavascriptPromiseResolveOrRejectFunction : public RuntimeFunction
- {
- protected:
- DEFINE_VTABLE_CTOR(JavascriptPromiseResolveOrRejectFunction, RuntimeFunction);
- DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(JavascriptPromiseResolveOrRejectFunction);
- public:
- JavascriptPromiseResolveOrRejectFunction(DynamicType* type);
- JavascriptPromiseResolveOrRejectFunction(DynamicType* type, FunctionInfo* functionInfo, JavascriptPromise* promise, bool isReject, JavascriptPromiseResolveOrRejectFunctionAlreadyResolvedWrapper* alreadyResolvedRecord);
- inline static bool Is(Var var);
- inline static JavascriptPromiseResolveOrRejectFunction* FromVar(Var var);
- inline static JavascriptPromiseResolveOrRejectFunction* UnsafeFromVar(Var var);
- JavascriptPromise* GetPromise();
- bool IsRejectFunction();
- bool IsAlreadyResolved();
- void SetAlreadyResolved(bool is);
- private:
- Field(JavascriptPromise*) promise;
- Field(bool) isReject;
- Field(JavascriptPromiseResolveOrRejectFunctionAlreadyResolvedWrapper*) alreadyResolvedWrapper;
- #if ENABLE_TTD
- public:
- virtual void MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor) override;
- virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override;
- virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override;
- #endif
- };
- class JavascriptPromiseAsyncSpawnExecutorFunction : public RuntimeFunction
- {
- protected:
- DEFINE_VTABLE_CTOR(JavascriptPromiseAsyncSpawnExecutorFunction, RuntimeFunction);
- DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(JavascriptPromiseAsyncSpawnExecutorFunction);
- public:
- JavascriptPromiseAsyncSpawnExecutorFunction(DynamicType* type, FunctionInfo* functionInfo, JavascriptGenerator* generator, Var target);
- inline static bool Is(Var var);
- inline static JavascriptPromiseAsyncSpawnExecutorFunction* FromVar(Var var);
- inline static JavascriptPromiseAsyncSpawnExecutorFunction* UnsafeFromVar(Var var);
- JavascriptGenerator* GetGenerator();
- Var GetTarget();
- private:
- Field(JavascriptGenerator*) generator;
- Field(Var) target; // this
- #if ENABLE_TTD
- public:
- virtual void MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor) override;
- virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override;
- virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override;
- #endif
- };
- class JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction : public RuntimeFunction
- {
- protected:
- DEFINE_VTABLE_CTOR(JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction, RuntimeFunction);
- DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction);
- public:
- JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction(DynamicType* type, FunctionInfo* functionInfo, JavascriptGenerator* generator, Var argument, Var resolve = nullptr, Var reject = nullptr, bool isReject = false);
- inline static bool Is(Var var);
- inline static JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction* FromVar(Var var);
- inline static JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction* UnsafeFromVar(Var var);
- JavascriptGenerator* GetGenerator();
- Var GetReject();
- Var GetResolve();
- bool GetIsReject();
- Var GetArgument();
- private:
- Field(JavascriptGenerator*) generator;
- Field(Var) reject;
- Field(Var) resolve;
- Field(bool) isReject;
- Field(Var) argument;
- #if ENABLE_TTD
- public:
- virtual void MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor) override;
- virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override;
- virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override;
- #endif
- };
- class JavascriptPromiseCapabilitiesExecutorFunction : public RuntimeFunction
- {
- protected:
- DEFINE_VTABLE_CTOR(JavascriptPromiseCapabilitiesExecutorFunction, RuntimeFunction);
- DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(JavascriptPromiseCapabilitiesExecutorFunction);
- public:
- JavascriptPromiseCapabilitiesExecutorFunction(DynamicType* type, FunctionInfo* functionInfo, JavascriptPromiseCapability* capability);
- inline static bool Is(Var var);
- inline static JavascriptPromiseCapabilitiesExecutorFunction* FromVar(Var var);
- inline static JavascriptPromiseCapabilitiesExecutorFunction* UnsafeFromVar(Var var);
- JavascriptPromiseCapability* GetCapability();
- private:
- Field(JavascriptPromiseCapability*) capability;
- #if ENABLE_TTD
- public:
- virtual void MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor) override;
- virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override;
- virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override;
- #endif
- };
- class JavascriptPromiseResolveThenableTaskFunction : public RuntimeFunction
- {
- protected:
- DEFINE_VTABLE_CTOR(JavascriptPromiseResolveThenableTaskFunction, RuntimeFunction);
- DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(JavascriptPromiseResolveThenableTaskFunction);
- public:
- JavascriptPromiseResolveThenableTaskFunction(DynamicType* type, FunctionInfo* functionInfo, JavascriptPromise* promise, RecyclableObject* thenable, RecyclableObject* thenFunction)
- : RuntimeFunction(type, functionInfo), promise(promise), thenable(thenable), thenFunction(thenFunction)
- { }
- inline static bool Is(Var var)
- {
- if (JavascriptFunction::Is(var))
- {
- JavascriptFunction* obj = JavascriptFunction::UnsafeFromVar(var);
- return VirtualTableInfo<JavascriptPromiseResolveThenableTaskFunction>::HasVirtualTable(obj)
- || VirtualTableInfo<CrossSiteObject<JavascriptPromiseResolveThenableTaskFunction>>::HasVirtualTable(obj);
- }
- return false;
- }
- inline static JavascriptPromiseResolveThenableTaskFunction* FromVar(Var var)
- {
- AssertOrFailFast(JavascriptPromiseResolveThenableTaskFunction::Is(var));
- return static_cast<JavascriptPromiseResolveThenableTaskFunction*>(var);
- }
- JavascriptPromise* GetPromise();
- RecyclableObject* GetThenable();
- RecyclableObject* GetThenFunction();
- private:
- Field(JavascriptPromise*) promise;
- Field(RecyclableObject*) thenable;
- Field(RecyclableObject*) thenFunction;
- #if ENABLE_TTD
- public:
- virtual void MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor) override;
- virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override;
- virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override;
- #endif
- };
- class JavascriptPromiseReactionTaskFunction : public RuntimeFunction
- {
- protected:
- DEFINE_VTABLE_CTOR(JavascriptPromiseReactionTaskFunction, RuntimeFunction);
- DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(JavascriptPromiseReactionTaskFunction);
- public:
- JavascriptPromiseReactionTaskFunction(DynamicType* type, FunctionInfo* functionInfo, JavascriptPromiseReaction* reaction, Var argument)
- : RuntimeFunction(type, functionInfo), reaction(reaction), argument(argument)
- { }
- inline static bool Is(Var var)
- {
- if (JavascriptFunction::Is(var))
- {
- JavascriptFunction* obj = JavascriptFunction::UnsafeFromVar(var);
- return VirtualTableInfo<JavascriptPromiseReactionTaskFunction>::HasVirtualTable(obj)
- || VirtualTableInfo<CrossSiteObject<JavascriptPromiseReactionTaskFunction>>::HasVirtualTable(obj);
- }
- return false;
- }
- inline static JavascriptPromiseReactionTaskFunction* FromVar(Var var)
- {
- AssertOrFailFast(JavascriptPromiseReactionTaskFunction::Is(var));
- return static_cast<JavascriptPromiseReactionTaskFunction*>(var);
- }
- JavascriptPromiseReaction* GetReaction();
- Var GetArgument();
- private:
- Field(JavascriptPromiseReaction*) reaction;
- Field(Var) argument;
- #if ENABLE_TTD
- public:
- virtual void MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor) override;
- virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override;
- virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override;
- #endif
- };
- struct JavascriptPromiseAllResolveElementFunctionRemainingElementsWrapper
- {
- Field(uint32) remainingElements;
- };
- class JavascriptPromiseAllResolveElementFunction : public RuntimeFunction
- {
- protected:
- DEFINE_VTABLE_CTOR(JavascriptPromiseAllResolveElementFunction, RuntimeFunction);
- DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(JavascriptPromiseAllResolveElementFunction);
- public:
- JavascriptPromiseAllResolveElementFunction(DynamicType* type);
- JavascriptPromiseAllResolveElementFunction(DynamicType* type, FunctionInfo* functionInfo, uint32 index, JavascriptArray* values, JavascriptPromiseCapability* capabilities, JavascriptPromiseAllResolveElementFunctionRemainingElementsWrapper* remainingElementsWrapper);
- inline static bool Is(Var var);
- inline static JavascriptPromiseAllResolveElementFunction* FromVar(Var var);
- inline static JavascriptPromiseAllResolveElementFunction* UnsafeFromVar(Var var);
- JavascriptPromiseCapability* GetCapabilities();
- uint32 GetIndex();
- uint32 GetRemainingElements();
- JavascriptArray* GetValues();
- bool IsAlreadyCalled() const;
- void SetAlreadyCalled(const bool is);
- uint32 DecrementRemainingElements();
- private:
- Field(JavascriptPromiseCapability*) capabilities;
- Field(uint32) index;
- Field(JavascriptPromiseAllResolveElementFunctionRemainingElementsWrapper*) remainingElementsWrapper;
- Field(JavascriptArray*) values;
- Field(bool) alreadyCalled;
- #if ENABLE_TTD
- public:
- virtual void MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor) override;
- virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override;
- virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override;
- #endif
- };
- class JavascriptPromiseCapability : FinalizableObject
- {
- private:
- JavascriptPromiseCapability(Var promise, Var resolve, Var reject)
- : promise(promise), resolve(resolve), reject(reject)
- { }
- public:
- static JavascriptPromiseCapability* New(Var promise, Var resolve, Var reject, ScriptContext* scriptContext);
- Var GetResolve();
- Var GetReject();
- Var GetPromise();
- void SetPromise(Var);
- void SetResolve(Var resolve);
- void SetReject(Var reject);
- public:
- // Finalizable support
- virtual void Finalize(bool isShutdown)
- {
- }
- virtual void Dispose(bool isShutdown)
- {
- }
- virtual void Mark(Recycler *recycler) override
- {
- AssertMsg(false, "Mark called on object that isnt TrackableObject");
- }
- private:
- Field(Var) promise;
- Field(Var) resolve;
- Field(Var) reject;
- #if ENABLE_TTD
- public:
- //Do any additional marking that is needed for a TT snapshotable object
- void MarkVisitPtrs(TTD::SnapshotExtractor* extractor);
- //Do the extraction
- void ExtractSnapPromiseCapabilityInto(TTD::NSSnapValues::SnapPromiseCapabilityInfo* snapPromiseCapability, JsUtil::List<TTD_PTR_ID, HeapAllocator>& depOnList, TTD::SlabAllocator& alloc);
- #endif
- };
- typedef JsUtil::List<Js::JavascriptPromiseCapability*> JavascriptPromiseCapabilityList;
- class JavascriptPromiseReaction : FinalizableObject
- {
- private:
- JavascriptPromiseReaction(JavascriptPromiseCapability* capabilities, RecyclableObject* handler)
- : capabilities(capabilities), handler(handler)
- { }
- public:
- static JavascriptPromiseReaction* New(JavascriptPromiseCapability* capabilities, RecyclableObject* handler, ScriptContext* scriptContext);
- JavascriptPromiseCapability* GetCapabilities();
- RecyclableObject* GetHandler();
- public:
- // Finalizable support
- virtual void Finalize(bool isShutdown)
- {
- }
- virtual void Dispose(bool isShutdown)
- {
- }
- virtual void Mark(Recycler *recycler) override
- {
- AssertMsg(false, "Mark called on object that isnt TrackableObject");
- }
- private:
- Field(JavascriptPromiseCapability*) capabilities;
- Field(RecyclableObject*) handler;
- #if ENABLE_TTD
- public:
- //Do any additional marking that is needed for a TT snapshotable object
- void MarkVisitPtrs(TTD::SnapshotExtractor* extractor);
- //Do the extraction
- void ExtractSnapPromiseReactionInto(TTD::NSSnapValues::SnapPromiseReactionInfo* snapPromiseReaction, JsUtil::List<TTD_PTR_ID, HeapAllocator>& depOnList, TTD::SlabAllocator& alloc);
- #endif
- };
- typedef JsUtil::List<Js::JavascriptPromiseReaction*> JavascriptPromiseReactionList;
- class JavascriptPromise : public DynamicObject
- {
- private:
- DEFINE_VTABLE_CTOR(JavascriptPromise, DynamicObject);
- DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(JavascriptPromise);
- public:
- class EntryInfo
- {
- public:
- static FunctionInfo NewInstance;
- static FunctionInfo All;
- static FunctionInfo Catch;
- static FunctionInfo Race;
- static FunctionInfo Reject;
- static FunctionInfo Resolve;
- static FunctionInfo Then;
- static FunctionInfo Identity;
- static FunctionInfo Thrower;
- static FunctionInfo ResolveOrRejectFunction;
- static FunctionInfo CapabilitiesExecutorFunction;
- static FunctionInfo AllResolveElementFunction;
- static FunctionInfo GetterSymbolSpecies;
- };
- JavascriptPromise(DynamicType * type);
- static Var NewInstance(RecyclableObject* function, CallInfo callInfo, ...);
- static Var EntryAll(RecyclableObject* function, CallInfo callInfo, ...);
- static Var EntryCatch(RecyclableObject* function, CallInfo callInfo, ...);
- static Var EntryRace(RecyclableObject* function, CallInfo callInfo, ...);
- static Var EntryReject(RecyclableObject* function, CallInfo callInfo, ...);
- static Var EntryResolve(RecyclableObject* function, CallInfo callInfo, ...);
- static Var EntryThen(RecyclableObject* function, CallInfo callInfo, ...);
- static Var EntryCapabilitiesExecutorFunction(RecyclableObject* function, CallInfo callInfo, ...);
- static Var EntryResolveOrRejectFunction(RecyclableObject* function, CallInfo callInfo, ...);
- static Var EntryReactionTaskFunction(RecyclableObject* function, CallInfo callInfo, ...);
- static Var EntryResolveThenableTaskFunction(RecyclableObject* function, CallInfo callInfo, ...);
- static Var EntryIdentityFunction(RecyclableObject* function, CallInfo callInfo, ...);
- static Var EntryThrowerFunction(RecyclableObject* function, CallInfo callInfo, ...);
- static Var EntryAllResolveElementFunction(RecyclableObject* function, CallInfo callInfo, ...);
- static Var EntryGetterSymbolSpecies(RecyclableObject* function, CallInfo callInfo, ...);
- static Var EntryJavascriptPromiseAsyncSpawnExecutorFunction(RecyclableObject* function, CallInfo callInfo, ...);
- static Var EntryJavascriptPromiseAsyncSpawnStepNextExecutorFunction(RecyclableObject* function, CallInfo callInfo, ...);
- static Var EntryJavascriptPromiseAsyncSpawnStepThrowExecutorFunction(RecyclableObject* function, CallInfo callInfo, ...);
- static Var EntryJavascriptPromiseAsyncSpawnCallStepExecutorFunction(RecyclableObject* function, CallInfo callInfo, ...);
- static bool Is(Var aValue);
- static JavascriptPromise* FromVar(Js::Var aValue);
- static JavascriptPromise* UnsafeFromVar(Js::Var aValue);
- static Var CreateRejectedPromise(Var resolution, ScriptContext* scriptContext, Var promiseConstructor = nullptr);
- static Var CreateResolvedPromise(Var resolution, ScriptContext* scriptContext, Var promiseConstructor = nullptr);
- static Var CreatePassThroughPromise(JavascriptPromise* sourcePromise, ScriptContext* scriptContext);
- static Var CreateThenPromise(JavascriptPromise* sourcePromise, RecyclableObject* fulfillmentHandler, RecyclableObject* rejectionHandler, ScriptContext* scriptContext);
- virtual BOOL GetDiagValueString(StringBuilder<ArenaAllocator>* stringBuilder, ScriptContext* requestContext) override;
- virtual BOOL GetDiagTypeString(StringBuilder<ArenaAllocator>* stringBuilder, ScriptContext* requestContext) override;
- JavascriptPromiseReactionList* GetResolveReactions();
- JavascriptPromiseReactionList* GetRejectReactions();
- static JavascriptPromiseCapability* NewPromiseCapability(Var constructor, ScriptContext* scriptContext);
- static JavascriptPromiseCapability* CreatePromiseCapabilityRecord(RecyclableObject* constructor, ScriptContext* scriptContext);
- static Var TriggerPromiseReactions(JavascriptPromiseReactionList* reactions, Var resolution, ScriptContext* scriptContext);
- static void EnqueuePromiseReactionTask(JavascriptPromiseReaction* reaction, Var resolution, ScriptContext* scriptContext);
- static void InitializePromise(JavascriptPromise* promise, JavascriptPromiseResolveOrRejectFunction** resolve, JavascriptPromiseResolveOrRejectFunction** reject, ScriptContext* scriptContext);
- static Var TryCallResolveOrRejectHandler(Var handler, Var value, ScriptContext* scriptContext);
- static Var TryRejectWithExceptionObject(JavascriptExceptionObject* exceptionObject, Var handler, ScriptContext* scriptContext);
- static JavascriptPromise* CreateEnginePromise(ScriptContext *scriptContext);
- Var Resolve(Var resolution, ScriptContext* scriptContext);
- Var Reject(Var resolution, ScriptContext* scriptContext);
- enum PromiseStatus
- {
- PromiseStatusCode_Undefined,
- PromiseStatusCode_Unresolved,
- PromiseStatusCode_HasResolution,
- PromiseStatusCode_HasRejection
- };
- bool GetIsHandled() { return isHandled; }
- void SetIsHandled() { isHandled = true; }
- PromiseStatus GetStatus() const { return status; }
- Var GetResult() const { return result; }
- protected:
- Var ResolveHelper(Var resolution, bool isRejecting, ScriptContext* scriptContext);
- protected:
- Field(PromiseStatus) status;
- Field(bool) isHandled;
- Field(Var) result;
- Field(JavascriptPromiseReactionList*) resolveReactions;
- Field(JavascriptPromiseReactionList*) rejectReactions;
- private :
- static void AsyncSpawnStep(JavascriptPromiseAsyncSpawnStepArgumentExecutorFunction* nextFunction, JavascriptGenerator* gen, Var resolve, Var reject);
- #if ENABLE_TTD
- public:
- virtual void MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor) override;
- virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override;
- virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override;
- static JavascriptPromise* InitializePromise_TTD(ScriptContext* scriptContext, uint32 status, Var result, JsUtil::List<Js::JavascriptPromiseReaction*, HeapAllocator>& resolveReactions, JsUtil::List<Js::JavascriptPromiseReaction*, HeapAllocator>& rejectReactions);
- #endif
- };
- }
|