JsrtDebuggerObject.h 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  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::FunctionBody* functionBody);
  53. Js::DynamicObject* GetJSONObject(Js::ScriptContext* scriptContext, bool forceSetValueProp);
  54. private:
  55. JsrtDebuggerObjectFunction(JsrtDebuggerObjectsManager* debuggerObjectsManager, Js::FunctionBody* functionBody);
  56. ~JsrtDebuggerObjectFunction();
  57. Js::FunctionBody* functionBody;
  58. };
  59. class JsrtDebuggerObjectProperty : public JsrtDebuggerObjectBase
  60. {
  61. public:
  62. static JsrtDebuggerObjectBase* Make(JsrtDebuggerObjectsManager* debuggerObjectsManager, WeakArenaReference<Js::IDiagObjectModelDisplay>* objectDisplay);
  63. Js::DynamicObject* GetJSONObject(Js::ScriptContext* scriptContext, bool forceSetValueProp);
  64. Js::DynamicObject* GetChildren(Js::ScriptContext* scriptContext, uint fromCount, uint totalCount);
  65. private:
  66. JsrtDebuggerObjectProperty(JsrtDebuggerObjectsManager* debuggerObjectsManager, WeakArenaReference<Js::IDiagObjectModelDisplay>* objectDisplay);
  67. ~JsrtDebuggerObjectProperty();
  68. WeakArenaReference<Js::IDiagObjectModelDisplay>* objectDisplay;
  69. WeakArenaReference<Js::IDiagObjectModelWalkerBase>* walkerRef;
  70. };
  71. class JsrtDebuggerObjectGlobalsNode : public JsrtDebuggerObjectBase
  72. {
  73. public:
  74. static JsrtDebuggerObjectBase* Make(JsrtDebuggerObjectsManager* debuggerObjectsManager, WeakArenaReference<Js::IDiagObjectModelDisplay>* objectDisplay);
  75. Js::DynamicObject* GetJSONObject(Js::ScriptContext* scriptContext, bool forceSetValueProp);
  76. Js::DynamicObject* GetChildren(Js::ScriptContext* scriptContext, uint fromCount, uint totalCount);
  77. private:
  78. JsrtDebuggerObjectGlobalsNode(JsrtDebuggerObjectsManager* debuggerObjectsManager, WeakArenaReference<Js::IDiagObjectModelDisplay>* objectDisplay);
  79. ~JsrtDebuggerObjectGlobalsNode();
  80. WeakArenaReference<Js::IDiagObjectModelDisplay>* objectDisplay;
  81. WeakArenaReference<Js::IDiagObjectModelWalkerBase>* walkerRef;
  82. };
  83. class JsrtDebuggerObjectScope : public JsrtDebuggerObjectBase
  84. {
  85. public:
  86. static JsrtDebuggerObjectBase* Make(JsrtDebuggerObjectsManager* debuggerObjectsManager, WeakArenaReference<Js::IDiagObjectModelDisplay>* objectDisplay, uint index);
  87. Js::DynamicObject* GetJSONObject(Js::ScriptContext* scriptContext, bool forceSetValueProp);
  88. Js::DynamicObject* GetChildren(Js::ScriptContext* scriptContext, uint fromCount, uint totalCount);
  89. private:
  90. JsrtDebuggerObjectScope(JsrtDebuggerObjectsManager* debuggerObjectsManager, WeakArenaReference<Js::IDiagObjectModelDisplay>* objectDisplay, uint index);
  91. ~JsrtDebuggerObjectScope();
  92. WeakArenaReference<Js::IDiagObjectModelDisplay>* objectDisplay;
  93. WeakArenaReference<Js::IDiagObjectModelWalkerBase>* walkerRef;
  94. uint index;
  95. };
  96. class JsrtDebuggerStackFrame
  97. {
  98. public:
  99. JsrtDebuggerStackFrame(JsrtDebuggerObjectsManager * debuggerObjectsManager, Js::DiagStackFrame* stackFrame, uint frameIndex);
  100. ~JsrtDebuggerStackFrame();
  101. Js::DynamicObject* GetJSONObject(Js::ScriptContext* scriptContext);
  102. Js::DynamicObject* GetLocalsObject(Js::ScriptContext* scriptContext);
  103. bool Evaluate(Js::ScriptContext* scriptContext, const char16 *source, int sourceLength, bool isLibraryCode, bool forceSetValueProp, Js::DynamicObject** evalResult);
  104. uint GetIndex() const { return this->frameIndex; }
  105. private:
  106. uint frameIndex;
  107. Js::DiagStackFrame* stackFrame;
  108. JsrtDebuggerObjectsManager * debuggerObjectsManager;
  109. };
  110. class JsrtDebugStackFrames
  111. {
  112. public:
  113. JsrtDebugStackFrames(JsrtDebugManager* jsrtDebugManager);
  114. ~JsrtDebugStackFrames();
  115. Js::JavascriptArray* StackFrames(Js::ScriptContext* scriptContext);
  116. bool TryGetFrameObjectFromFrameIndex(uint frameIndex, JsrtDebuggerStackFrame ** debuggerStackFrame);
  117. private:
  118. Js::DynamicObject* GetStackFrame(Js::DiagStackFrame * stackFrame, uint frameIndex);
  119. JsrtDebugManager* jsrtDebugManager;
  120. typedef JsUtil::BaseDictionary<uint, JsrtDebuggerStackFrame*, ArenaAllocator> FramesDictionary;
  121. FramesDictionary* framesDictionary;
  122. void ClearFrameDictionary();
  123. };
  124. // Class managing objects we give to debugger, it maintains various mappings
  125. class JsrtDebuggerObjectsManager
  126. {
  127. public:
  128. JsrtDebuggerObjectsManager(JsrtDebugManager* jsrtDebugManager);
  129. ~JsrtDebuggerObjectsManager();
  130. void ClearAll();
  131. JsrtDebugManager* GetJsrtDebugManager() { return this->jsrtDebugManager; };
  132. ArenaAllocator* GetDebugObjectArena();
  133. uint GetNextHandle() { return ++handleId; }
  134. void AddToDebuggerObjectsDictionary(JsrtDebuggerObjectBase* debuggerObject);
  135. bool TryGetDebuggerObjectFromHandle(uint handle, JsrtDebuggerObjectBase** debuggerObject);
  136. void AddToDataToDebuggerObjectsDictionary(void* data, JsrtDebuggerObjectBase* debuggerObject);
  137. bool TryGetDataFromDataToDebuggerObjectsDictionary(void* data, JsrtDebuggerObjectBase** debuggerObject);
  138. private:
  139. uint handleId;
  140. JsrtDebugManager* jsrtDebugManager;
  141. typedef JsUtil::BaseDictionary<uint, JsrtDebuggerObjectBase*, ArenaAllocator> DebuggerObjectsDictionary;
  142. DebuggerObjectsDictionary* handleToDebuggerObjectsDictionary;
  143. typedef JsUtil::BaseDictionary<void*, JsrtDebuggerObjectBase*, ArenaAllocator> DataToDebuggerObjectsDictionary;
  144. DataToDebuggerObjectsDictionary* dataToDebuggerObjectsDictionary;
  145. };