[Lldb-commits] [lldb] [lldb] Make use of Scripted{Python, }Interface for ScriptedThreadPlan (PR #70392)
medismailben wrote: @DavidSpickett Checking! Thanks for the heads-up. https://github.com/llvm/llvm-project/pull/70392 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [lldb] Make use of Scripted{Python, }Interface for ScriptedThreadPlan (PR #70392)
DavidSpickett wrote: So in case it was confusing, the revert did fix Arm 32 bit linux as well, but it stayed red for other reasons. Also I looked into it on the same machine and got: ``` Unresolved Tests (1): lldb-api :: functionalities/thread_plan/TestThreadPlanCommands.py Failed Tests (3): lldb-api :: functionalities/completion/TestCompletion.py lldb-api :: functionalities/step_scripted/TestStepScripted.py lldb-shell :: Commands/command-stop-hook-output.test ``` Same tests as on x86. One failed with: ``` FAIL: LLDB (/home/david.spickett/build-arm/bin/clang-arm) :: test_thread_plan_actions (TestThreadPlanCommands.TestThreadPlanCommands) == ERROR: test_thread_plan_actions (TestThreadPlanCommands.TestThreadPlanCommands) -- TypeError: WrapStepOver.__init__() missing 1 required positional argument: 'dict' ``` And I see that the previous special case Python object maker thingy (can you tell I know nothing about this :) ) did pass on, or make a dict of some sort. The others seemed to be trying to create a plan, which failed (same reason I expect), then tried to use it which of course failed. https://github.com/llvm/llvm-project/pull/70392 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [lldb] Make use of Scripted{Python, }Interface for ScriptedThreadPlan (PR #70392)
https://github.com/medismailben closed https://github.com/llvm/llvm-project/pull/70392 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [lldb] Make use of Scripted{Python, }Interface for ScriptedThreadPlan (PR #70392)
https://github.com/bulbazord approved this pull request. I think all of my comments have been addressed. Thanks! https://github.com/llvm/llvm-project/pull/70392 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [lldb] Make use of Scripted{Python, }Interface for ScriptedThreadPlan (PR #70392)
@@ -104,6 +104,19 @@ ScriptInterpreter::GetStatusFromSBError(const lldb::SBError ) const { return Status(); } +Event * +ScriptInterpreter::GetOpaqueTypeFromSBEvent(const lldb::SBEvent ) const { + return event.m_opaque_ptr; +} + +Stream *ScriptInterpreter::GetOpaqueTypeFromSBStream( +const lldb::SBStream ) const { + if (stream.m_opaque_up) +return const_cast(stream).m_opaque_up.release(); medismailben wrote: Makes sense. Updated the PR. https://github.com/llvm/llvm-project/pull/70392 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [lldb] Make use of Scripted{Python, }Interface for ScriptedThreadPlan (PR #70392)
https://github.com/medismailben updated https://github.com/llvm/llvm-project/pull/70392 >From 56f95c1a16bc448d050865ba433e56af82dfbe2e Mon Sep 17 00:00:00 2001 From: Med Ismail Bennani Date: Fri, 27 Oct 2023 15:20:28 -0700 Subject: [PATCH] [lldb] Make use of Scripted{Python,}Interface for ScriptedThreadPlan This patch makes ScriptedThreadPlan conforming to the ScriptedInterface & ScriptedPythonInterface facilities by introducing 2 ScriptedThreadPlanInterface & ScriptedThreadPlanPythonInterface classes. This allows us to get rid of every ScriptedThreadPlan-specific SWIG method and re-use the same affordances as other scripting offordances, like Scripted{Process,Thread,Platform} & OperatingSystem. To do so, this adds new transformer methods for `ThreadPlan`, `Stream` & `Event`, to allow the bijection between C++ objects and their python counterparts. Signed-off-by: Med Ismail Bennani --- lldb/bindings/python/python-swigsafecast.swig | 13 +- lldb/bindings/python/python-wrapper.swig | 153 +++--- lldb/include/lldb/API/SBEvent.h | 4 +- lldb/include/lldb/API/SBStream.h | 9 ++ .../Interfaces/ScriptedInterface.h| 4 +- .../Interfaces/ScriptedThreadPlanInterface.h | 40 + .../lldb/Interpreter/ScriptInterpreter.h | 56 ++- lldb/include/lldb/Target/ThreadPlanPython.h | 2 + lldb/include/lldb/lldb-forward.h | 3 + lldb/source/Interpreter/ScriptInterpreter.cpp | 13 ++ .../Python/Interfaces/CMakeLists.txt | 1 + .../ScriptedPlatformPythonInterface.cpp | 2 + .../Interfaces/ScriptedPythonInterface.cpp| 34 .../Interfaces/ScriptedPythonInterface.h | 20 +++ .../ScriptedThreadPlanPythonInterface.cpp | 92 +++ .../ScriptedThreadPlanPythonInterface.h | 44 + .../ScriptedThreadPythonInterface.cpp | 1 + .../Python/SWIGPythonBridge.h | 21 +-- .../Python/ScriptInterpreterPython.cpp| 122 +- .../Python/ScriptInterpreterPythonImpl.h | 28 +--- lldb/source/Target/ThreadPlanPython.cpp | 92 ++- .../functionalities/step_scripted/Steps.py| 4 +- .../Python/PythonTestSuite.cpp| 45 +++--- 23 files changed, 398 insertions(+), 405 deletions(-) create mode 100644 lldb/include/lldb/Interpreter/Interfaces/ScriptedThreadPlanInterface.h create mode 100644 lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPlanPythonInterface.cpp create mode 100644 lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPlanPythonInterface.h diff --git a/lldb/bindings/python/python-swigsafecast.swig b/lldb/bindings/python/python-swigsafecast.swig index d5ea5148727134d..fba3a77d8f2df44 100644 --- a/lldb/bindings/python/python-swigsafecast.swig +++ b/lldb/bindings/python/python-swigsafecast.swig @@ -37,10 +37,6 @@ PythonObject SWIGBridge::ToSWIGWrapper(const Status& status) { return ToSWIGHelper(new lldb::SBError(status), SWIGTYPE_p_lldb__SBError); } -PythonObject SWIGBridge::ToSWIGWrapper(std::unique_ptr stream_sb) { - return ToSWIGHelper(stream_sb.release(), SWIGTYPE_p_lldb__SBStream); -} - PythonObject SWIGBridge::ToSWIGWrapper(std::unique_ptr data_sb) { return ToSWIGHelper(data_sb.release(), SWIGTYPE_p_lldb__SBStructuredData); } @@ -115,9 +111,12 @@ SWIGBridge::ToSWIGWrapper(CommandReturnObject _retobj) { SWIGTYPE_p_lldb__SBCommandReturnObject); } -ScopedPythonObject SWIGBridge::ToSWIGWrapper(Event *event) { - return ScopedPythonObject(new lldb::SBEvent(event), - SWIGTYPE_p_lldb__SBEvent); +PythonObject SWIGBridge::ToSWIGWrapper(const Stream *s) { + return ToSWIGHelper(new lldb::SBStream(), SWIGTYPE_p_lldb__SBStream); +} + +PythonObject SWIGBridge::ToSWIGWrapper(Event *event) { + return ToSWIGHelper(new lldb::SBEvent(event), SWIGTYPE_p_lldb__SBEvent); } PythonObject SWIGBridge::ToSWIGWrapper( diff --git a/lldb/bindings/python/python-wrapper.swig b/lldb/bindings/python/python-wrapper.swig index 17bc7b1f2198709..5c28d652824073a 100644 --- a/lldb/bindings/python/python-wrapper.swig +++ b/lldb/bindings/python/python-wrapper.swig @@ -229,133 +229,6 @@ PythonObject lldb_private::python::SWIGBridge::LLDBSwigPythonCreateCommandObject return pfunc(SWIGBridge::ToSWIGWrapper(std::move(debugger_sp)), dict); } -PythonObject lldb_private::python::SWIGBridge::LLDBSwigPythonCreateScriptedThreadPlan( -const char *python_class_name, const char *session_dictionary_name, -const lldb_private::StructuredDataImpl _impl, -std::string _string, const lldb::ThreadPlanSP _plan_sp) { - if (python_class_name == NULL || python_class_name[0] == '\0' || - !session_dictionary_name) -return PythonObject(); - - PyErr_Cleaner py_err_cleaner(true); - - auto dict = PythonModule::MainModule().ResolveName( - session_dictionary_name); - auto pfunc =
[Lldb-commits] [lldb] [lldb] Make use of Scripted{Python, }Interface for ScriptedThreadPlan (PR #70392)
@@ -104,6 +104,19 @@ ScriptInterpreter::GetStatusFromSBError(const lldb::SBError ) const { return Status(); } +Event * +ScriptInterpreter::GetOpaqueTypeFromSBEvent(const lldb::SBEvent ) const { + return event.m_opaque_ptr; +} + +Stream *ScriptInterpreter::GetOpaqueTypeFromSBStream( +const lldb::SBStream ) const { + if (stream.m_opaque_up) +return const_cast(stream).m_opaque_up.release(); bulbazord wrote: I'm having a hard time wrapping my head around the SBStream portion of your patch (everything else makes sense). So we pass in a `const SBStream &` to `GetOpaqueTypeFromSBStream` which that takes ownership of the underlying `Stream *` and returns it. What happens to the original SBStream argument? Can we guarantee that nothing ever tries to use it again afterwards? It looks like the intent in `ReverseTransform` is to take ownership of the original user-provided stream and write its contents to some other stream `original_arg` after performing some kind of copy on it. Instead of taking ownership of the underlying stream (and invalidating its argument), why not just use `.get()` instead of `.release()`? The `SBStream` passed in here won't be invalidated and `original_arg` in `ReverseTransform` can still get the data out of the Python `SBStream` object. What am I missing? https://github.com/llvm/llvm-project/pull/70392 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [lldb] Make use of Scripted{Python, }Interface for ScriptedThreadPlan (PR #70392)
https://github.com/medismailben updated https://github.com/llvm/llvm-project/pull/70392 >From 086c5f8a4056f027377e490c0387f2d1344cb5db Mon Sep 17 00:00:00 2001 From: Med Ismail Bennani Date: Fri, 27 Oct 2023 12:13:00 -0700 Subject: [PATCH] [lldb] Make use of Scripted{Python,}Interface for ScriptedThreadPlan This patch makes ScriptedThreadPlan conforming to the ScriptedInterface & ScriptedPythonInterface facilities by introducing 2 ScriptedThreadPlanInterface & ScriptedThreadPlanPythonInterface classes. This allows us to get rid of every ScriptedThreadPlan-specific SWIG method and re-use the same affordances as other scripting offordances, like Scripted{Process,Thread,Platform} & OperatingSystem. To do so, this adds new transformer methods for `ThreadPlan`, `Stream` & `Event`, to allow the bijection between C++ objects and their python counterparts. Signed-off-by: Med Ismail Bennani --- lldb/bindings/python/python-swigsafecast.swig | 13 +- lldb/bindings/python/python-wrapper.swig | 153 +++--- lldb/include/lldb/API/SBEvent.h | 4 +- lldb/include/lldb/API/SBStream.h | 9 ++ .../Interfaces/ScriptedInterface.h| 4 +- .../Interfaces/ScriptedThreadPlanInterface.h | 40 + .../lldb/Interpreter/ScriptInterpreter.h | 56 ++- lldb/include/lldb/Target/ThreadPlanPython.h | 2 + lldb/include/lldb/lldb-forward.h | 3 + lldb/source/Interpreter/ScriptInterpreter.cpp | 13 ++ .../Python/Interfaces/CMakeLists.txt | 1 + .../ScriptedPlatformPythonInterface.cpp | 2 + .../Interfaces/ScriptedPythonInterface.cpp| 34 .../Interfaces/ScriptedPythonInterface.h | 20 +++ .../ScriptedThreadPlanPythonInterface.cpp | 92 +++ .../ScriptedThreadPlanPythonInterface.h | 44 + .../ScriptedThreadPythonInterface.cpp | 1 + .../Python/SWIGPythonBridge.h | 21 +-- .../Python/ScriptInterpreterPython.cpp| 122 +- .../Python/ScriptInterpreterPythonImpl.h | 28 +--- lldb/source/Target/ThreadPlanPython.cpp | 92 ++- .../functionalities/step_scripted/Steps.py| 4 +- .../Python/PythonTestSuite.cpp| 45 +++--- 23 files changed, 398 insertions(+), 405 deletions(-) create mode 100644 lldb/include/lldb/Interpreter/Interfaces/ScriptedThreadPlanInterface.h create mode 100644 lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPlanPythonInterface.cpp create mode 100644 lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPlanPythonInterface.h diff --git a/lldb/bindings/python/python-swigsafecast.swig b/lldb/bindings/python/python-swigsafecast.swig index d5ea5148727134d..fba3a77d8f2df44 100644 --- a/lldb/bindings/python/python-swigsafecast.swig +++ b/lldb/bindings/python/python-swigsafecast.swig @@ -37,10 +37,6 @@ PythonObject SWIGBridge::ToSWIGWrapper(const Status& status) { return ToSWIGHelper(new lldb::SBError(status), SWIGTYPE_p_lldb__SBError); } -PythonObject SWIGBridge::ToSWIGWrapper(std::unique_ptr stream_sb) { - return ToSWIGHelper(stream_sb.release(), SWIGTYPE_p_lldb__SBStream); -} - PythonObject SWIGBridge::ToSWIGWrapper(std::unique_ptr data_sb) { return ToSWIGHelper(data_sb.release(), SWIGTYPE_p_lldb__SBStructuredData); } @@ -115,9 +111,12 @@ SWIGBridge::ToSWIGWrapper(CommandReturnObject _retobj) { SWIGTYPE_p_lldb__SBCommandReturnObject); } -ScopedPythonObject SWIGBridge::ToSWIGWrapper(Event *event) { - return ScopedPythonObject(new lldb::SBEvent(event), - SWIGTYPE_p_lldb__SBEvent); +PythonObject SWIGBridge::ToSWIGWrapper(const Stream *s) { + return ToSWIGHelper(new lldb::SBStream(), SWIGTYPE_p_lldb__SBStream); +} + +PythonObject SWIGBridge::ToSWIGWrapper(Event *event) { + return ToSWIGHelper(new lldb::SBEvent(event), SWIGTYPE_p_lldb__SBEvent); } PythonObject SWIGBridge::ToSWIGWrapper( diff --git a/lldb/bindings/python/python-wrapper.swig b/lldb/bindings/python/python-wrapper.swig index 17bc7b1f2198709..5c28d652824073a 100644 --- a/lldb/bindings/python/python-wrapper.swig +++ b/lldb/bindings/python/python-wrapper.swig @@ -229,133 +229,6 @@ PythonObject lldb_private::python::SWIGBridge::LLDBSwigPythonCreateCommandObject return pfunc(SWIGBridge::ToSWIGWrapper(std::move(debugger_sp)), dict); } -PythonObject lldb_private::python::SWIGBridge::LLDBSwigPythonCreateScriptedThreadPlan( -const char *python_class_name, const char *session_dictionary_name, -const lldb_private::StructuredDataImpl _impl, -std::string _string, const lldb::ThreadPlanSP _plan_sp) { - if (python_class_name == NULL || python_class_name[0] == '\0' || - !session_dictionary_name) -return PythonObject(); - - PyErr_Cleaner py_err_cleaner(true); - - auto dict = PythonModule::MainModule().ResolveName( - session_dictionary_name); - auto pfunc =
[Lldb-commits] [lldb] [lldb] Make use of Scripted{Python, }Interface for ScriptedThreadPlan (PR #70392)
@@ -104,6 +104,19 @@ ScriptInterpreter::GetStatusFromSBError(const lldb::SBError ) const { return Status(); } +Event * +ScriptInterpreter::GetOpaqueTypeFromSBEvent(const lldb::SBEvent ) const { + return event.m_opaque_ptr; +} + +Stream *ScriptInterpreter::GetOpaqueTypeFromSBStream( +const lldb::SBStream ) const { + if (stream.m_opaque_up) +return const_cast(stream).m_opaque_up.release(); medismailben wrote: `lldb::SBStream` have different semantics than other classes, as it uses a unique_ptr to point to its opaque type and also `lldb_private::Stream` is an abstract type so the only way to get the underlying object is to do this. Let me know if you can think of a better way of doing it. https://github.com/llvm/llvm-project/pull/70392 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [lldb] Make use of Scripted{Python, }Interface for ScriptedThreadPlan (PR #70392)
@@ -0,0 +1,92 @@ +//===-- ScriptedThreadPlanPythonInterface.cpp -===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===--===// + +#include "lldb/Host/Config.h" +#include "lldb/Utility/Log.h" +#include "lldb/lldb-enumerations.h" + +#if LLDB_ENABLE_PYTHON + +// LLDB Python header must be included first +#include "../lldb-python.h" + +#include "../SWIGPythonBridge.h" +#include "../ScriptInterpreterPythonImpl.h" +#include "ScriptedThreadPlanPythonInterface.h" + +using namespace lldb; +using namespace lldb_private; +using namespace lldb_private::python; + +ScriptedThreadPlanPythonInterface::ScriptedThreadPlanPythonInterface( +ScriptInterpreterPythonImpl ) +: ScriptedThreadPlanInterface(), ScriptedPythonInterface(interpreter) {} + +llvm::Expected +ScriptedThreadPlanPythonInterface::CreatePluginObject( +const llvm::StringRef class_name, lldb::ThreadPlanSP thread_plan_sp, +const StructuredDataImpl _sp) { + return ScriptedPythonInterface::CreatePluginObject(class_name, nullptr, + thread_plan_sp, args_sp); +} + +llvm::Expected +ScriptedThreadPlanPythonInterface::ExplainsStop(Event *event) { + Status error; + StructuredData::ObjectSP obj = Dispatch("explains_stop", error, event); + + if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) +return error.ToError(); + + return obj->GetBooleanValue(); +} + +llvm::Expected +ScriptedThreadPlanPythonInterface::ShouldStop(Event *event) { + Status error; + StructuredData::ObjectSP obj = Dispatch("should_stop", error, event); + + if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) +return error.ToError(); + + return obj->GetBooleanValue(); +} + +llvm::Expected ScriptedThreadPlanPythonInterface::IsStale() { + Status error; + StructuredData::ObjectSP obj = Dispatch("is_stale", error); + + if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) +return error.ToError(); + + return obj->GetBooleanValue(); +} + +lldb::StateType ScriptedThreadPlanPythonInterface::GetRunState() { + Status error; + StructuredData::ObjectSP obj = Dispatch("should_step", error); medismailben wrote: Yep, but that's stable API at this point, can't change it at this time https://github.com/llvm/llvm-project/pull/70392 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [lldb] Make use of Scripted{Python, }Interface for ScriptedThreadPlan (PR #70392)
https://github.com/medismailben edited https://github.com/llvm/llvm-project/pull/70392 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [lldb] Make use of Scripted{Python, }Interface for ScriptedThreadPlan (PR #70392)
@@ -0,0 +1,40 @@ +//===-- ScriptedThreadInterface.h ---*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===--===// + +#ifndef LLDB_INTERPRETER_INTERFACES_SCRIPTEDTHREADPLANINTERFACE_H +#define LLDB_INTERPRETER_INTERFACES_SCRIPTEDTHREADPLANINTERFACE_H + +#include "lldb/lldb-private.h" + +#include "ScriptedInterface.h" + +namespace lldb_private { +class ScriptedThreadPlanInterface : public ScriptedInterface { +public: + virtual llvm::Expected + CreatePluginObject(llvm::StringRef class_name, + lldb::ThreadPlanSP thread_plan_sp, + const StructuredDataImpl _sp) { +llvm_unreachable("unimplemented!"); + } + + virtual llvm::Expected ExplainsStop(Event *event) { return true; } + + virtual llvm::Expected ShouldStop(Event *event) { return true; } + + virtual llvm::Expected IsStale() { return true; }; + + virtual lldb::StateType GetRunState() { return lldb::eStateStepping; } + + virtual llvm::Expected GetStopDescription(lldb_private::Stream *s) { +return true; medismailben wrote: Same answer as in https://github.com/llvm/llvm-project/pull/68052#discussion_r1372058327. https://github.com/llvm/llvm-project/pull/70392 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [lldb] Make use of Scripted{Python, }Interface for ScriptedThreadPlan (PR #70392)
@@ -104,6 +104,19 @@ ScriptInterpreter::GetStatusFromSBError(const lldb::SBError ) const { return Status(); } +Event * +ScriptInterpreter::GetOpaqueTypeFromSBEvent(const lldb::SBEvent ) const { + return event.m_opaque_ptr; +} + +Stream *ScriptInterpreter::GetOpaqueTypeFromSBStream( +const lldb::SBStream ) const { + if (stream.m_opaque_up) +return const_cast(stream).m_opaque_up.release(); bulbazord wrote: This feels a little sketchy to me... `GetOpaqueTypeFromSBStream` is taking ownership of the underlying pointer and returning it to the caller. The `SBStream` that gets passed in is no longer valid. Is this intentional? That would mean this function -- and only this function -- has different semantics from the other `GetOpaqueTypeFromSBClass` functions. https://github.com/llvm/llvm-project/pull/70392 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [lldb] Make use of Scripted{Python, }Interface for ScriptedThreadPlan (PR #70392)
https://github.com/bulbazord edited https://github.com/llvm/llvm-project/pull/70392 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [lldb] Make use of Scripted{Python, }Interface for ScriptedThreadPlan (PR #70392)
@@ -0,0 +1,40 @@ +//===-- ScriptedThreadInterface.h ---*- C++ -*-===// bulbazord wrote: The header is missing the world `Plan` https://github.com/llvm/llvm-project/pull/70392 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [lldb] Make use of Scripted{Python, }Interface for ScriptedThreadPlan (PR #70392)
@@ -0,0 +1,40 @@ +//===-- ScriptedThreadInterface.h ---*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===--===// + +#ifndef LLDB_INTERPRETER_INTERFACES_SCRIPTEDTHREADPLANINTERFACE_H +#define LLDB_INTERPRETER_INTERFACES_SCRIPTEDTHREADPLANINTERFACE_H + +#include "lldb/lldb-private.h" + +#include "ScriptedInterface.h" + +namespace lldb_private { +class ScriptedThreadPlanInterface : public ScriptedInterface { +public: + virtual llvm::Expected + CreatePluginObject(llvm::StringRef class_name, + lldb::ThreadPlanSP thread_plan_sp, + const StructuredDataImpl _sp) { +llvm_unreachable("unimplemented!"); + } + + virtual llvm::Expected ExplainsStop(Event *event) { return true; } + + virtual llvm::Expected ShouldStop(Event *event) { return true; } + + virtual llvm::Expected IsStale() { return true; }; + + virtual lldb::StateType GetRunState() { return lldb::eStateStepping; } + + virtual llvm::Expected GetStopDescription(lldb_private::Stream *s) { +return true; bulbazord wrote: Why not make all of these pure virtual methods? https://github.com/llvm/llvm-project/pull/70392 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [lldb] Make use of Scripted{Python, }Interface for ScriptedThreadPlan (PR #70392)
@@ -0,0 +1,92 @@ +//===-- ScriptedThreadPlanPythonInterface.cpp -===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===--===// + +#include "lldb/Host/Config.h" +#include "lldb/Utility/Log.h" +#include "lldb/lldb-enumerations.h" + +#if LLDB_ENABLE_PYTHON + +// LLDB Python header must be included first +#include "../lldb-python.h" + +#include "../SWIGPythonBridge.h" +#include "../ScriptInterpreterPythonImpl.h" +#include "ScriptedThreadPlanPythonInterface.h" + +using namespace lldb; +using namespace lldb_private; +using namespace lldb_private::python; + +ScriptedThreadPlanPythonInterface::ScriptedThreadPlanPythonInterface( +ScriptInterpreterPythonImpl ) +: ScriptedThreadPlanInterface(), ScriptedPythonInterface(interpreter) {} + +llvm::Expected +ScriptedThreadPlanPythonInterface::CreatePluginObject( +const llvm::StringRef class_name, lldb::ThreadPlanSP thread_plan_sp, +const StructuredDataImpl _sp) { + return ScriptedPythonInterface::CreatePluginObject(class_name, nullptr, + thread_plan_sp, args_sp); +} + +llvm::Expected +ScriptedThreadPlanPythonInterface::ExplainsStop(Event *event) { + Status error; + StructuredData::ObjectSP obj = Dispatch("explains_stop", error, event); + + if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) +return error.ToError(); + + return obj->GetBooleanValue(); +} + +llvm::Expected +ScriptedThreadPlanPythonInterface::ShouldStop(Event *event) { + Status error; + StructuredData::ObjectSP obj = Dispatch("should_stop", error, event); + + if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) +return error.ToError(); + + return obj->GetBooleanValue(); +} + +llvm::Expected ScriptedThreadPlanPythonInterface::IsStale() { + Status error; + StructuredData::ObjectSP obj = Dispatch("is_stale", error); + + if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) +return error.ToError(); + + return obj->GetBooleanValue(); +} + +lldb::StateType ScriptedThreadPlanPythonInterface::GetRunState() { + Status error; + StructuredData::ObjectSP obj = Dispatch("should_step", error); bulbazord wrote: You don't need to do anything but `should_step` is so close to `should_stop`... https://github.com/llvm/llvm-project/pull/70392 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [lldb] Make use of Scripted{Python, }Interface for ScriptedThreadPlan (PR #70392)
https://github.com/medismailben updated https://github.com/llvm/llvm-project/pull/70392 >From 836bafbf3956750c99d38814a4a0a445f9136141 Mon Sep 17 00:00:00 2001 From: Med Ismail Bennani Date: Thu, 26 Oct 2023 16:35:53 -0700 Subject: [PATCH] [lldb] Make use of Scripted{Python,}Interface for ScriptedThreadPlan This patch makes ScriptedThreadPlan conforming to the ScriptedInterface & ScriptedPythonInterface facilities by introducing 2 ScriptedThreadPlanInterface & ScriptedThreadPlanPythonInterface classes. This allows us to get rid of every ScriptedThreadPlan-specific SWIG method and re-use the same affordances as other scripting offordances, like Scripted{Process,Thread,Platform} & OperatingSystem. To do so, this adds new transformer methods for `ThreadPlan`, `Stream` & `Event`, to allow the bijection between C++ objects and their python counterparts. Signed-off-by: Med Ismail Bennani --- lldb/bindings/python/python-swigsafecast.swig | 13 +- lldb/bindings/python/python-wrapper.swig | 153 +++--- lldb/include/lldb/API/SBEvent.h | 4 +- lldb/include/lldb/API/SBStream.h | 9 ++ .../Interfaces/ScriptedInterface.h| 9 +- .../Interfaces/ScriptedThreadPlanInterface.h | 40 + .../lldb/Interpreter/ScriptInterpreter.h | 56 ++- lldb/include/lldb/Target/ThreadPlanPython.h | 2 + lldb/include/lldb/lldb-forward.h | 3 + lldb/source/Interpreter/ScriptInterpreter.cpp | 13 ++ .../Python/Interfaces/CMakeLists.txt | 1 + .../ScriptedPlatformPythonInterface.cpp | 2 + .../Interfaces/ScriptedPythonInterface.cpp| 34 .../Interfaces/ScriptedPythonInterface.h | 20 +++ .../ScriptedThreadPlanPythonInterface.cpp | 92 +++ .../ScriptedThreadPlanPythonInterface.h | 44 + .../ScriptedThreadPythonInterface.cpp | 1 + .../Python/SWIGPythonBridge.h | 21 +-- .../Python/ScriptInterpreterPython.cpp| 122 +- .../Python/ScriptInterpreterPythonImpl.h | 28 +--- lldb/source/Target/ThreadPlanPython.cpp | 92 ++- .../functionalities/step_scripted/Steps.py| 4 +- .../Python/PythonTestSuite.cpp| 45 +++--- 23 files changed, 398 insertions(+), 410 deletions(-) create mode 100644 lldb/include/lldb/Interpreter/Interfaces/ScriptedThreadPlanInterface.h create mode 100644 lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPlanPythonInterface.cpp create mode 100644 lldb/source/Plugins/ScriptInterpreter/Python/Interfaces/ScriptedThreadPlanPythonInterface.h diff --git a/lldb/bindings/python/python-swigsafecast.swig b/lldb/bindings/python/python-swigsafecast.swig index d5ea5148727134d..fba3a77d8f2df44 100644 --- a/lldb/bindings/python/python-swigsafecast.swig +++ b/lldb/bindings/python/python-swigsafecast.swig @@ -37,10 +37,6 @@ PythonObject SWIGBridge::ToSWIGWrapper(const Status& status) { return ToSWIGHelper(new lldb::SBError(status), SWIGTYPE_p_lldb__SBError); } -PythonObject SWIGBridge::ToSWIGWrapper(std::unique_ptr stream_sb) { - return ToSWIGHelper(stream_sb.release(), SWIGTYPE_p_lldb__SBStream); -} - PythonObject SWIGBridge::ToSWIGWrapper(std::unique_ptr data_sb) { return ToSWIGHelper(data_sb.release(), SWIGTYPE_p_lldb__SBStructuredData); } @@ -115,9 +111,12 @@ SWIGBridge::ToSWIGWrapper(CommandReturnObject _retobj) { SWIGTYPE_p_lldb__SBCommandReturnObject); } -ScopedPythonObject SWIGBridge::ToSWIGWrapper(Event *event) { - return ScopedPythonObject(new lldb::SBEvent(event), - SWIGTYPE_p_lldb__SBEvent); +PythonObject SWIGBridge::ToSWIGWrapper(const Stream *s) { + return ToSWIGHelper(new lldb::SBStream(), SWIGTYPE_p_lldb__SBStream); +} + +PythonObject SWIGBridge::ToSWIGWrapper(Event *event) { + return ToSWIGHelper(new lldb::SBEvent(event), SWIGTYPE_p_lldb__SBEvent); } PythonObject SWIGBridge::ToSWIGWrapper( diff --git a/lldb/bindings/python/python-wrapper.swig b/lldb/bindings/python/python-wrapper.swig index 17bc7b1f2198709..5c28d652824073a 100644 --- a/lldb/bindings/python/python-wrapper.swig +++ b/lldb/bindings/python/python-wrapper.swig @@ -229,133 +229,6 @@ PythonObject lldb_private::python::SWIGBridge::LLDBSwigPythonCreateCommandObject return pfunc(SWIGBridge::ToSWIGWrapper(std::move(debugger_sp)), dict); } -PythonObject lldb_private::python::SWIGBridge::LLDBSwigPythonCreateScriptedThreadPlan( -const char *python_class_name, const char *session_dictionary_name, -const lldb_private::StructuredDataImpl _impl, -std::string _string, const lldb::ThreadPlanSP _plan_sp) { - if (python_class_name == NULL || python_class_name[0] == '\0' || - !session_dictionary_name) -return PythonObject(); - - PyErr_Cleaner py_err_cleaner(true); - - auto dict = PythonModule::MainModule().ResolveName( - session_dictionary_name); - auto pfunc =
[Lldb-commits] [lldb] [lldb] Make use of Scripted{Python, }Interface for ScriptedThreadPlan (PR #70392)
https://github.com/medismailben edited https://github.com/llvm/llvm-project/pull/70392 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits