JavascriptAsyncFunction.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. #pragma once
  6. namespace Js
  7. {
  8. class JavascriptAsyncFunction : public JavascriptGeneratorFunction
  9. {
  10. private:
  11. static FunctionInfo functionInfo;
  12. DEFINE_VTABLE_CTOR(JavascriptAsyncFunction, JavascriptGeneratorFunction);
  13. DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(JavascriptAsyncFunction);
  14. protected:
  15. JavascriptAsyncFunction(DynamicType* type);
  16. public:
  17. JavascriptAsyncFunction(DynamicType* type, GeneratorVirtualScriptFunction* scriptFunction);
  18. static JavascriptAsyncFunction* New(
  19. ScriptContext* scriptContext,
  20. GeneratorVirtualScriptFunction* scriptFunction);
  21. static Var EntryAsyncFunctionImplementation(
  22. RecyclableObject* function,
  23. CallInfo callInfo, ...);
  24. static JavascriptPromise* BeginAsyncFunctionExecution(
  25. JavascriptGenerator* generator);
  26. static Var EntryAsyncSpawnExecutorFunction(
  27. RecyclableObject* function,
  28. CallInfo callInfo, ...);
  29. static Var EntryAsyncSpawnStepNextFunction(
  30. RecyclableObject* function,
  31. CallInfo callInfo, ...);
  32. static Var EntryAsyncSpawnStepThrowFunction(
  33. RecyclableObject* function,
  34. CallInfo callInfo, ...);
  35. static Var EntryAsyncSpawnCallStepFunction(
  36. RecyclableObject* function,
  37. CallInfo callInfo, ...);
  38. static bool Test(JavascriptFunction *obj)
  39. {
  40. return
  41. VirtualTableInfo<JavascriptAsyncFunction>::HasVirtualTable(obj) ||
  42. VirtualTableInfo<CrossSiteObject<JavascriptAsyncFunction>>::HasVirtualTable(obj);
  43. }
  44. #if ENABLE_TTD
  45. virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override;
  46. virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override;
  47. #endif
  48. virtual VTableValue DummyVirtualFunctionToHinderLinkerICF()
  49. {
  50. return VTableValue::VtableJavascriptAsyncFunction;
  51. }
  52. private:
  53. static void AsyncSpawnStep(
  54. JavascriptAsyncSpawnStepFunction* nextFunction,
  55. JavascriptGenerator* generator,
  56. Var resolve,
  57. Var reject);
  58. };
  59. template<>
  60. bool VarIsImpl<JavascriptAsyncFunction>(RecyclableObject* obj);
  61. class JavascriptAsyncSpawnStepFunction : public RuntimeFunction
  62. {
  63. protected:
  64. DEFINE_VTABLE_CTOR(JavascriptAsyncSpawnStepFunction, RuntimeFunction);
  65. DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(JavascriptAsyncSpawnStepFunction);
  66. public:
  67. JavascriptAsyncSpawnStepFunction(
  68. DynamicType* type,
  69. FunctionInfo* functionInfo,
  70. JavascriptGenerator* generator,
  71. Var argument,
  72. Var resolve = nullptr,
  73. Var reject = nullptr,
  74. bool isReject = false) :
  75. RuntimeFunction(type, functionInfo),
  76. generator(generator),
  77. argument(argument),
  78. resolve(resolve),
  79. reject(reject),
  80. isReject(isReject) {}
  81. Field(JavascriptGenerator*) generator;
  82. Field(Var) reject;
  83. Field(Var) resolve;
  84. Field(bool) isReject;
  85. Field(Var) argument;
  86. #if ENABLE_TTD
  87. virtual void MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor) override;
  88. virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override;
  89. virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override;
  90. #endif
  91. };
  92. template<>
  93. bool VarIsImpl<JavascriptAsyncSpawnStepFunction>(RecyclableObject* obj);
  94. }