blob: 9e6f7fc281f18603a7ad1c9eaa397f15aa469dd2 [file]
//-------------------------------------------------------------------------------------------------------
// 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
{
class JavascriptAsyncFunction : public JavascriptGeneratorFunction
{
private:
static FunctionInfo functionInfo;
DEFINE_VTABLE_CTOR(JavascriptAsyncFunction, JavascriptGeneratorFunction);
DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(JavascriptAsyncFunction);
protected:
JavascriptAsyncFunction(DynamicType* type);
public:
JavascriptAsyncFunction(DynamicType* type, GeneratorVirtualScriptFunction* scriptFunction);
static JavascriptAsyncFunction* New(
ScriptContext* scriptContext,
GeneratorVirtualScriptFunction* scriptFunction);
static Var EntryAsyncFunctionImplementation(
RecyclableObject* function,
CallInfo callInfo, ...);
static JavascriptPromise* BeginAsyncFunctionExecution(
JavascriptGenerator* generator);
static Var EntryAsyncSpawnExecutorFunction(
RecyclableObject* function,
CallInfo callInfo, ...);
static Var EntryAsyncSpawnStepNextFunction(
RecyclableObject* function,
CallInfo callInfo, ...);
static Var EntryAsyncSpawnStepThrowFunction(
RecyclableObject* function,
CallInfo callInfo, ...);
static Var EntryAsyncSpawnCallStepFunction(
RecyclableObject* function,
CallInfo callInfo, ...);
static bool Test(JavascriptFunction *obj)
{
return
VirtualTableInfo<JavascriptAsyncFunction>::HasVirtualTable(obj) ||
VirtualTableInfo<CrossSiteObject<JavascriptAsyncFunction>>::HasVirtualTable(obj);
}
#if ENABLE_TTD
virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override;
virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override;
#endif
virtual VTableValue DummyVirtualFunctionToHinderLinkerICF()
{
return VTableValue::VtableJavascriptAsyncFunction;
}
private:
static void AsyncSpawnStep(
JavascriptAsyncSpawnStepFunction* nextFunction,
JavascriptGenerator* generator,
Var resolve,
Var reject);
};
template<>
bool VarIsImpl<JavascriptAsyncFunction>(RecyclableObject* obj);
class JavascriptAsyncSpawnStepFunction : public RuntimeFunction
{
protected:
DEFINE_VTABLE_CTOR(JavascriptAsyncSpawnStepFunction, RuntimeFunction);
DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(JavascriptAsyncSpawnStepFunction);
public:
JavascriptAsyncSpawnStepFunction(
DynamicType* type,
FunctionInfo* functionInfo,
JavascriptGenerator* generator,
Var argument,
Var resolve = nullptr,
Var reject = nullptr,
bool isReject = false) :
RuntimeFunction(type, functionInfo),
generator(generator),
argument(argument),
resolve(resolve),
reject(reject),
isReject(isReject) {}
Field(JavascriptGenerator*) generator;
Field(Var) reject;
Field(Var) resolve;
Field(bool) isReject;
Field(Var) argument;
#if ENABLE_TTD
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
};
template<>
bool VarIsImpl<JavascriptAsyncSpawnStepFunction>(RecyclableObject* obj);
}