From 27ddfc3f9d560eeb933988fa8d8af390b272fab7 Mon Sep 17 00:00:00 2001 From: yp9522 Date: Fri, 13 Jun 2025 15:14:37 +0800 Subject: [PATCH] Cross language debugging interface optimization Issue: https://gitee.com/openharmony/arkcompiler_toolchain/issues/ICUO5G Signed-off-by: yp9522 Change-Id: I495ea3a614cd979057e5ef45c314d9512fa336a1 --- tooling/dynamic/agent/animation_impl.cpp | 4 +- tooling/dynamic/agent/animation_impl.h | 2 +- tooling/dynamic/agent/css_impl.cpp | 4 +- tooling/dynamic/agent/css_impl.h | 2 +- tooling/dynamic/agent/debugger_impl.cpp | 185 +++++++++----------- tooling/dynamic/agent/debugger_impl.h | 21 +-- tooling/dynamic/agent/dom_impl.cpp | 4 +- tooling/dynamic/agent/dom_impl.h | 2 +- tooling/dynamic/agent/heapprofiler_impl.cpp | 4 +- tooling/dynamic/agent/heapprofiler_impl.h | 2 +- tooling/dynamic/agent/overlay_impl.cpp | 4 +- tooling/dynamic/agent/overlay_impl.h | 2 +- tooling/dynamic/agent/page_impl.cpp | 4 +- tooling/dynamic/agent/page_impl.h | 2 +- tooling/dynamic/agent/profiler_impl.cpp | 4 +- tooling/dynamic/agent/profiler_impl.h | 2 +- tooling/dynamic/agent/runtime_impl.cpp | 51 ++---- tooling/dynamic/agent/runtime_impl.h | 5 +- tooling/dynamic/agent/target_impl.cpp | 4 +- tooling/dynamic/agent/target_impl.h | 2 +- tooling/dynamic/agent/tracing_impl.cpp | 4 +- tooling/dynamic/agent/tracing_impl.h | 2 +- tooling/dynamic/debugger_service.cpp | 3 +- tooling/dynamic/dispatcher.cpp | 98 +---------- tooling/dynamic/dispatcher.h | 22 +-- tooling/dynamic/test/debugger_impl_test.cpp | 35 ++-- tooling/dynamic/test/dispatcher_test.cpp | 27 ++- tooling/dynamic/test/runtime_impl_test.cpp | 8 +- 28 files changed, 186 insertions(+), 323 deletions(-) diff --git a/tooling/dynamic/agent/animation_impl.cpp b/tooling/dynamic/agent/animation_impl.cpp index caea02bf..ba6bf3a2 100755 --- a/tooling/dynamic/agent/animation_impl.cpp +++ b/tooling/dynamic/agent/animation_impl.cpp @@ -16,7 +16,8 @@ #include "agent/animation_impl.h" namespace panda::ecmascript::tooling { -void AnimationImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) +std::string AnimationImpl::DispatcherImpl::Dispatch(const DispatchRequest &request, + [[maybe_unused]] bool crossLanguageDebugging) { Method method = GetMethodEnum(request.GetMethod()); LOG_DEBUGGER(INFO) << "dispatch [" << request.GetMethod() << "] to AnimationImpl"; @@ -28,6 +29,7 @@ void AnimationImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) SendResponse(request, DispatchResponse::Fail("Unknown method: " + request.GetMethod())); break; } + return ""; } AnimationImpl::DispatcherImpl::Method AnimationImpl::DispatcherImpl::GetMethodEnum(const std::string& method) diff --git a/tooling/dynamic/agent/animation_impl.h b/tooling/dynamic/agent/animation_impl.h index 3f0e4176..f1f41f05 100755 --- a/tooling/dynamic/agent/animation_impl.h +++ b/tooling/dynamic/agent/animation_impl.h @@ -34,7 +34,7 @@ public: : DispatcherBase(channel), animation_(std::move(animation)) {} ~DispatcherImpl() override = default; void Disable(const DispatchRequest &request); - void Dispatch(const DispatchRequest &request) override; + std::string Dispatch(const DispatchRequest &request, bool crossLanguageDebugging = false) override; enum class Method { DISABLE, diff --git a/tooling/dynamic/agent/css_impl.cpp b/tooling/dynamic/agent/css_impl.cpp index 90f61903..9a4f6b22 100755 --- a/tooling/dynamic/agent/css_impl.cpp +++ b/tooling/dynamic/agent/css_impl.cpp @@ -16,7 +16,8 @@ #include "agent/css_impl.h" namespace panda::ecmascript::tooling { -void CssImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) +std::string CssImpl::DispatcherImpl::Dispatch(const DispatchRequest &request, + [[maybe_unused]] bool crossLanguageDebugging) { Method method = GetMethodEnum(request.GetMethod()); LOG_DEBUGGER(INFO) << "dispatch [" << request.GetMethod() << "] to CssImpl"; @@ -28,6 +29,7 @@ void CssImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) SendResponse(request, DispatchResponse::Fail("Unknown method: " + request.GetMethod())); break; } + return ""; } CssImpl::DispatcherImpl::Method CssImpl::DispatcherImpl::GetMethodEnum(const std::string& method) diff --git a/tooling/dynamic/agent/css_impl.h b/tooling/dynamic/agent/css_impl.h index c85f612e..4719374d 100755 --- a/tooling/dynamic/agent/css_impl.h +++ b/tooling/dynamic/agent/css_impl.h @@ -34,7 +34,7 @@ public: : DispatcherBase(channel), css_(std::move(css)) {} ~DispatcherImpl() override = default; void Disable(const DispatchRequest &request); - void Dispatch(const DispatchRequest &request) override; + std::string Dispatch(const DispatchRequest &request, bool crossLanguageDebugging = false) override; enum class Method { DISABLE, diff --git a/tooling/dynamic/agent/debugger_impl.cpp b/tooling/dynamic/agent/debugger_impl.cpp index 15dbc0d9..62c3dc67 100755 --- a/tooling/dynamic/agent/debugger_impl.cpp +++ b/tooling/dynamic/agent/debugger_impl.cpp @@ -501,7 +501,8 @@ std::vector DebuggerImpl::GetNativeAddr() { return DebuggerApi::GetNativePointer(vm_); } -void DebuggerImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) +std::string DebuggerImpl::DispatcherImpl::Dispatch( + const DispatchRequest &request, [[maybe_unused]] bool crossLanguageDebugging) { Method method = GetMethodEnum(request.GetMethod()); LOG_DEBUGGER(DEBUG) << "dispatch [" << request.GetMethod() << "] to DebuggerImpl"; @@ -516,8 +517,7 @@ void DebuggerImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) Disable(request); break; case Method::EVALUATE_ON_CALL_FRAME: - EvaluateOnCallFrame(request); - break; + return EvaluateOnCallFrame(request, crossLanguageDebugging); case Method::GET_POSSIBLE_BREAKPOINTS: GetPossibleBreakpoints(request); break; @@ -531,8 +531,7 @@ void DebuggerImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) RemoveBreakpoint(request); break; case Method::REMOVE_BREAKPOINTS_BY_URL: - RemoveBreakpointsByUrl(request); - break; + return RemoveBreakpointsByUrl(request, crossLanguageDebugging); case Method::RESUME: Resume(request); break; @@ -573,8 +572,7 @@ void DebuggerImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) ReplyNativeCalling(request); break; case Method::GET_POSSIBLE_AND_SET_BREAKPOINT_BY_URL: - GetPossibleAndSetBreakpointByUrl(request); - break; + return GetPossibleAndSetBreakpointByUrl(request, crossLanguageDebugging); case Method::DROP_FRAME: DropFrame(request); break; @@ -588,11 +586,9 @@ void DebuggerImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) ClientDisconnect(request); break; case Method::CALL_FUNCTION_ON: - CallFunctionOn(request); - break; + return CallFunctionOn(request, crossLanguageDebugging); case Method::SAVE_ALL_POSSIBLE_BREAKPOINTS: - SaveAllPossibleBreakpoints(request); - break; + return SaveAllPossibleBreakpoints(request, crossLanguageDebugging); case Method::SET_SYMBOLIC_BREAKPOINTS: SetSymbolicBreakpoints(request); break; @@ -603,6 +599,7 @@ void DebuggerImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) SendResponse(request, DispatchResponse::Fail("Unknown method: " + request.GetMethod())); break; } + return ""; } DebuggerImpl::DispatcherImpl::Method DebuggerImpl::DispatcherImpl::GetMethodEnum(const std::string& method) @@ -708,22 +705,36 @@ void DebuggerImpl::DispatcherImpl::Disable(const DispatchRequest &request) SendResponse(request, response); } -void DebuggerImpl::DispatcherImpl::EvaluateOnCallFrame(const DispatchRequest &request) +std::string DebuggerImpl::DispatcherImpl::EvaluateOnCallFrame( + const DispatchRequest &request, bool crossLanguageDebugging) { std::unique_ptr params = EvaluateOnCallFrameParams::Create(request.GetParams()); + int32_t callId = request.GetCallId(); if (params == nullptr) { + if (crossLanguageDebugging) { + LOG_DEBUGGER(WARN) << "DispatcherImpl::EvaluateOnCallFrame: params is nullptr"; + return ReturnsValueToString(callId, DispatchResponseToJson(DispatchResponse::Fail("wrong params"))); + } SendResponse(request, DispatchResponse::Fail("wrong params")); - return; + return ""; } std::unique_ptr result1; DispatchResponse response = debugger_->EvaluateOnCallFrame(*params, &result1); if (result1 == nullptr) { + if (crossLanguageDebugging) { + LOG_DEBUGGER(WARN) << "remoteObject is nullptr or response code is not ok"; + return ReturnsValueToString(callId, DispatchResponseToJson(response)); + } SendResponse(request, response); - return; + return ""; } EvaluateOnCallFrameReturns result(std::move(result1)); + if (crossLanguageDebugging) { + return ReturnsValueToString(callId, result.ToJson()); + } SendResponse(request, response, result); + return ""; } void DebuggerImpl::DispatcherImpl::GetPossibleBreakpoints(const DispatchRequest &request) @@ -769,27 +780,25 @@ void DebuggerImpl::DispatcherImpl::RemoveBreakpoint(const DispatchRequest &reque SendResponse(request, response); } -void DebuggerImpl::DispatcherImpl::RemoveBreakpointsByUrl(const DispatchRequest &request) +std::string DebuggerImpl::DispatcherImpl::RemoveBreakpointsByUrl( + const DispatchRequest &request, bool crossLanguageDebugging) { std::unique_ptr params = RemoveBreakpointsByUrlParams::Create(request.GetParams()); + int32_t callId = request.GetCallId(); if (params == nullptr) { + if (crossLanguageDebugging) { + LOG_DEBUGGER(WARN) << "DebuggerImpl::DispatcherImpl::RemoveBreakpointsByUrl: params is nullptr"; + return ReturnsValueToString(callId, DispatchResponseToJson(DispatchResponse::Fail("wrong params"))); + } SendResponse(request, DispatchResponse::Fail("wrong params")); - return; + return ""; } DispatchResponse response = debugger_->RemoveBreakpointsByUrl(*params); - SendResponse(request, response); -} - -std::string DebuggerImpl::DispatcherImpl::RemoveBreakpointsByUrl( - const int32_t callId, std::unique_ptr params) -{ - if (params == nullptr) { - LOG_DEBUGGER(WARN) << "DebuggerImpl::DispatcherImpl::RemoveBreakpointsByUrl: params is nullptr"; - return ReturnsValueToString(callId, DispatchResponseToJson(DispatchResponse::Fail("wrong params"))); + if (crossLanguageDebugging) { + return ReturnsValueToString(callId, DispatchResponseToJson(response)); } - - DispatchResponse response = debugger_->RemoveBreakpointsByUrl(*params); - return ReturnsValueToString(callId, DispatchResponseToJson(response)); + SendResponse(request, response); + return ""; } void DebuggerImpl::DispatcherImpl::Resume(const DispatchRequest &request) @@ -830,60 +839,55 @@ void DebuggerImpl::DispatcherImpl::SetBreakpointsActive(const DispatchRequest &r SendResponse(request, response); } -void DebuggerImpl::DispatcherImpl::GetPossibleAndSetBreakpointByUrl(const DispatchRequest &request) +std::string DebuggerImpl::DispatcherImpl::GetPossibleAndSetBreakpointByUrl( + const DispatchRequest &request, bool crossLanguageDebugging) { std::unique_ptr params = GetPossibleAndSetBreakpointParams::Create(request.GetParams()); + int32_t callId = request.GetCallId(); if (params == nullptr) { + if (crossLanguageDebugging) { + LOG_DEBUGGER(WARN) << "DebuggerImpl::DispatcherImpl::GetPossibleAndSetBreakpointByUrl: params is nullptr"; + return ReturnsValueToString(callId, DispatchResponseToJson(DispatchResponse::Fail("wrong params"))); + } SendResponse(request, DispatchResponse::Fail("wrong params")); - return; + return ""; } std::vector> outLocation; DispatchResponse response = debugger_->GetPossibleAndSetBreakpointByUrl(*params, outLocation); - GetPossibleAndSetBreakpointByUrlReturns result(std::move(outLocation)); - SendResponse(request, response, result); -} - -std::string DebuggerImpl::DispatcherImpl::GetPossibleAndSetBreakpointByUrl( - const int32_t callId, std::unique_ptr params) -{ - if (params == nullptr) { - LOG_DEBUGGER(WARN) << "DebuggerImpl::DispatcherImpl::GetPossibleAndSetBreakpointByUrl: params is nullptr"; - return ReturnsValueToString(callId, DispatchResponseToJson(DispatchResponse::Fail("wrong params"))); - } - std::vector> outLocation; - DispatchResponse response = debugger_->GetPossibleAndSetBreakpointByUrl(*params, outLocation); - if (outLocation.empty() || !response.IsOk()) { + if (crossLanguageDebugging && (outLocation.empty() || !response.IsOk())) { LOG_DEBUGGER(WARN) << "outLocation is empty or response code is not ok"; return ReturnsValueToString(callId, DispatchResponseToJson(response)); } - GetPossibleAndSetBreakpointByUrlReturns result(std::move(outLocation)); - return ReturnsValueToString(callId, result.ToJson()); + if (crossLanguageDebugging) { + return ReturnsValueToString(callId, result.ToJson()); + } + SendResponse(request, response, result); + return ""; } -void DebuggerImpl::DispatcherImpl::SaveAllPossibleBreakpoints(const DispatchRequest &request) +std::string DebuggerImpl::DispatcherImpl::SaveAllPossibleBreakpoints( + const DispatchRequest &request, bool crossLanguageDebugging) { std::unique_ptr params = SaveAllPossibleBreakpointsParams::Create(request.GetParams()); + int32_t callId = request.GetCallId(); if (params == nullptr) { + if (crossLanguageDebugging) { + LOG_DEBUGGER(WARN) << "DebuggerImpl::DispatcherImpl::SaveAllPossibleBreakpoints: params is nullptr"; + return ReturnsValueToString(callId, DispatchResponseToJson(DispatchResponse::Fail("wrong params"))); + } SendResponse(request, DispatchResponse::Fail("wrong params")); - return; + return ""; } DispatchResponse response = debugger_->SaveAllPossibleBreakpoints(*params); - SendResponse(request, response); -} - -std::string DebuggerImpl::DispatcherImpl::SaveAllPossibleBreakpoints( - const int32_t callId, std::unique_ptr params) -{ - if (params == nullptr) { - LOG_DEBUGGER(WARN) << "DebuggerImpl::DispatcherImpl::SaveAllPossibleBreakpoints: params is nullptr"; - return ReturnsValueToString(callId, DispatchResponseToJson(DispatchResponse::Fail("wrong params"))); + if (crossLanguageDebugging) { + return ReturnsValueToString(callId, DispatchResponseToJson(response)); } - DispatchResponse response = debugger_->SaveAllPossibleBreakpoints(*params); - return ReturnsValueToString(callId, DispatchResponseToJson(response)); + SendResponse(request, response); + return ""; } void DebuggerImpl::DispatcherImpl::SetSymbolicBreakpoints(const DispatchRequest &request) @@ -1052,12 +1056,17 @@ void DebuggerImpl::DispatcherImpl::ClientDisconnect([[maybe_unused]] const Dispa debugger_->ClientDisconnect(); } -void DebuggerImpl::DispatcherImpl::CallFunctionOn(const DispatchRequest &request) +std::string DebuggerImpl::DispatcherImpl::CallFunctionOn(const DispatchRequest &request, bool crossLanguageDebugging) { std::unique_ptr params = CallFunctionOnParams::Create(request.GetParams()); + int32_t callId = request.GetCallId(); if (params == nullptr) { + if (crossLanguageDebugging) { + LOG_DEBUGGER(WARN) << "DispatcherImpl::CallFunctionOn: params is nullptr"; + return ReturnsValueToString(callId, DispatchResponseToJson(DispatchResponse::Fail("wrong params"))); + } SendResponse(request, DispatchResponse::Fail("wrong params")); - return; + return ""; } std::unique_ptr outRemoteObject; @@ -1067,13 +1076,22 @@ void DebuggerImpl::DispatcherImpl::CallFunctionOn(const DispatchRequest &request ASSERT(outExceptionDetails.value() != nullptr); LOG_DEBUGGER(WARN) << "CallFunctionOn thrown an exception"; } - if (outRemoteObject == nullptr) { + if (crossLanguageDebugging) { + if (outRemoteObject == nullptr || !response.IsOk()) { + LOG_DEBUGGER(WARN) << "outRemoteObject is nullptr or response code is not ok"; + return ReturnsValueToString(callId, DispatchResponseToJson(response)); + } + } else if (outRemoteObject == nullptr) { SendResponse(request, response); - return; + return ""; } CallFunctionOnReturns result(std::move(outRemoteObject), std::move(outExceptionDetails)); + if (crossLanguageDebugging) { + return ReturnsValueToString(callId, result.ToJson()); + } SendResponse(request, response, result); + return ""; } bool DebuggerImpl::Frontend::AllowNotify(const EcmaVM *vm) const @@ -1588,47 +1606,6 @@ DispatchResponse DebuggerImpl::SetAsyncCallStackDepth(const SetAsyncCallStackDep return DispatchResponse::Ok(); } -std::string DebuggerImpl::DispatcherImpl::EvaluateOnCallFrame( - const int32_t callId, std::unique_ptr params) -{ - if (params == nullptr) { - LOG_DEBUGGER(WARN) << "DispatcherImpl::EvaluateOnCallFrame: params is nullptr"; - return ReturnsValueToString(callId, DispatchResponseToJson(DispatchResponse::Fail("wrong params"))); - } - std::unique_ptr remoteObject; - DispatchResponse response = debugger_->EvaluateOnCallFrame(*params, &remoteObject); - if (remoteObject == nullptr || !response.IsOk()) { - LOG_DEBUGGER(WARN) << "remoteObject is nullptr or response code is not ok"; - return ReturnsValueToString(callId, DispatchResponseToJson(response)); - } - - EvaluateOnCallFrameReturns result(std::move(remoteObject)); - return ReturnsValueToString(callId, result.ToJson()); -} - -std::string DebuggerImpl::DispatcherImpl::CallFunctionOn( - const int32_t callId, std::unique_ptr params) -{ - if (params == nullptr) { - LOG_DEBUGGER(WARN) << "DispatcherImpl::CallFunctionOn: params is nullptr"; - return ReturnsValueToString(callId, DispatchResponseToJson(DispatchResponse::Fail("wrong params"))); - } - std::unique_ptr outRemoteObject; - std::optional> outExceptionDetails; - DispatchResponse response = debugger_->CallFunctionOn(*params, &outRemoteObject, &outExceptionDetails); - if (outExceptionDetails) { - ASSERT(outExceptionDetails.value() != nullptr); - LOG_DEBUGGER(WARN) << "CallFunctionOn thrown an exception"; - } - if (outRemoteObject == nullptr || !response.IsOk()) { - LOG_DEBUGGER(WARN) << "outRemoteObject is nullptr or response code is not ok"; - return ReturnsValueToString(callId, DispatchResponseToJson(response)); - } - - CallFunctionOnReturns result(std::move(outRemoteObject), std::move(outExceptionDetails)); - return ReturnsValueToString(callId, result.ToJson()); -} - void DebuggerImpl::SavePendingBreakpoints(const SaveAllPossibleBreakpointsParams ¶ms) { for (const auto &entry : *(params.GetBreakpointsMap())) { diff --git a/tooling/dynamic/agent/debugger_impl.h b/tooling/dynamic/agent/debugger_impl.h index 7eab7c3f..c4cf33e5 100644 --- a/tooling/dynamic/agent/debugger_impl.h +++ b/tooling/dynamic/agent/debugger_impl.h @@ -159,17 +159,15 @@ public: void ContinueToLocation(const DispatchRequest &request); std::string GetJsFrames(); - std::string EvaluateOnCallFrame(const int32_t callId, std::unique_ptr params); - std::string CallFunctionOn(const int32_t callId, std::unique_ptr params); - void Dispatch(const DispatchRequest &request) override; + std::string Dispatch(const DispatchRequest &request, bool crossLanguageDebugging = false) override; void Enable(const DispatchRequest &request); void Disable(const DispatchRequest &request); - void EvaluateOnCallFrame(const DispatchRequest &request); + std::string EvaluateOnCallFrame(const DispatchRequest &request, bool crossLanguageDebugging = false); void GetPossibleBreakpoints(const DispatchRequest &request); void GetScriptSource(const DispatchRequest &request); void Pause(const DispatchRequest &request); void RemoveBreakpoint(const DispatchRequest &request); - void RemoveBreakpointsByUrl(const DispatchRequest &request); + std::string RemoveBreakpointsByUrl(const DispatchRequest &request, bool crossLanguageDebugging = false); void Resume(const DispatchRequest &request); void SetAsyncCallStackDepth(const DispatchRequest &request); void SetBreakpointByUrl(const DispatchRequest &request); @@ -185,19 +183,14 @@ public: void SetMixedDebugEnabled(const DispatchRequest &request); void SetBlackboxPatterns(const DispatchRequest &request); void ReplyNativeCalling(const DispatchRequest &request); - void GetPossibleAndSetBreakpointByUrl(const DispatchRequest &request); + std::string GetPossibleAndSetBreakpointByUrl(const DispatchRequest &request, + bool crossLanguageDebugging = false); void DropFrame(const DispatchRequest &request); void ClientDisconnect(const DispatchRequest &request); - void CallFunctionOn(const DispatchRequest &request); - void SaveAllPossibleBreakpoints(const DispatchRequest &request); + std::string CallFunctionOn(const DispatchRequest &request, bool crossLanguageDebugging); + std::string SaveAllPossibleBreakpoints(const DispatchRequest &request, bool crossLanguageDebugging = false); void SetSymbolicBreakpoints(const DispatchRequest &request); void RemoveSymbolicBreakpoints(const DispatchRequest &request); - std::string SaveAllPossibleBreakpoints(const int32_t callId, - std::unique_ptr params); - std::string RemoveBreakpointsByUrl(const int32_t callId, - std::unique_ptr params); - std::string GetPossibleAndSetBreakpointByUrl(const int32_t callId, - std::unique_ptr params); enum class Method { CONTINUE_TO_LOCATION, diff --git a/tooling/dynamic/agent/dom_impl.cpp b/tooling/dynamic/agent/dom_impl.cpp index d9c04aef..8b8ff66c 100755 --- a/tooling/dynamic/agent/dom_impl.cpp +++ b/tooling/dynamic/agent/dom_impl.cpp @@ -16,7 +16,8 @@ #include "agent/dom_impl.h" namespace panda::ecmascript::tooling { -void DomImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) +std::string DomImpl::DispatcherImpl::Dispatch(const DispatchRequest &request, + [[maybe_unused]] bool crossLanguageDebugging) { Method method = GetMethodEnum(request.GetMethod()); LOG_DEBUGGER(INFO) << "dispatch [" << request.GetMethod() << "] to DomImpl"; @@ -28,6 +29,7 @@ void DomImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) SendResponse(request, DispatchResponse::Fail("Unknown method: " + request.GetMethod())); break; } + return ""; } DomImpl::DispatcherImpl::Method DomImpl::DispatcherImpl::GetMethodEnum(const std::string& method) diff --git a/tooling/dynamic/agent/dom_impl.h b/tooling/dynamic/agent/dom_impl.h index 921071aa..cfeaf7c1 100755 --- a/tooling/dynamic/agent/dom_impl.h +++ b/tooling/dynamic/agent/dom_impl.h @@ -34,7 +34,7 @@ public: : DispatcherBase(channel), dom_(std::move(dom)) {} ~DispatcherImpl() override = default; void Disable(const DispatchRequest &request); - void Dispatch(const DispatchRequest &request) override; + std::string Dispatch(const DispatchRequest &request, bool crossLanguageDebugging = false) override; enum class Method { DISABLE, diff --git a/tooling/dynamic/agent/heapprofiler_impl.cpp b/tooling/dynamic/agent/heapprofiler_impl.cpp index 55736eaa..6dc6843d 100644 --- a/tooling/dynamic/agent/heapprofiler_impl.cpp +++ b/tooling/dynamic/agent/heapprofiler_impl.cpp @@ -26,7 +26,8 @@ void HeapProfilerImpl::InitializeExtendedProtocolsList() heapProfilerExtendedProtocols_ = std::move(heapProfilerProtocolList); } -void HeapProfilerImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) +std::string HeapProfilerImpl::DispatcherImpl::Dispatch(const DispatchRequest &request, + [[maybe_unused]] bool crossLanguageDebugging) { Method method = GetMethodEnum(request.GetMethod()); LOG_DEBUGGER(DEBUG) << "dispatch [" << request.GetMethod() << "] to HeapProfilerImpl"; @@ -71,6 +72,7 @@ void HeapProfilerImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) SendResponse(request, DispatchResponse::Fail("Unknown method: " + request.GetMethod())); break; } + return ""; } HeapProfilerImpl::DispatcherImpl::Method HeapProfilerImpl::DispatcherImpl::GetMethodEnum(const std::string& method) diff --git a/tooling/dynamic/agent/heapprofiler_impl.h b/tooling/dynamic/agent/heapprofiler_impl.h index 04f1acd2..9368894a 100644 --- a/tooling/dynamic/agent/heapprofiler_impl.h +++ b/tooling/dynamic/agent/heapprofiler_impl.h @@ -65,7 +65,7 @@ public: : DispatcherBase(channel), heapprofiler_(std::move(heapprofiler)) {} ~DispatcherImpl() override = default; - void Dispatch(const DispatchRequest &request) override; + std::string Dispatch(const DispatchRequest &request, bool crossLanguageDebugging = false) override; void AddInspectedHeapObject(const DispatchRequest &request); void CollectGarbage(const DispatchRequest &request); void Enable(const DispatchRequest &request); diff --git a/tooling/dynamic/agent/overlay_impl.cpp b/tooling/dynamic/agent/overlay_impl.cpp index 1ed194d0..eda87a9c 100755 --- a/tooling/dynamic/agent/overlay_impl.cpp +++ b/tooling/dynamic/agent/overlay_impl.cpp @@ -16,7 +16,8 @@ #include "agent/overlay_impl.h" namespace panda::ecmascript::tooling { -void OverlayImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) +std::string OverlayImpl::DispatcherImpl::Dispatch(const DispatchRequest &request, + [[maybe_unused]] bool crossLanguageDebugging) { Method method = GetMethodEnum(request.GetMethod()); LOG_DEBUGGER(INFO) << "dispatch [" << request.GetMethod() << "] to OverlayImpl"; @@ -28,6 +29,7 @@ void OverlayImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) SendResponse(request, DispatchResponse::Fail("Unknown method: " + request.GetMethod())); break; } + return ""; } OverlayImpl::DispatcherImpl::Method OverlayImpl::DispatcherImpl::GetMethodEnum(const std::string& method) diff --git a/tooling/dynamic/agent/overlay_impl.h b/tooling/dynamic/agent/overlay_impl.h index 7fd858bf..7f8215ef 100755 --- a/tooling/dynamic/agent/overlay_impl.h +++ b/tooling/dynamic/agent/overlay_impl.h @@ -34,7 +34,7 @@ public: : DispatcherBase(channel), overlay_(std::move(overlay)) {} ~DispatcherImpl() override = default; void Disable(const DispatchRequest &request); - void Dispatch(const DispatchRequest &request) override; + std::string Dispatch(const DispatchRequest &request, bool crossLanguageDebugging = false) override; enum class Method { DISABLE, diff --git a/tooling/dynamic/agent/page_impl.cpp b/tooling/dynamic/agent/page_impl.cpp index 5aab2847..560c0ab4 100755 --- a/tooling/dynamic/agent/page_impl.cpp +++ b/tooling/dynamic/agent/page_impl.cpp @@ -16,7 +16,8 @@ #include "agent/page_impl.h" namespace panda::ecmascript::tooling { -void PageImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) +std::string PageImpl::DispatcherImpl::Dispatch(const DispatchRequest &request, + [[maybe_unused]] bool crossLanguageDebugging) { Method method = GetMethodEnum(request.GetMethod()); LOG_DEBUGGER(INFO) << "dispatch [" << request.GetMethod() << "] to PageImpl"; @@ -28,6 +29,7 @@ void PageImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) SendResponse(request, DispatchResponse::Fail("Unknown method: " + request.GetMethod())); break; } + return ""; } PageImpl::DispatcherImpl::Method PageImpl::DispatcherImpl::GetMethodEnum(const std::string& method) diff --git a/tooling/dynamic/agent/page_impl.h b/tooling/dynamic/agent/page_impl.h index 6e8ad7f4..8977cfb8 100755 --- a/tooling/dynamic/agent/page_impl.h +++ b/tooling/dynamic/agent/page_impl.h @@ -34,7 +34,7 @@ public: : DispatcherBase(channel), page_(std::move(page)) {} ~DispatcherImpl() override = default; void GetNavigationHistory(const DispatchRequest &request); - void Dispatch(const DispatchRequest &request) override; + std::string Dispatch(const DispatchRequest &request, bool crossLanguageDebugging = false) override; enum class Method { GET_NAVIGATION_HISTORY, diff --git a/tooling/dynamic/agent/profiler_impl.cpp b/tooling/dynamic/agent/profiler_impl.cpp index ab52343d..5a313c4b 100644 --- a/tooling/dynamic/agent/profiler_impl.cpp +++ b/tooling/dynamic/agent/profiler_impl.cpp @@ -32,7 +32,8 @@ void ProfilerImpl::InitializeExtendedProtocolsList() profilerExtendedProtocols_ = std::move(profilerProtocolList); } -void ProfilerImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) +std::string ProfilerImpl::DispatcherImpl::Dispatch(const DispatchRequest &request, + [[maybe_unused]] bool crossLanguageDebugging) { Method method = GetMethodEnum(request.GetMethod()); LOG_DEBUGGER(DEBUG) << "dispatch [" << request.GetMethod() << "] to ProfilerImpl"; @@ -83,6 +84,7 @@ void ProfilerImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) SendResponse(request, DispatchResponse::Fail("Unknown method: " + request.GetMethod())); break; } + return ""; } ProfilerImpl::DispatcherImpl::Method ProfilerImpl::DispatcherImpl::GetMethodEnum(const std::string& method) diff --git a/tooling/dynamic/agent/profiler_impl.h b/tooling/dynamic/agent/profiler_impl.h index 4361e413..34b6d651 100644 --- a/tooling/dynamic/agent/profiler_impl.h +++ b/tooling/dynamic/agent/profiler_impl.h @@ -50,7 +50,7 @@ public: : DispatcherBase(channel), profiler_(std::move(profiler)) {} ~DispatcherImpl() override = default; - void Dispatch(const DispatchRequest &request) override; + std::string Dispatch(const DispatchRequest &request, bool crossLanguageDebugging = false) override; void Enable(const DispatchRequest &request); void Disable(const DispatchRequest &request); void Start(const DispatchRequest &request); diff --git a/tooling/dynamic/agent/runtime_impl.cpp b/tooling/dynamic/agent/runtime_impl.cpp index 663623b7..b6f80e6f 100644 --- a/tooling/dynamic/agent/runtime_impl.cpp +++ b/tooling/dynamic/agent/runtime_impl.cpp @@ -26,7 +26,8 @@ void RuntimeImpl::InitializeExtendedProtocolsList() runtimeExtendedProtocols_ = std::move(runtimeProtocolList); } -void RuntimeImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) +std::string RuntimeImpl::DispatcherImpl::Dispatch(const DispatchRequest &request, + [[maybe_unused]] bool crossLanguageDebugging) { Method method = GetMethodEnum(request.GetMethod()); LOG_DEBUGGER(DEBUG) << "dispatch [" << request.GetMethod() << "] to RuntimeImpl"; @@ -38,8 +39,7 @@ void RuntimeImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) Disable(request); break; case Method::GET_PROPERTIES: - GetProperties(request); - break; + return GetProperties(request, crossLanguageDebugging); case Method::RUN_IF_WAITING_FOR_DEBUGGER: RunIfWaitingForDebugger(request); break; @@ -50,6 +50,7 @@ void RuntimeImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) SendResponse(request, DispatchResponse::Fail("unknown method: " + request.GetMethod())); break; } + return ""; } RuntimeImpl::DispatcherImpl::Method RuntimeImpl::DispatcherImpl::GetMethodEnum(const std::string& method) @@ -89,12 +90,18 @@ void RuntimeImpl::DispatcherImpl::RunIfWaitingForDebugger(const DispatchRequest SendResponse(request, response); } -void RuntimeImpl::DispatcherImpl::GetProperties(const DispatchRequest &request) +std::string RuntimeImpl::DispatcherImpl::GetProperties(const DispatchRequest &request, + [[maybe_unused]] bool crossLanguageDebugging) { std::unique_ptr params = GetPropertiesParams::Create(request.GetParams()); + int32_t callId = request.GetCallId(); if (params == nullptr) { + if (crossLanguageDebugging) { + LOG_DEBUGGER(WARN) << "DispatcherImpl::GetProperties: params is nullptr"; + return ReturnsValueToString(callId, DispatchResponseToJson(DispatchResponse::Fail("wrong params"))); + } SendResponse(request, DispatchResponse::Fail("wrong params")); - return; + return ""; } std::vector> outPropertyDesc; @@ -107,39 +114,19 @@ void RuntimeImpl::DispatcherImpl::GetProperties(const DispatchRequest &request) ASSERT(outExceptionDetails.value() != nullptr); LOG_DEBUGGER(WARN) << "GetProperties thrown an exception"; } - GetPropertiesReturns result(std::move(outPropertyDesc), - std::move(outInternalDescs), - std::move(outPrivateProperties), - std::move(outExceptionDetails)); - SendResponse(request, response, result); -} - -std::string RuntimeImpl::DispatcherImpl::GetProperties( - const int32_t callId, std::unique_ptr params) -{ - if (params == nullptr) { - LOG_DEBUGGER(WARN) << "DispatcherImpl::GetProperties: params is nullptr"; - return ReturnsValueToString(callId, DispatchResponseToJson(DispatchResponse::Fail("wrong params"))); - } - std::vector> outPropertyDesc; - std::optional>> outInternalDescs; - std::optional>> outPrivateProperties; - std::optional> outExceptionDetails; - DispatchResponse response = runtime_->GetProperties(*params, &outPropertyDesc, &outInternalDescs, - &outPrivateProperties, &outExceptionDetails); - if (outExceptionDetails) { - ASSERT(outExceptionDetails.value() != nullptr); - LOG_DEBUGGER(WARN) << "GetProperties thrown an exception"; + if (crossLanguageDebugging && !response.IsOk()) { + LOG_DEBUGGER(WARN) << "response code is not OK"; + return ReturnsValueToString(callId, DispatchResponseToJson(response)); } GetPropertiesReturns result(std::move(outPropertyDesc), std::move(outInternalDescs), std::move(outPrivateProperties), std::move(outExceptionDetails)); - if (!response.IsOk()) { - LOG_DEBUGGER(WARN) << "response code is not OK"; - return ReturnsValueToString(callId, DispatchResponseToJson(response)); + if (crossLanguageDebugging) { + return ReturnsValueToString(callId, result.ToJson()); } - return ReturnsValueToString(callId, result.ToJson()); + SendResponse(request, response, result); + return ""; } void RuntimeImpl::DispatcherImpl::GetHeapUsage(const DispatchRequest &request) diff --git a/tooling/dynamic/agent/runtime_impl.h b/tooling/dynamic/agent/runtime_impl.h index 28040df3..bb631ece 100644 --- a/tooling/dynamic/agent/runtime_impl.h +++ b/tooling/dynamic/agent/runtime_impl.h @@ -46,12 +46,11 @@ public: : DispatcherBase(channel), runtime_(std::move(runtime)) {} ~DispatcherImpl() override = default; - void Dispatch(const DispatchRequest &request) override; + std::string Dispatch(const DispatchRequest &request, bool crossLanguageDebugging = false) override; void Disable(const DispatchRequest &request); void Enable(const DispatchRequest &request); void RunIfWaitingForDebugger(const DispatchRequest &request); - void GetProperties(const DispatchRequest &request); - std::string GetProperties(const int32_t callId, std::unique_ptr params); + std::string GetProperties(const DispatchRequest &request, bool crossLanguageDebugging); void GetHeapUsage(const DispatchRequest &request); enum class Method { diff --git a/tooling/dynamic/agent/target_impl.cpp b/tooling/dynamic/agent/target_impl.cpp index 1923d9c6..54ee33c4 100755 --- a/tooling/dynamic/agent/target_impl.cpp +++ b/tooling/dynamic/agent/target_impl.cpp @@ -16,7 +16,8 @@ #include "agent/target_impl.h" namespace panda::ecmascript::tooling { -void TargetImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) +std::string TargetImpl::DispatcherImpl::Dispatch(const DispatchRequest &request, + [[maybe_unused]] bool crossLanguageDebugging) { Method method = GetMethodEnum(request.GetMethod()); LOG_DEBUGGER(INFO) << "dispatch [" << request.GetMethod() << "] to TargetImpl"; @@ -28,6 +29,7 @@ void TargetImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) SendResponse(request, DispatchResponse::Fail("Unknown method: " + request.GetMethod())); break; } + return ""; } TargetImpl::DispatcherImpl::Method TargetImpl::DispatcherImpl::GetMethodEnum(const std::string& method) diff --git a/tooling/dynamic/agent/target_impl.h b/tooling/dynamic/agent/target_impl.h index 87cbd98c..b6f4bd45 100755 --- a/tooling/dynamic/agent/target_impl.h +++ b/tooling/dynamic/agent/target_impl.h @@ -34,7 +34,7 @@ public: : DispatcherBase(channel), target_(std::move(target)) {} ~DispatcherImpl() override = default; void SetAutoAttach(const DispatchRequest &request); - void Dispatch(const DispatchRequest &request) override; + std::string Dispatch(const DispatchRequest &request, bool crossLanguageDebugging = false) override; enum class Method { SET_AUTO_ATTACH, diff --git a/tooling/dynamic/agent/tracing_impl.cpp b/tooling/dynamic/agent/tracing_impl.cpp index 49054bcc..da6cb9f1 100644 --- a/tooling/dynamic/agent/tracing_impl.cpp +++ b/tooling/dynamic/agent/tracing_impl.cpp @@ -18,7 +18,8 @@ #include "protocol_channel.h" namespace panda::ecmascript::tooling { -void TracingImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) +std::string TracingImpl::DispatcherImpl::Dispatch(const DispatchRequest &request, + [[maybe_unused]] bool crossLanguageDebugging) { Method method = GetMethodEnum(request.GetMethod()); LOG_DEBUGGER(DEBUG) << "dispatch [" << request.GetMethod() << "] to TracingImpl"; @@ -42,6 +43,7 @@ void TracingImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) SendResponse(request, DispatchResponse::Fail("Unknown method: " + request.GetMethod())); break; } + return ""; } TracingImpl::DispatcherImpl::Method TracingImpl::DispatcherImpl::GetMethodEnum(const std::string& method) diff --git a/tooling/dynamic/agent/tracing_impl.h b/tooling/dynamic/agent/tracing_impl.h index 65f730fd..38c862d1 100644 --- a/tooling/dynamic/agent/tracing_impl.h +++ b/tooling/dynamic/agent/tracing_impl.h @@ -49,7 +49,7 @@ public: DispatcherImpl(ProtocolChannel *channel, std::unique_ptr tracing) : DispatcherBase(channel), tracing_(std::move(tracing)) {} ~DispatcherImpl() override = default; - void Dispatch(const DispatchRequest &request) override; + std::string Dispatch(const DispatchRequest &request, bool crossLanguageDebugging = false) override; void End(const DispatchRequest &request); void GetCategories(const DispatchRequest &request); void RecordClockSyncMarker(const DispatchRequest &request); diff --git a/tooling/dynamic/debugger_service.cpp b/tooling/dynamic/debugger_service.cpp index 15488e3c..b61f6b47 100644 --- a/tooling/dynamic/debugger_service.cpp +++ b/tooling/dynamic/debugger_service.cpp @@ -126,7 +126,8 @@ const char* OperateDebugMessage(const ::panda::ecmascript::EcmaVM *vm, const cha if (LIKELY(handler != nullptr)) { auto dispatcher = handler->GetDispatcher(); if (LIKELY(dispatcher != nullptr)) { - auto info = dispatcher->OperateDebugMessage(message); + DispatchRequest request(message); + auto info = dispatcher->Dispatch(request, true); const char* buffer = strdup(info.c_str()); return buffer; } diff --git a/tooling/dynamic/dispatcher.cpp b/tooling/dynamic/dispatcher.cpp index 6bb6f1cb..30d4e985 100644 --- a/tooling/dynamic/dispatcher.cpp +++ b/tooling/dynamic/dispatcher.cpp @@ -208,16 +208,16 @@ Dispatcher::Dispatcher(const EcmaVM *vm, ProtocolChannel *channel) std::make_unique(channel, std::move(animation)); } -void Dispatcher::Dispatch(const DispatchRequest &request) +std::string Dispatcher::Dispatch(const DispatchRequest &request, bool crossLanguageDebugging) const { if (!request.IsValid()) { LOG_DEBUGGER(ERROR) << "Unknown request"; - return; + return ""; } const std::string &domain = request.GetDomain(); auto dispatcher = dispatchers_.find(domain); if (dispatcher != dispatchers_.end()) { - dispatcher->second->Dispatch(request); + return dispatcher->second->Dispatch(request, crossLanguageDebugging); } else { if (domain == "Test") { if (request.GetMethod() == "fail") { @@ -229,56 +229,9 @@ void Dispatcher::Dispatch(const DispatchRequest &request) LOG_DEBUGGER(ERROR) << "unknown domain: " << domain; } } -} - -std::string Dispatcher::OperateDebugMessage(const char* message) const -{ - DispatchRequest request(message); - const std::string &domain = request.GetDomain(); - auto dispatcher = dispatchers_.find(domain); - if (dispatcher == dispatchers_.end()) { - LOG_DEBUGGER(ERROR) << "unknown domain: " << domain; - return ""; - } - std::string method = request.GetMethod(); - MethodType methodType = GetMethodType(method); - switch (methodType) { - case MethodType::SAVE_ALL_POSSIBLE_BREAKPOINTS: - return SaveAllBreakpoints(request, dispatcher->second.get()); - case MethodType::REMOVE_BREAKPOINTS_BY_URL: - return RemoveBreakpoint(request, dispatcher->second.get()); - case MethodType::GET_POSSIBLE_AND_SET_BREAKPOINT_BY_URL: - return SetBreakpoint(request, dispatcher->second.get()); - case MethodType::GET_PROPERTIES: - return GetProperties(request, dispatcher->second.get()); - case MethodType::CALL_FUNCTION_ON: - return CallFunctionOn(request, dispatcher->second.get()); - case MethodType::EVALUATE_ON_CALL_FRAME: - return EvaluateOnCallFrame(request, dispatcher->second.get()); - default: - LOG_DEBUGGER(ERROR) << "unknown method: " << method; - return ""; - } return ""; } -Dispatcher::MethodType Dispatcher::GetMethodType(const std::string &method) const -{ - static const std::unordered_map methodMap = { - {"saveAllPossibleBreakpoints", MethodType::SAVE_ALL_POSSIBLE_BREAKPOINTS}, - {"removeBreakpointsByUrl", MethodType::REMOVE_BREAKPOINTS_BY_URL}, - {"getPossibleAndSetBreakpointByUrl", MethodType::GET_POSSIBLE_AND_SET_BREAKPOINT_BY_URL}, - {"getProperties", MethodType::GET_PROPERTIES}, - {"callFunctionOn", MethodType::CALL_FUNCTION_ON}, - {"evaluateOnCallFrame", MethodType::EVALUATE_ON_CALL_FRAME} - }; - auto it = methodMap.find(method); - if (it == methodMap.end()) { - LOG_DEBUGGER(ERROR) << "unknown method: " << method; - return MethodType::UNKNOWN; - } - return it->second; -} std::string Dispatcher::GetJsFrames() const { @@ -289,49 +242,4 @@ std::string Dispatcher::GetJsFrames() const } return ""; } - -std::string Dispatcher::SaveAllBreakpoints(const DispatchRequest &request, DispatcherBase *dispatcher) const -{ - auto debuggerImpl = reinterpret_cast(dispatcher); - std::unique_ptr params = - SaveAllPossibleBreakpointsParams::Create(request.GetParams()); - return debuggerImpl->SaveAllPossibleBreakpoints(request.GetCallId(), std::move(params)); -} - -std::string Dispatcher::RemoveBreakpoint(const DispatchRequest &request, DispatcherBase *dispatcher) const -{ - auto debuggerImpl = reinterpret_cast(dispatcher); - std::unique_ptr params = - RemoveBreakpointsByUrlParams::Create(request.GetParams()); - return debuggerImpl->RemoveBreakpointsByUrl(request.GetCallId(), std::move(params)); -} - -std::string Dispatcher::SetBreakpoint(const DispatchRequest &request, DispatcherBase *dispatcher) const -{ - auto debuggerImpl = reinterpret_cast(dispatcher); - std::unique_ptr params = - GetPossibleAndSetBreakpointParams::Create(request.GetParams()); - return debuggerImpl->GetPossibleAndSetBreakpointByUrl(request.GetCallId(), std::move(params)); -} - -std::string Dispatcher::GetProperties(const DispatchRequest &request, DispatcherBase *dispatcher) const -{ - auto runtimeImpl = reinterpret_cast(dispatcher); - std::unique_ptr params = GetPropertiesParams::Create(request.GetParams()); - return runtimeImpl->GetProperties(request.GetCallId(), std::move(params)); -} - -std::string Dispatcher::CallFunctionOn(const DispatchRequest &request, DispatcherBase *dispatcher) const -{ - auto debuggerImpl = reinterpret_cast(dispatcher); - std::unique_ptr params = CallFunctionOnParams::Create(request.GetParams()); - return debuggerImpl->CallFunctionOn(request.GetCallId(), std::move(params)); -} - -std::string Dispatcher::EvaluateOnCallFrame(const DispatchRequest &request, DispatcherBase *dispatcher) const -{ - auto debuggerImpl = reinterpret_cast(dispatcher); - std::unique_ptr params = EvaluateOnCallFrameParams::Create(request.GetParams()); - return debuggerImpl->EvaluateOnCallFrame(request.GetCallId(), std::move(params)); -} } // namespace panda::ecmascript::tooling diff --git a/tooling/dynamic/dispatcher.h b/tooling/dynamic/dispatcher.h index b2db05cf..cca61e01 100644 --- a/tooling/dynamic/dispatcher.h +++ b/tooling/dynamic/dispatcher.h @@ -131,7 +131,7 @@ public: { channel_ = nullptr; }; - virtual void Dispatch(const DispatchRequest &request) = 0; + virtual std::string Dispatch(const DispatchRequest &request, bool crossLanguageDebugging = false) = 0; protected: void SendResponse(const DispatchRequest &request, const DispatchResponse &response, @@ -150,29 +150,11 @@ class Dispatcher { public: explicit Dispatcher(const EcmaVM *vm, ProtocolChannel *channel); ~Dispatcher() = default; - void Dispatch(const DispatchRequest &request); + std::string Dispatch(const DispatchRequest &request, bool crossLanguageDebugging = false) const; std::string GetJsFrames() const; std::string OperateDebugMessage(const char* message) const; - enum class MethodType { - SAVE_ALL_POSSIBLE_BREAKPOINTS, - REMOVE_BREAKPOINTS_BY_URL, - GET_POSSIBLE_AND_SET_BREAKPOINT_BY_URL, - GET_PROPERTIES, - CALL_FUNCTION_ON, - EVALUATE_ON_CALL_FRAME, - UNKNOWN - }; - MethodType GetMethodType(const std::string &method) const; - private: - std::string SaveAllBreakpoints(const DispatchRequest &request, DispatcherBase *dispatcher) const; - std::string RemoveBreakpoint(const DispatchRequest &request, DispatcherBase *dispatcher) const; - std::string SetBreakpoint(const DispatchRequest &request, DispatcherBase *dispatcher) const; - std::string GetProperties(const DispatchRequest &request, DispatcherBase *dispatcher) const; - std::string CallFunctionOn(const DispatchRequest &request, DispatcherBase *dispatcher) const; - std::string EvaluateOnCallFrame(const DispatchRequest &request, DispatcherBase *dispatcher) const; - std::unordered_map> dispatchers_ {}; NO_COPY_SEMANTIC(Dispatcher); diff --git a/tooling/dynamic/test/debugger_impl_test.cpp b/tooling/dynamic/test/debugger_impl_test.cpp index 7d2b752a..9938b38d 100644 --- a/tooling/dynamic/test/debugger_impl_test.cpp +++ b/tooling/dynamic/test/debugger_impl_test.cpp @@ -355,7 +355,6 @@ HWTEST_F_L0(DebuggerImplTest, Dispatcher_Dispatch_EvaluateOnCallFrame__004) auto runtimeImpl = std::make_unique(ecmaVm, protocolChannel); auto debuggerImpl = std::make_unique(ecmaVm, protocolChannel, runtimeImpl.get()); auto dispatcherImpl = std::make_unique(protocolChannel, std::move(debuggerImpl)); - int32_t callId = 0; std::string msg = std::string() + R"({ "id":0, @@ -365,9 +364,8 @@ HWTEST_F_L0(DebuggerImplTest, Dispatcher_Dispatch_EvaluateOnCallFrame__004) "expression":"the expression" } })"; - std::unique_ptr params = - EvaluateOnCallFrameParams::Create(DispatchRequest(msg).GetParams()); - std::string result = dispatcherImpl->EvaluateOnCallFrame(callId, std::move(params)); + DispatchRequest request(msg); + std::string result = dispatcherImpl->EvaluateOnCallFrame(request, true); EXPECT_STREQ(result.c_str(), R"({"id":0,"result":{"code":1,"message":"Invalid callFrameId."}})"); if (protocolChannel) { delete protocolChannel; @@ -680,7 +678,6 @@ HWTEST_F_L0(DebuggerImplTest, Dispatcher_Dispatch_RemoveBreakpointsByUrl__003) auto runtimeImpl = std::make_unique(ecmaVm, protocolChannel); auto debuggerImpl = std::make_unique(ecmaVm, protocolChannel, runtimeImpl.get()); auto dispatcherImpl = std::make_unique(protocolChannel, std::move(debuggerImpl)); - int32_t callId = 0; std::string msg = std::string() + R"({ "id": 0, @@ -689,9 +686,8 @@ HWTEST_F_L0(DebuggerImplTest, Dispatcher_Dispatch_RemoveBreakpointsByUrl__003) "url": "entry|entry|1.0.0|src/main/ets/pages/Index.ts" } })"; - std::unique_ptr params = - RemoveBreakpointsByUrlParams::Create(DispatchRequest(msg).GetParams()); - std::string result = dispatcherImpl->RemoveBreakpointsByUrl(callId, std::move(params)); + DispatchRequest request(msg); + std::string result = dispatcherImpl->RemoveBreakpointsByUrl(request, true); EXPECT_STREQ(result.c_str(), R"({"id":0,"result":{"code":1,"message":"Unknown url"}})"); if (protocolChannel) { delete protocolChannel; @@ -705,7 +701,6 @@ HWTEST_F_L0(DebuggerImplTest, Dispatcher_Dispatch_SaveAllPossibleBreakpoints__00 auto runtimeImpl = std::make_unique(ecmaVm, protocolChannel); auto debuggerImpl = std::make_unique(ecmaVm, protocolChannel, runtimeImpl.get()); auto dispatcherImpl = std::make_unique(protocolChannel, std::move(debuggerImpl)); - int32_t callId = 0; std::string msg = std::string() + R"({ "id": 0, @@ -719,9 +714,8 @@ HWTEST_F_L0(DebuggerImplTest, Dispatcher_Dispatch_SaveAllPossibleBreakpoints__00 } } })"; - std::unique_ptr params = - SaveAllPossibleBreakpointsParams::Create(DispatchRequest(msg).GetParams()); - std::string result = dispatcherImpl->SaveAllPossibleBreakpoints(callId, std::move(params)); + DispatchRequest request(msg); + std::string result = dispatcherImpl->SaveAllPossibleBreakpoints(request, true); EXPECT_STREQ(result.c_str(), R"({"id":0,"result":{"code":1,"message":"SaveAllPossibleBreakpoints: debugger agent is not enabled"}})"); if (protocolChannel) { @@ -1424,7 +1418,6 @@ HWTEST_F_L0(DebuggerImplTest, Dispatcher_Dispatch_GetPossibleAndSetBreakpointByU auto runtimeImpl = std::make_unique(ecmaVm, protocolChannel); auto debuggerImpl = std::make_unique(ecmaVm, protocolChannel, runtimeImpl.get()); auto dispatcherImpl = std::make_unique(protocolChannel, std::move(debuggerImpl)); - int32_t callId = 0; std::string msg = std::string() + R"({ "id": 0, @@ -1437,9 +1430,8 @@ HWTEST_F_L0(DebuggerImplTest, Dispatcher_Dispatch_GetPossibleAndSetBreakpointByU }] } })"; - std::unique_ptr params = - GetPossibleAndSetBreakpointParams::Create(DispatchRequest(msg).GetParams()); - std::string result = dispatcherImpl->GetPossibleAndSetBreakpointByUrl(callId, std::move(params)); + DispatchRequest request(msg); + std::string result = dispatcherImpl->GetPossibleAndSetBreakpointByUrl(request, true); EXPECT_STREQ(result.c_str(), R"({"id":0,"result":{"code":1,"message":"GetPossibleAndSetBreakpointByUrl: debugger agent is not enabled"}})"); if (protocolChannel) { @@ -1493,13 +1485,13 @@ HWTEST_F_L0(DebuggerImplTest, DispatcherImplCallFunctionOn__001) std::string msg = std::string() + R"({"id":0,"method":"Debugger.callFunctionOn","params":{ "callFrameId":"0", "functionDeclaration":0}})"; DispatchRequest request(msg); - dispatcherImpl->CallFunctionOn(request); - ASSERT_TRUE(outStrForCallbackCheck.find("wrong params") != std::string::npos); + dispatcherImpl->CallFunctionOn(request, true); + EXPECT_STREQ(outStrForCallbackCheck.c_str(), ""); msg = std::string() + R"({"id":0,"method":"Debugger.callFunctionOn","params":{ "callFrameId":"0", "functionDeclaration":"test"}})"; DispatchRequest request1(msg); - dispatcherImpl->CallFunctionOn(request1); + dispatcherImpl->CallFunctionOn(request1, true); ASSERT_TRUE(outStrForCallbackCheck.find("Unsupport eval now") == std::string::npos); if (protocolChannel != nullptr) { delete protocolChannel; @@ -1515,9 +1507,8 @@ HWTEST_F_L0(DebuggerImplTest, DispatcherImplCallFunctionOn__002) auto dispatcherImpl = std::make_unique(protocolChannel, std::move(debuggerImpl)); std::string msg = std::string() + R"({"id":0,"method":"Debugger.callFunctionOn","params":{ "callFrameId":"0", "functionDeclaration":"test"}})"; - std::unique_ptr params = CallFunctionOnParams::Create(DispatchRequest(msg).GetParams()); - int32_t callId = 0; - std::string result = dispatcherImpl->CallFunctionOn(callId, std::move(params)); + DispatchRequest request(msg); + std::string result = dispatcherImpl->CallFunctionOn(request, true); EXPECT_STREQ(result.c_str(), R"({"id":0,"result":{"code":1,"message":"Invalid callFrameId."}})"); if (protocolChannel != nullptr) { delete protocolChannel; diff --git a/tooling/dynamic/test/dispatcher_test.cpp b/tooling/dynamic/test/dispatcher_test.cpp index 2250479d..00aed4cd 100644 --- a/tooling/dynamic/test/dispatcher_test.cpp +++ b/tooling/dynamic/test/dispatcher_test.cpp @@ -168,7 +168,8 @@ HWTEST_F_L0(DispatcherTest, SaveAllBreakpointsTest) } } })"; - result = dispatcher->OperateDebugMessage(msg.c_str()); + DispatchRequest request(msg); + result = dispatcher->Dispatch(request, true); EXPECT_STREQ(result.c_str(), R"({"id":0,"result":{"code":1,"message":"SaveAllPossibleBreakpoints: debugger agent is not enabled"}})"); if (channel) { @@ -191,7 +192,8 @@ HWTEST_F_L0(DispatcherTest, RemoveBreakpointTest) "url": "entry|entry|1.0.0|src/main/ets/pages/Index.ts" } })"; - result = dispatcher->OperateDebugMessage(msg.c_str()); + DispatchRequest request(msg); + result = dispatcher->Dispatch(request, true); EXPECT_STREQ(result.c_str(), R"({"id":0,"result":{"code":1,"message":"Unknown url"}})"); if (channel) { @@ -218,7 +220,8 @@ HWTEST_F_L0(DispatcherTest, SetBreakpointTest) }] } })"; - result = dispatcher->OperateDebugMessage(msg.c_str()); + DispatchRequest request(msg); + result = dispatcher->Dispatch(request, true); EXPECT_STREQ(result.c_str(), R"({"id":0,"result":{"code":1,"message":"GetPossibleAndSetBreakpointByUrl: debugger agent is not enabled"}})"); if (channel) { @@ -234,22 +237,27 @@ HWTEST_F_L0(DispatcherTest, OperateDebugMessageTest) std::string result = ""; std::string msg = R"({"id":0,"method":"Runtime.getProperties"})"; - result = dispatcher->OperateDebugMessage(msg.c_str()); + DispatchRequest request(msg); + result = dispatcher->Dispatch(request, true); ASSERT_TRUE(result != ""); msg = R"({"id":0,"method":"Runtime.getProperties","params":{"objectId":"1"}})"; - result = dispatcher->OperateDebugMessage(msg.c_str()); + DispatchRequest request2(msg); + result = dispatcher->Dispatch(request2, true); ASSERT_TRUE(result != ""); std::string msg2 = R"({"id":0,"method":"Debugger.callFunctionOn"})"; - result = dispatcher->OperateDebugMessage(msg2.c_str()); + DispatchRequest request3(msg2); + result = dispatcher->Dispatch(request3, true); ASSERT_TRUE(result != ""); msg2 = std::string() + R"({"id":0,"method":"Debugger.callFunctionOn","params":{ "callFrameId":"0", "functionDeclaration":"test"}})"; - result = dispatcher->OperateDebugMessage(msg2.c_str()); + DispatchRequest request4(msg2); + result = dispatcher->Dispatch(request4, true); EXPECT_STREQ(result.c_str(), R"({"id":0,"result":{"code":1,"message":"Invalid callFrameId."}})"); std::string msg3 = R"({"id":0,"method":"Debugger.evaluateOnCallFrame"})"; - result = dispatcher->OperateDebugMessage(msg3.c_str()); + DispatchRequest request5(msg3); + result = dispatcher->Dispatch(request5, true); ASSERT_TRUE(result != ""); msg3 = std::string() + R"({ @@ -260,7 +268,8 @@ HWTEST_F_L0(DispatcherTest, OperateDebugMessageTest) "expression":"the expression" } })"; - result = dispatcher->OperateDebugMessage(msg3.c_str()); + DispatchRequest request6(msg3); + result = dispatcher->Dispatch(request6, true); EXPECT_STREQ(result.c_str(), R"({"id":0,"result":{"code":1,"message":"Invalid callFrameId."}})"); if (channel) { delete channel; diff --git a/tooling/dynamic/test/runtime_impl_test.cpp b/tooling/dynamic/test/runtime_impl_test.cpp index f7d9d908..c8b56751 100644 --- a/tooling/dynamic/test/runtime_impl_test.cpp +++ b/tooling/dynamic/test/runtime_impl_test.cpp @@ -141,12 +141,12 @@ HWTEST_F_L0(RuntimeImplTest, DispatcherImplGetProperties__001) std::string msg = std::string() + R"({"id":0,"method":"Rumtime.getProperties","params":{"objectId":0}})"; DispatchRequest request(msg); - dispatcherImpl->GetProperties(request); + dispatcherImpl->GetProperties(request, false); ASSERT_TRUE(result.find("wrong params") != std::string::npos); msg = std::string() + R"({"id":0,"method":"Rumtime.getProperties","params":{"objectId":"0"}})"; DispatchRequest request1(msg); - dispatcherImpl->GetProperties(request1); + dispatcherImpl->GetProperties(request1, false); ASSERT_TRUE(result.find("Unknown object id") != std::string::npos); if (channel != nullptr) { delete channel; @@ -161,9 +161,7 @@ HWTEST_F_L0(RuntimeImplTest, DispatcherImplGetProperties__002) auto dispatcherImpl = std::make_unique(channel, std::move(runtimeImpl)); std::string msg = std::string() + R"({"id":0,"method":"Rumtime.getProperties","params":{"objectId":"0"}})"; DispatchRequest request(msg); - std::unique_ptr params = GetPropertiesParams::Create(request.GetParams()); - int32_t callId = 0; - std::string result = dispatcherImpl->GetProperties(callId, std::move(params)); + std::string result = dispatcherImpl->GetProperties(request, true); EXPECT_STREQ(result.c_str(), R"({"id":0,"result":{"code":1,"message":"Unknown object id"}})"); if (channel != nullptr) { delete channel; -- Gitee