@@ -1718,6 +1718,7 @@ class DebuggerC : public Debugger {
1718
1718
virtual void consoleOut (String* output) override ;
1719
1719
virtual String* getClientSource (String** sourceName) override ;
1720
1720
virtual bool getWaitBeforeExitClient () override ;
1721
+ virtual void deleteClient () override ;
1721
1722
1722
1723
DebuggerC (DebuggerOperationsRef::DebuggerClient* debuggerClient, Context* context)
1723
1724
: m_debuggerClient(debuggerClient)
@@ -1821,7 +1822,11 @@ void DebuggerC::stopAtBreakpoint(ByteCodeBlock* byteCodeBlock, uint32_t offset,
1821
1822
1822
1823
void DebuggerC::byteCodeReleaseNotification (ByteCodeBlock* byteCodeBlock)
1823
1824
{
1824
- m_debuggerClient->codeReleased (reinterpret_cast <DebuggerOperationsRef::WeakCodeRef*>(byteCodeBlock));
1825
+ if (m_debuggerClient) {
1826
+ // Debugger could be removed earlier when this function called
1827
+ // e.g. release global objects such as Context and VMInstance at the end of execution
1828
+ m_debuggerClient->codeReleased (reinterpret_cast <DebuggerOperationsRef::WeakCodeRef*>(byteCodeBlock));
1829
+ }
1825
1830
}
1826
1831
1827
1832
void DebuggerC::exceptionCaught (String* message, SavedStackTraceDataVector& exceptionTrace)
@@ -1847,6 +1852,15 @@ bool DebuggerC::getWaitBeforeExitClient()
1847
1852
return false ;
1848
1853
}
1849
1854
1855
+ void DebuggerC::deleteClient ()
1856
+ {
1857
+ if (m_debuggerClient) {
1858
+ // delete DebuggerClient that was created and delivered from the user
1859
+ delete m_debuggerClient;
1860
+ m_debuggerClient = nullptr ;
1861
+ }
1862
+ }
1863
+
1850
1864
bool DebuggerC::processEvents (ExecutionState* state, Optional<ByteCodeBlock*> byteCodeBlock, bool isBlockingRequest)
1851
1865
{
1852
1866
UNUSED_PARAMETER (state);
@@ -3093,6 +3107,19 @@ bool ContextRef::initDebugger(DebuggerOperationsRef::DebuggerClient* debuggerCli
3093
3107
#endif /* ESCARGOT_DEBUGGER */
3094
3108
}
3095
3109
3110
+ bool ContextRef::disableDebugger ()
3111
+ {
3112
+ #ifdef ESCARGOT_DEBUGGER
3113
+ Context* context = toImpl (this );
3114
+ if (context->debugger ()) {
3115
+ context->debugger ()->deleteClient ();
3116
+ }
3117
+ return true ;
3118
+ #else
3119
+ return false ;
3120
+ #endif
3121
+ }
3122
+
3096
3123
bool ContextRef::initDebuggerRemote (const char * options)
3097
3124
{
3098
3125
#ifdef ESCARGOT_DEBUGGER
0 commit comments