text: //-------------------------------------------------------------------------------------------------------
  // 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
  
  #include "JsrtRuntime.h"
  
  class JsrtContext : public FinalizableObject
  {
  public:
      static JsrtContext *New(JsrtRuntime * runtime);
  
      Js::ScriptContext * GetScriptContext() const { return this->javascriptLibrary->scriptContext; }
      Js::JavascriptLibrary* GetJavascriptLibrary() const { return this->javascriptLibrary; }
      JsrtRuntime * GetRuntime() const { return this->runtime; }
      void* GetExternalData() const { return this->externalData; }
      void SetExternalData(void * data) { this->externalData = data; }
  
      static JsrtContext * GetCurrent();
      static bool TrySetCurrent(JsrtContext * context);
      static bool Is(void * ref);
  
      virtual void Mark(Recycler * recycler) override sealed;
  
  #if ENABLE_TTD
      void OnScriptLoad_TTDCallback(Js::FunctionBody* body, Js::Utf8SourceInfo* utf8SourceInfo, CompileScriptException* compileException, bool notify);
      static void OnReplayDisposeContext_TTDCallback(FinalizableObject* jsrtCtx);
  #endif
      void OnScriptLoad(Js::JavascriptFunction * scriptFunction, Js::Utf8SourceInfo* utf8SourceInfo, CompileScriptException* compileException);
  protected:
      DEFINE_VTABLE_CTOR_NOBASE(JsrtContext);
      JsrtContext(JsrtRuntime * runtime);
      void Link();
      void Unlink();
      void SetJavascriptLibrary(Js::JavascriptLibrary * library);
  private:
      Field(Js::JavascriptLibrary *) javascriptLibrary;
  
      Field(JsrtRuntime *) runtime;
      Field(void*) externalData = nullptr;
      Field(TaggedPointer<JsrtContext>) previous;
      Field(TaggedPointer<JsrtContext>) next;
  };
  
  