JavascriptGenerator.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. // Helper struct used to communicate to a yield point whether it was resumed via next(), return(), or throw()
  9. // and provide the data necessary for the corresponding action taken (see OP_ResumeYield)
  10. struct ResumeYieldData
  11. {
  12. Var data;
  13. JavascriptExceptionObject* exceptionObj;
  14. ResumeYieldData(Var data, JavascriptExceptionObject* exceptionObj) : data(data), exceptionObj(exceptionObj) { }
  15. };
  16. class JavascriptGenerator : public DynamicObject
  17. {
  18. public:
  19. enum class GeneratorState
  20. {
  21. Suspended,
  22. Executing,
  23. Completed
  24. };
  25. static uint32 GetFrameOffset() { return offsetof(JavascriptGenerator, frame); }
  26. static uint32 GetCallInfoOffset() { return offsetof(JavascriptGenerator, args) + Arguments::GetCallInfoOffset(); }
  27. static uint32 GetArgsPtrOffset() { return offsetof(JavascriptGenerator, args) + Arguments::GetValuesOffset(); }
  28. void SetState(GeneratorState state) {
  29. this->state = state;
  30. if(state == GeneratorState::Completed)
  31. {
  32. frame = nullptr;
  33. args.Values = nullptr;
  34. scriptFunction = nullptr;
  35. }
  36. }
  37. private:
  38. Field(InterpreterStackFrame*) frame;
  39. Field(GeneratorState) state;
  40. Field(Arguments) args;
  41. Field(ScriptFunction*) scriptFunction;
  42. DEFINE_VTABLE_CTOR_MEMBER_INIT(JavascriptGenerator, DynamicObject, args);
  43. DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(JavascriptGenerator);
  44. Var CallGenerator(ResumeYieldData* yieldData, const char16* apiNameForErrorMessage);
  45. JavascriptGenerator(DynamicType* type, Arguments& args, ScriptFunction* scriptFunction);
  46. public:
  47. static JavascriptGenerator* New(Recycler* recycler, DynamicType* generatorType, Arguments& args, ScriptFunction* scriptFunction);
  48. static JavascriptGenerator *New(Recycler *recycler, DynamicType *generatorType, Arguments &args, Js::JavascriptGenerator::GeneratorState generatorState);
  49. bool IsExecuting() const { return state == GeneratorState::Executing; }
  50. bool IsSuspended() const { return state == GeneratorState::Suspended; }
  51. bool IsCompleted() const { return state == GeneratorState::Completed; }
  52. bool IsSuspendedStart() const { return state == GeneratorState::Suspended && this->frame == nullptr; }
  53. void SetScriptFunction(ScriptFunction* sf)
  54. {
  55. this->scriptFunction = sf;
  56. }
  57. void SetFrame(InterpreterStackFrame* frame, size_t bytes);
  58. InterpreterStackFrame* GetFrame() const { return frame; }
  59. void SetFrameSlots(uint slotCount, Field(Var)* frameSlotArray);
  60. #if GLOBAL_ENABLE_WRITE_BARRIER
  61. virtual void Finalize(bool isShutdown) override;
  62. #endif
  63. const Arguments& GetArguments() const { return args; }
  64. static bool Is(Var var);
  65. static JavascriptGenerator* FromVar(Var var);
  66. static JavascriptGenerator* UnsafeFromVar(Var var);
  67. class EntryInfo
  68. {
  69. public:
  70. static FunctionInfo Next;
  71. static FunctionInfo Return;
  72. static FunctionInfo Throw;
  73. };
  74. static Var EntryNext(RecyclableObject* function, CallInfo callInfo, ...);
  75. static Var EntryReturn(RecyclableObject* function, CallInfo callInfo, ...);
  76. static Var EntryThrow(RecyclableObject* function, CallInfo callInfo, ...);
  77. #if ENABLE_TTD
  78. virtual void MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor) override;
  79. virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override;
  80. virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override;
  81. //virtual void ProcessCorePaths() override;
  82. #endif
  83. };
  84. }