Minor GDB/MI breakpoints related code refactoring.
authorMikhail Kurinnoi <m.kurinnoi@samsung.com>
Wed, 17 Apr 2019 08:51:22 +0000 (11:51 +0300)
committerMikhail Kurinnoi <m.kurinnoi@samsung.com>
Wed, 17 Apr 2019 08:51:22 +0000 (11:51 +0300)
src/debug/netcoredbg/miprotocol.cpp
src/debug/netcoredbg/miprotocol.h

index 773110b5dfb03d97114a1b9341e5b910c463b814..1f3df0ecd268a7d40f81eaf6c6690beceddda897 100644 (file)
@@ -613,6 +613,11 @@ HRESULT MIProtocol::SetBreakpointCondition(uint32_t id, const std::string &condi
         return m_debugger->SetBreakpoints(filename, existingBreakpoints, tmpBreakpoints);
     }
 
+    return E_FAIL;
+}
+
+HRESULT MIProtocol::SetFunctionBreakpointCondition(uint32_t id, const std::string &condition)
+{
     const auto &fbIter = m_funcBreakpoints.find(id);
     if (fbIter == m_funcBreakpoints.end())
         return E_FAIL;
@@ -646,18 +651,22 @@ void MIProtocol::DeleteBreakpoints(const std::unordered_set<uint32_t> &ids)
         std::vector<Breakpoint> tmpBreakpoints;
         m_debugger->SetBreakpoints(filename, remainingBreakpoints, tmpBreakpoints);
     }
+}
 
+void MIProtocol::DeleteFunctionBreakpoints(const std::unordered_set<uint32_t> &ids)
+{
     std::vector<FunctionBreakpoint> remainingFuncBreakpoints;
     for (auto &fb : m_funcBreakpoints)
     {
         if (ids.find(fb.first) == ids.end())
             remainingFuncBreakpoints.push_back(fb.second);
     }
-    if (remainingFuncBreakpoints.size() != m_funcBreakpoints.size())
-    {
-        std::vector<Breakpoint> tmpBreakpoints;
-        m_debugger->SetFunctionBreakpoints(remainingFuncBreakpoints, tmpBreakpoints);
-    }
+
+    if (remainingFuncBreakpoints.size() == m_funcBreakpoints.size())
+        return;
+
+    std::vector<Breakpoint> tmpBreakpoints;
+    m_debugger->SetFunctionBreakpoints(remainingFuncBreakpoints, tmpBreakpoints);
 }
 
 void MIProtocol::EmitStoppedEvent(StoppedEvent event)
@@ -870,6 +879,7 @@ HRESULT MIProtocol::HandleCommand(std::string command,
                 ids.insert(id);
         }
         DeleteBreakpoints(ids);
+        DeleteFunctionBreakpoints(ids);
         return S_OK;
     } },
     { "break-condition", [this](const std::vector<std::string> &args, std::string &output) -> HRESULT {
@@ -887,7 +897,11 @@ HRESULT MIProtocol::HandleCommand(std::string command,
             return E_FAIL;
         }
 
-        return SetBreakpointCondition(id, args.at(1));
+        HRESULT Status = SetBreakpointCondition(id, args.at(1));
+        if (SUCCEEDED(Status))
+            return Status;
+
+        return SetFunctionBreakpointCondition(id, args.at(1));
     } },
     { "exec-step", [this](const std::vector<std::string> &args, std::string &output) -> HRESULT {
         return StepCommand(args, output, Debugger::STEP_IN);
index ab331bcaf53c0e638c687839a01f2b4e51c133bd..7c9182a524d8f0bb628387a07fff40d6d7d11b69 100644 (file)
@@ -75,6 +75,8 @@ private:
     HRESULT SetBreakpoint(const std::string &filename, int linenum, const std::string &condition, Breakpoint &breakpoints);
     HRESULT SetFunctionBreakpoint(const std::string &module, const std::string &funcname, const std::string &params, const std::string &condition, Breakpoint &breakpoint);
     HRESULT SetBreakpointCondition(uint32_t id, const std::string &condition);
+    HRESULT SetFunctionBreakpointCondition(uint32_t id, const std::string &condition);
     void DeleteBreakpoints(const std::unordered_set<uint32_t> &ids);
+    void DeleteFunctionBreakpoints(const std::unordered_set<uint32_t> &ids);
     static HRESULT PrintFrameLocation(const StackFrame &stackFrame, std::string &output);
 };