JsrtDebuggerObject.h 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  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. class JsrtDebugManager;
  7. class JsrtDebuggerObjectsManager;
  8. // Type of objects we give to debugger
  9. enum class JsrtDebuggerObjectType
  10. {
  11. Function,
  12. Globals,
  13. Property,
  14. Scope
  15. };
  16. // Base class representing a debugger object
  17. class JsrtDebuggerObjectBase
  18. {
  19. public:
  20. JsrtDebuggerObjectBase(JsrtDebuggerObjectType type, JsrtDebuggerObjectsManager* debuggerObjectsManager);
  21. virtual ~JsrtDebuggerObjectBase();
  22. JsrtDebuggerObjectType GetType() { return type; }
  23. uint GetHandle() const { return handle; }
  24. JsrtDebuggerObjectsManager* GetDebuggerObjectsManager();
  25. virtual Js::DynamicObject* GetJSONObject(Js::ScriptContext* scriptContext, bool forceSetValueProp) = 0;
  26. virtual Js::DynamicObject* GetChildren(Js::ScriptContext* scriptContext, uint fromCount, uint totalCount);
  27. template<class JsrtDebuggerObjectType, class PostFunction>
  28. static void CreateDebuggerObject(JsrtDebuggerObjectsManager* debuggerObjectsManager, Js::ResolvedObject resolvedObject, Js::ScriptContext* scriptContext, bool forceSetValueProp, PostFunction postFunction)
  29. {
  30. AutoPtr<WeakArenaReference<Js::IDiagObjectModelDisplay>> objectDisplayWeakRef(resolvedObject.GetObjectDisplay());
  31. Js::IDiagObjectModelDisplay* objectDisplay = objectDisplayWeakRef->GetStrongReference();
  32. if (objectDisplay != nullptr)
  33. {
  34. JsrtDebuggerObjectBase* debuggerObject = JsrtDebuggerObjectType::Make(debuggerObjectsManager, objectDisplayWeakRef);
  35. Js::DynamicObject* object = debuggerObject->GetJSONObject(resolvedObject.scriptContext, forceSetValueProp);
  36. Assert(object != nullptr);
  37. Js::Var marshaledObj = Js::CrossSite::MarshalVar(scriptContext, object);
  38. postFunction(marshaledObj);
  39. objectDisplayWeakRef.Detach();
  40. }
  41. }
  42. protected:
  43. Js::DynamicObject* GetChildren(WeakArenaReference<Js::IDiagObjectModelWalkerBase>* walkerRef, Js::ScriptContext * scriptContext, uint fromCount, uint totalCount);
  44. private:
  45. JsrtDebuggerObjectType type;
  46. uint handle;
  47. JsrtDebuggerObjectsManager* debuggerObjectsManager;
  48. };
  49. class JsrtDebuggerObjectFunction : public JsrtDebuggerObjectBase
  50. {
  51. public:
  52. static JsrtDebuggerObjectBase* Make(JsrtDebuggerObjectsManager* debuggerObjectsManager, Js::JavascriptFunction* javascriptFunction);
  53. Js::DynamicObject* GetJSONObject(Js::ScriptContext* scriptContext, bool forceSetValueProp);
  54. Js::DynamicObject* GetChildren(Js::ScriptContext* scriptContext, uint fromCount, uint totalCount);
  55. private:
  56. JsrtDebuggerObjectFunction(JsrtDebuggerObjectsManager* debuggerObjectsManager, Js::JavascriptFunction* javascriptFunction);
  57. ~JsrtDebuggerObjectFunction();
  58. Js::JavascriptFunction* javascriptFunction;
  59. WeakArenaReference<Js::IDiagObjectModelDisplay>* objectDisplay;
  60. WeakArenaReference<Js::IDiagObjectModelWalkerBase>* walkerRef;
  61. };
  62. class JsrtDebuggerObjectProperty : public JsrtDebuggerObjectBase
  63. {
  64. public:
  65. static JsrtDebuggerObjectBase* Make(JsrtDebuggerObjectsManager* debuggerObjectsManager, WeakArenaReference<Js::IDiagObjectModelDisplay>* objectDisplay);
  66. Js::DynamicObject* GetJSONObject(Js::ScriptContext* scriptContext, bool forceSetValueProp);
  67. Js::DynamicObject* GetChildren(Js::ScriptContext* scriptContext, uint fromCount, uint totalCount);
  68. private:
  69. JsrtDebuggerObjectProperty(JsrtDebuggerObjectsManager* debuggerObjectsManager, WeakArenaReference<Js::IDiagObjectModelDisplay>* objectDisplay);
  70. ~JsrtDebuggerObjectProperty();
  71. WeakArenaReference<Js::IDiagObjectModelDisplay>* objectDisplay;
  72. WeakArenaReference<Js::IDiagObjectModelWalkerBase>* walkerRef;
  73. };
  74. class JsrtDebuggerObjectGlobalsNode : public JsrtDebuggerObjectBase
  75. {
  76. public:
  77. static JsrtDebuggerObjectBase* Make(JsrtDebuggerObjectsManager* debuggerObjectsManager, WeakArenaReference<Js::IDiagObjectModelDisplay>* objectDisplay);
  78. Js::DynamicObject* GetJSONObject(Js::ScriptContext* scriptContext, bool forceSetValueProp);
  79. Js::DynamicObject* GetChildren(Js::ScriptContext* scriptContext, uint fromCount, uint totalCount);
  80. private:
  81. JsrtDebuggerObjectGlobalsNode(JsrtDebuggerObjectsManager* debuggerObjectsManager, WeakArenaReference<Js::IDiagObjectModelDisplay>* objectDisplay);
  82. ~JsrtDebuggerObjectGlobalsNode();
  83. WeakArenaReference<Js::IDiagObjectModelDisplay>* objectDisplay;
  84. WeakArenaReference<Js::IDiagObjectModelWalkerBase>* walkerRef;
  85. };
  86. class JsrtDebuggerObjectScope : public JsrtDebuggerObjectBase
  87. {
  88. public:
  89. static JsrtDebuggerObjectBase* Make(JsrtDebuggerObjectsManager* debuggerObjectsManager, WeakArenaReference<Js::IDiagObjectModelDisplay>* objectDisplay, uint index);
  90. Js::DynamicObject* GetJSONObject(Js::ScriptContext* scriptContext, bool forceSetValueProp);
  91. Js::DynamicObject* GetChildren(Js::ScriptContext* scriptContext, uint fromCount, uint totalCount);
  92. private:
  93. JsrtDebuggerObjectScope(JsrtDebuggerObjectsManager* debuggerObjectsManager, WeakArenaReference<Js::IDiagObjectModelDisplay>* objectDisplay, uint index);
  94. ~JsrtDebuggerObjectScope();
  95. WeakArenaReference<Js::IDiagObjectModelDisplay>* objectDisplay;
  96. WeakArenaReference<Js::IDiagObjectModelWalkerBase>* walkerRef;
  97. uint index;
  98. };
  99. class JsrtDebuggerStackFrame
  100. {
  101. public:
  102. JsrtDebuggerStackFrame(JsrtDebuggerObjectsManager * debuggerObjectsManager, Js::DiagStackFrame* stackFrame, uint frameIndex);
  103. ~JsrtDebuggerStackFrame();
  104. Js::DynamicObject* GetJSONObject(Js::ScriptContext* scriptContext);
  105. Js::DynamicObject* GetLocalsObject(Js::ScriptContext* scriptContext);
  106. bool Evaluate(Js::ScriptContext* scriptContext, const char16 *source, int sourceLength, bool isLibraryCode, bool forceSetValueProp, Js::DynamicObject** evalResult);
  107. uint GetIndex() const { return this->frameIndex; }
  108. private:
  109. uint frameIndex;
  110. Js::DiagStackFrame* stackFrame;
  111. JsrtDebuggerObjectsManager * debuggerObjectsManager;
  112. };
  113. class JsrtDebugStackFrames
  114. {
  115. public:
  116. JsrtDebugStackFrames(JsrtDebugManager* jsrtDebugManager);
  117. ~JsrtDebugStackFrames();
  118. Js::JavascriptArray* StackFrames(Js::ScriptContext* scriptContext);
  119. bool TryGetFrameObjectFromFrameIndex(uint frameIndex, JsrtDebuggerStackFrame ** debuggerStackFrame);
  120. private:
  121. Js::DynamicObject* GetStackFrame(Js::DiagStackFrame * stackFrame, uint frameIndex);
  122. JsrtDebugManager* jsrtDebugManager;
  123. typedef JsUtil::BaseDictionary<uint, JsrtDebuggerStackFrame*, ArenaAllocator> FramesDictionary;
  124. FramesDictionary* framesDictionary;
  125. void ClearFrameDictionary();
  126. };
  127. // Class managing objects we give to debugger, it maintains various mappings
  128. class JsrtDebuggerObjectsManager
  129. {
  130. public:
  131. JsrtDebuggerObjectsManager(JsrtDebugManager* jsrtDebugManager);
  132. ~JsrtDebuggerObjectsManager();
  133. void ClearAll();
  134. JsrtDebugManager* GetJsrtDebugManager() { return this->jsrtDebugManager; };
  135. ArenaAllocator* GetDebugObjectArena();
  136. uint GetNextHandle() { return ++handleId; }
  137. void AddToDebuggerObjectsDictionary(JsrtDebuggerObjectBase* debuggerObject);
  138. bool TryGetDebuggerObjectFromHandle(uint handle, JsrtDebuggerObjectBase** debuggerObject);
  139. void AddToDataToDebuggerObjectsDictionary(void* data, JsrtDebuggerObjectBase* debuggerObject);
  140. bool TryGetDataFromDataToDebuggerObjectsDictionary(void* data, JsrtDebuggerObjectBase** debuggerObject);
  141. private:
  142. uint handleId;
  143. JsrtDebugManager* jsrtDebugManager;
  144. typedef JsUtil::BaseDictionary<uint, JsrtDebuggerObjectBase*, ArenaAllocator> DebuggerObjectsDictionary;
  145. DebuggerObjectsDictionary* handleToDebuggerObjectsDictionary;
  146. typedef JsUtil::BaseDictionary<void*, JsrtDebuggerObjectBase*, ArenaAllocator> DataToDebuggerObjectsDictionary;
  147. DataToDebuggerObjectsDictionary* dataToDebuggerObjectsDictionary;
  148. };