Skip to content

Commit 6eafe2c

Browse files
committed
Revert "[lldb] Make use of Scripted{Python,}Interface for ScriptedThreadPlan (#70392)"
This reverts commit 4b3cd37 since it introduces some test failures: https://lab.llvm.org/buildbot/#/builders/68/builds/62556
1 parent 2b7ba01 commit 6eafe2c

23 files changed

+407
-401
lines changed

lldb/bindings/python/python-swigsafecast.swig

+7-6
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ PythonObject SWIGBridge::ToSWIGWrapper(const Status& status) {
3737
return ToSWIGHelper(new lldb::SBError(status), SWIGTYPE_p_lldb__SBError);
3838
}
3939

40+
PythonObject SWIGBridge::ToSWIGWrapper(std::unique_ptr<lldb::SBStream> stream_sb) {
41+
return ToSWIGHelper(stream_sb.release(), SWIGTYPE_p_lldb__SBStream);
42+
}
43+
4044
PythonObject SWIGBridge::ToSWIGWrapper(std::unique_ptr<lldb::SBStructuredData> data_sb) {
4145
return ToSWIGHelper(data_sb.release(), SWIGTYPE_p_lldb__SBStructuredData);
4246
}
@@ -111,12 +115,9 @@ SWIGBridge::ToSWIGWrapper(CommandReturnObject &cmd_retobj) {
111115
SWIGTYPE_p_lldb__SBCommandReturnObject);
112116
}
113117

114-
PythonObject SWIGBridge::ToSWIGWrapper(const Stream *s) {
115-
return ToSWIGHelper(new lldb::SBStream(), SWIGTYPE_p_lldb__SBStream);
116-
}
117-
118-
PythonObject SWIGBridge::ToSWIGWrapper(Event *event) {
119-
return ToSWIGHelper(new lldb::SBEvent(event), SWIGTYPE_p_lldb__SBEvent);
118+
ScopedPythonObject<lldb::SBEvent> SWIGBridge::ToSWIGWrapper(Event *event) {
119+
return ScopedPythonObject<lldb::SBEvent>(new lldb::SBEvent(event),
120+
SWIGTYPE_p_lldb__SBEvent);
120121
}
121122

122123
PythonObject SWIGBridge::ToSWIGWrapper(

lldb/bindings/python/python-wrapper.swig

+128-25
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,133 @@ PythonObject lldb_private::python::SWIGBridge::LLDBSwigPythonCreateCommandObject
229229
return pfunc(SWIGBridge::ToSWIGWrapper(std::move(debugger_sp)), dict);
230230
}
231231

232+
PythonObject lldb_private::python::SWIGBridge::LLDBSwigPythonCreateScriptedThreadPlan(
233+
const char *python_class_name, const char *session_dictionary_name,
234+
const lldb_private::StructuredDataImpl &args_impl,
235+
std::string &error_string, const lldb::ThreadPlanSP &thread_plan_sp) {
236+
if (python_class_name == NULL || python_class_name[0] == '\0' ||
237+
!session_dictionary_name)
238+
return PythonObject();
239+
240+
PyErr_Cleaner py_err_cleaner(true);
241+
242+
auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(
243+
session_dictionary_name);
244+
auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(
245+
python_class_name, dict);
246+
247+
if (!pfunc.IsAllocated()) {
248+
error_string.append("could not find script class: ");
249+
error_string.append(python_class_name);
250+
return PythonObject();
251+
}
252+
253+
PythonObject tp_arg = SWIGBridge::ToSWIGWrapper(thread_plan_sp);
254+
255+
llvm::Expected<PythonCallable::ArgInfo> arg_info = pfunc.GetArgInfo();
256+
if (!arg_info) {
257+
llvm::handleAllErrors(
258+
arg_info.takeError(),
259+
[&](PythonException &E) { error_string.append(E.ReadBacktrace()); },
260+
[&](const llvm::ErrorInfoBase &E) {
261+
error_string.append(E.message());
262+
});
263+
return PythonObject();
264+
}
265+
266+
PythonObject result = {};
267+
auto args_sb = std::unique_ptr<lldb::SBStructuredData>(new lldb::SBStructuredData(args_impl));
268+
if (arg_info.get().max_positional_args == 2) {
269+
if (args_sb->IsValid()) {
270+
error_string.assign(
271+
"args passed, but __init__ does not take an args dictionary");
272+
return PythonObject();
273+
}
274+
result = pfunc(tp_arg, dict);
275+
} else if (arg_info.get().max_positional_args >= 3) {
276+
result = pfunc(tp_arg, SWIGBridge::ToSWIGWrapper(std::move(args_sb)), dict);
277+
} else {
278+
error_string.assign("wrong number of arguments in __init__, should be 2 or "
279+
"3 (not including self)");
280+
return PythonObject();
281+
}
282+
283+
// FIXME: At this point we should check that the class we found supports all
284+
// the methods that we need.
285+
286+
return result;
287+
}
288+
289+
bool lldb_private::python::SWIGBridge::LLDBSWIGPythonCallThreadPlan(
290+
void *implementor, const char *method_name, lldb_private::Event *event,
291+
bool &got_error) {
292+
got_error = false;
293+
294+
PyErr_Cleaner py_err_cleaner(false);
295+
PythonObject self(PyRefType::Borrowed, static_cast<PyObject *>(implementor));
296+
auto pfunc = self.ResolveName<PythonCallable>(method_name);
297+
298+
if (!pfunc.IsAllocated())
299+
return false;
300+
301+
PythonObject result;
302+
if (event != nullptr) {
303+
ScopedPythonObject<SBEvent> event_arg = SWIGBridge::ToSWIGWrapper(event);
304+
result = pfunc(event_arg.obj());
305+
} else
306+
result = pfunc();
307+
308+
if (PyErr_Occurred()) {
309+
got_error = true;
310+
printf("Return value was neither false nor true for call to %s.\n",
311+
method_name);
312+
PyErr_Print();
313+
return false;
314+
}
315+
316+
if (result.get() == Py_True)
317+
return true;
318+
else if (result.get() == Py_False)
319+
return false;
320+
321+
// Somebody returned the wrong thing...
322+
got_error = true;
323+
printf("Wrong return value type for call to %s.\n", method_name);
324+
return false;
325+
}
326+
327+
bool lldb_private::python::SWIGBridge::LLDBSWIGPythonCallThreadPlan(
328+
void *implementor, const char *method_name, lldb_private::Stream *stream,
329+
bool &got_error) {
330+
got_error = false;
331+
332+
PyErr_Cleaner py_err_cleaner(false);
333+
PythonObject self(PyRefType::Borrowed, static_cast<PyObject *>(implementor));
334+
auto pfunc = self.ResolveName<PythonCallable>(method_name);
335+
336+
if (!pfunc.IsAllocated())
337+
return false;
338+
339+
auto *sb_stream = new lldb::SBStream();
340+
PythonObject sb_stream_arg =
341+
SWIGBridge::ToSWIGWrapper(std::unique_ptr<lldb::SBStream>(sb_stream));
342+
343+
PythonObject result;
344+
result = pfunc(sb_stream_arg);
345+
346+
if (PyErr_Occurred()) {
347+
printf("Error occured for call to %s.\n",
348+
method_name);
349+
PyErr_Print();
350+
got_error = true;
351+
return false;
352+
}
353+
if (stream)
354+
stream->PutCString(sb_stream->GetData());
355+
return true;
356+
357+
}
358+
232359
PythonObject lldb_private::python::SWIGBridge::LLDBSwigPythonCreateScriptedBreakpointResolver(
233360
const char *python_class_name, const char *session_dictionary_name,
234361
const StructuredDataImpl &args_impl,
@@ -375,7 +502,7 @@ bool lldb_private::python::SWIGBridge::LLDBSwigPythonStopHookCallHandleStop(
375502

376503
auto *sb_stream = new lldb::SBStream();
377504
PythonObject sb_stream_arg =
378-
SWIGBridge::ToSWIGWrapper(stream.get());
505+
SWIGBridge::ToSWIGWrapper(std::unique_ptr<lldb::SBStream>(sb_stream));
379506
PythonObject result =
380507
pfunc(SWIGBridge::ToSWIGWrapper(std::move(exc_ctx_sp)), sb_stream_arg);
381508

@@ -626,30 +753,6 @@ void *lldb_private::python::LLDBSWIGPython_CastPyObjectToSBError(PyObject * data
626753
return sb_ptr;
627754
}
628755

629-
void *lldb_private::python::LLDBSWIGPython_CastPyObjectToSBEvent(PyObject * data) {
630-
lldb::SBEvent *sb_ptr = nullptr;
631-
632-
int valid_cast =
633-
SWIG_ConvertPtr(data, (void **)&sb_ptr, SWIGTYPE_p_lldb__SBEvent, 0);
634-
635-
if (valid_cast == -1)
636-
return NULL;
637-
638-
return sb_ptr;
639-
}
640-
641-
void *lldb_private::python::LLDBSWIGPython_CastPyObjectToSBStream(PyObject * data) {
642-
lldb::SBStream *sb_ptr = nullptr;
643-
644-
int valid_cast =
645-
SWIG_ConvertPtr(data, (void **)&sb_ptr, SWIGTYPE_p_lldb__SBStream, 0);
646-
647-
if (valid_cast == -1)
648-
return NULL;
649-
650-
return sb_ptr;
651-
}
652-
653756
void *lldb_private::python::LLDBSWIGPython_CastPyObjectToSBValue(PyObject * data) {
654757
lldb::SBValue *sb_ptr = NULL;
655758

lldb/include/lldb/API/SBEvent.h

+1-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
#include <vector>
1616

1717
namespace lldb_private {
18-
class ScriptInterpreter;
1918
namespace python {
2019
class SWIGBridge;
2120
}
@@ -74,12 +73,11 @@ class LLDB_API SBEvent {
7473
friend class SBThread;
7574
friend class SBWatchpoint;
7675

77-
friend class lldb_private::ScriptInterpreter;
7876
friend class lldb_private::python::SWIGBridge;
7977

8078
SBEvent(lldb::EventSP &event_sp);
8179

82-
SBEvent(lldb_private::Event *event);
80+
SBEvent(lldb_private::Event *event_sp);
8381

8482
lldb::EventSP &GetSP() const;
8583

lldb/include/lldb/API/SBStream.h

-9
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,6 @@
1313

1414
#include "lldb/API/SBDefines.h"
1515

16-
namespace lldb_private {
17-
class ScriptInterpreter;
18-
namespace python {
19-
class SWIGBridge;
20-
}
21-
} // namespace lldb_private
22-
2316
namespace lldb {
2417

2518
class LLDB_API SBStream {
@@ -108,8 +101,6 @@ class LLDB_API SBStream {
108101
friend class SBValue;
109102
friend class SBWatchpoint;
110103

111-
friend class lldb_private::ScriptInterpreter;
112-
113104
lldb_private::Stream *operator->();
114105

115106
lldb_private::Stream *get();

lldb/include/lldb/Interpreter/Interfaces/ScriptedInterface.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#define LLDB_INTERPRETER_INTERFACES_SCRIPTEDINTERFACE_H
1111

1212
#include "lldb/Core/StructuredDataImpl.h"
13+
#include "lldb/Target/ExecutionContext.h"
1314
#include "lldb/Utility/LLDBLog.h"
1415
#include "lldb/Utility/Log.h"
1516
#include "lldb/Utility/UnimplementedError.h"
@@ -49,8 +50,7 @@ class ScriptedInterface {
4950
}
5051

5152
template <typename T = StructuredData::ObjectSP>
52-
static bool CheckStructuredDataObject(llvm::StringRef caller, T obj,
53-
Status &error) {
53+
bool CheckStructuredDataObject(llvm::StringRef caller, T obj, Status &error) {
5454
if (!obj)
5555
return ErrorWithMessage<bool>(caller, "Null Structured Data object",
5656
error);

lldb/include/lldb/Interpreter/Interfaces/ScriptedThreadPlanInterface.h

-40
This file was deleted.

lldb/include/lldb/Interpreter/ScriptInterpreter.h

+44-12
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,8 @@
1313
#include "lldb/API/SBBreakpoint.h"
1414
#include "lldb/API/SBData.h"
1515
#include "lldb/API/SBError.h"
16-
#include "lldb/API/SBEvent.h"
1716
#include "lldb/API/SBLaunchInfo.h"
1817
#include "lldb/API/SBMemoryRegionInfo.h"
19-
#include "lldb/API/SBStream.h"
2018
#include "lldb/Breakpoint/BreakpointOptions.h"
2119
#include "lldb/Core/PluginInterface.h"
2220
#include "lldb/Core/SearchFilter.h"
@@ -27,7 +25,6 @@
2725
#include "lldb/Interpreter/Interfaces/ScriptedPlatformInterface.h"
2826
#include "lldb/Interpreter/Interfaces/ScriptedProcessInterface.h"
2927
#include "lldb/Interpreter/Interfaces/ScriptedThreadInterface.h"
30-
#include "lldb/Interpreter/Interfaces/ScriptedThreadPlanInterface.h"
3128
#include "lldb/Interpreter/ScriptObject.h"
3229
#include "lldb/Utility/Broadcaster.h"
3330
#include "lldb/Utility/Status.h"
@@ -256,6 +253,50 @@ class ScriptInterpreter : public PluginInterface {
256253
return lldb::ValueObjectListSP();
257254
}
258255

256+
virtual StructuredData::ObjectSP
257+
CreateScriptedThreadPlan(const char *class_name,
258+
const StructuredDataImpl &args_data,
259+
std::string &error_str,
260+
lldb::ThreadPlanSP thread_plan_sp) {
261+
return StructuredData::ObjectSP();
262+
}
263+
264+
virtual bool
265+
ScriptedThreadPlanExplainsStop(StructuredData::ObjectSP implementor_sp,
266+
Event *event, bool &script_error) {
267+
script_error = true;
268+
return true;
269+
}
270+
271+
virtual bool
272+
ScriptedThreadPlanShouldStop(StructuredData::ObjectSP implementor_sp,
273+
Event *event, bool &script_error) {
274+
script_error = true;
275+
return true;
276+
}
277+
278+
virtual bool
279+
ScriptedThreadPlanIsStale(StructuredData::ObjectSP implementor_sp,
280+
bool &script_error) {
281+
script_error = true;
282+
return true;
283+
}
284+
285+
virtual lldb::StateType
286+
ScriptedThreadPlanGetRunState(StructuredData::ObjectSP implementor_sp,
287+
bool &script_error) {
288+
script_error = true;
289+
return lldb::eStateStepping;
290+
}
291+
292+
virtual bool
293+
ScriptedThreadPlanGetStopDescription(StructuredData::ObjectSP implementor_sp,
294+
lldb_private::Stream *stream,
295+
bool &script_error) {
296+
script_error = true;
297+
return false;
298+
}
299+
259300
virtual StructuredData::GenericSP
260301
CreateScriptedBreakpointResolver(const char *class_name,
261302
const StructuredDataImpl &args_data,
@@ -525,11 +566,6 @@ class ScriptInterpreter : public PluginInterface {
525566
return std::make_shared<ScriptedThreadInterface>();
526567
}
527568

528-
virtual lldb::ScriptedThreadPlanInterfaceSP
529-
CreateScriptedThreadPlanInterface() {
530-
return std::make_shared<ScriptedThreadPlanInterface>();
531-
}
532-
533569
virtual lldb::OperatingSystemInterfaceSP CreateOperatingSystemInterface() {
534570
return std::make_shared<OperatingSystemInterface>();
535571
}
@@ -548,10 +584,6 @@ class ScriptInterpreter : public PluginInterface {
548584

549585
Status GetStatusFromSBError(const lldb::SBError &error) const;
550586

551-
Event *GetOpaqueTypeFromSBEvent(const lldb::SBEvent &event) const;
552-
553-
Stream *GetOpaqueTypeFromSBStream(const lldb::SBStream &stream) const;
554-
555587
lldb::BreakpointSP
556588
GetOpaqueTypeFromSBBreakpoint(const lldb::SBBreakpoint &breakpoint) const;
557589

0 commit comments

Comments
 (0)