JavascriptGenerator.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  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. enum class ResumeYieldKind
  9. {
  10. Normal = 0,
  11. Throw = 1,
  12. Return = 2
  13. };
  14. class JavascriptGenerator : public DynamicObject
  15. {
  16. public:
  17. enum class GeneratorState
  18. {
  19. SuspendedStart,
  20. Suspended,
  21. Executing,
  22. Completed
  23. };
  24. static uint32 GetFrameOffset()
  25. {
  26. return offsetof(JavascriptGenerator, frame);
  27. }
  28. static uint32 GetCallInfoOffset()
  29. {
  30. return offsetof(JavascriptGenerator, args) + Arguments::GetCallInfoOffset();
  31. }
  32. static uint32 GetArgsPtrOffset()
  33. {
  34. return offsetof(JavascriptGenerator, args) + Arguments::GetValuesOffset();
  35. }
  36. void SetState(GeneratorState state)
  37. {
  38. this->state = state;
  39. if (state == GeneratorState::Completed)
  40. {
  41. frame = nullptr;
  42. args.Values = nullptr;
  43. scriptFunction = nullptr;
  44. }
  45. }
  46. void ThrowIfExecuting(const char16* apiName);
  47. Var CallGenerator(Var data, ResumeYieldKind resumeKind);
  48. private:
  49. Field(InterpreterStackFrame*) frame;
  50. Field(GeneratorState) state;
  51. Field(Arguments) args;
  52. Field(ScriptFunction*) scriptFunction;
  53. Field(DynamicObject*) resumeYieldObject;
  54. void SetResumeYieldProperties(Var value, ResumeYieldKind kind);
  55. protected:
  56. DEFINE_VTABLE_CTOR_MEMBER_INIT(JavascriptGenerator, DynamicObject, args);
  57. DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(JavascriptGenerator);
  58. JavascriptGenerator(DynamicType* type, Arguments& args, ScriptFunction* scriptFunction);
  59. public:
  60. static JavascriptGenerator* New(
  61. Recycler* recycler,
  62. DynamicType* generatorType,
  63. Arguments& args,
  64. ScriptFunction* scriptFunction);
  65. bool IsSuspendedStart() const { return this->state == GeneratorState::SuspendedStart; }
  66. bool IsExecuting() const { return this->state == GeneratorState::Executing; }
  67. bool IsSuspended() const { return this->state == GeneratorState::Suspended; }
  68. bool IsCompleted() const { return this->state == GeneratorState::Completed; }
  69. bool IsAsyncModule() const;
  70. void SetSuspendedStart()
  71. {
  72. Assert(
  73. this->state == GeneratorState::SuspendedStart ||
  74. this->state == GeneratorState::Suspended);
  75. this->state = GeneratorState::SuspendedStart;
  76. }
  77. void SetCompleted()
  78. {
  79. Assert(this->state != GeneratorState::Executing);
  80. this->SetState(GeneratorState::Completed);
  81. }
  82. InterpreterStackFrame* GetFrame() const { return frame; }
  83. const Arguments& GetArguments() const { return args; }
  84. void SetScriptFunction(ScriptFunction* sf) { this->scriptFunction = sf; }
  85. void SetFrame(InterpreterStackFrame* frame, size_t bytes);
  86. void SetFrameSlots(uint slotCount, Field(Var)* frameSlotArray);
  87. #if GLOBAL_ENABLE_WRITE_BARRIER
  88. virtual void Finalize(bool isShutdown) override;
  89. #endif
  90. class EntryInfo
  91. {
  92. public:
  93. static FunctionInfo Next;
  94. static FunctionInfo Return;
  95. static FunctionInfo Throw;
  96. };
  97. static Var EntryNext(RecyclableObject* function, CallInfo callInfo, ...);
  98. static Var EntryReturn(RecyclableObject* function, CallInfo callInfo, ...);
  99. static Var EntryThrow(RecyclableObject* function, CallInfo callInfo, ...);
  100. #if ENABLE_TTD
  101. static JavascriptGenerator* New(
  102. Recycler* recycler,
  103. DynamicType* generatorType,
  104. Arguments &args,
  105. Js::JavascriptGenerator::GeneratorState generatorState);
  106. virtual void MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor) override;
  107. virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override;
  108. virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override;
  109. // virtual void ProcessCorePaths() override;
  110. #endif
  111. #ifdef ENABLE_DEBUG_CONFIG_OPTIONS
  112. public:
  113. struct BailInSymbol {
  114. uint32 id;
  115. Var value;
  116. static uint32 GetBailInSymbolIdOffset() { return offsetof(BailInSymbol, id); }
  117. static uint32 GetBailInSymbolValueOffset() { return offsetof(BailInSymbol, value); }
  118. };
  119. Field(BailInSymbol*) bailInSymbolsTraceArray = nullptr;
  120. Field(int) bailInSymbolsTraceArrayCount = 0;
  121. static uint32 GetBailInSymbolsTraceArrayOffset()
  122. {
  123. return offsetof(JavascriptGenerator, bailInSymbolsTraceArray);
  124. }
  125. static uint32 GetBailInSymbolsTraceArrayCountOffset()
  126. {
  127. return offsetof(JavascriptGenerator, bailInSymbolsTraceArrayCount);
  128. }
  129. static void OutputBailInTrace(JavascriptGenerator* generator);
  130. #endif
  131. };
  132. template<>
  133. bool VarIsImpl<JavascriptGenerator>(RecyclableObject* obj);
  134. }