Skip to content

Commit ae3f680

Browse files
authored
Revert "[lldb] Make use of Scripted{Python,}Interface for ScriptedThreadPlan (Reland #70392)" (#93153)
Reverts #93149 since it breaks https://lab.llvm.org/buildbot/#/builders/68/builds/74799
1 parent 8f50bca commit ae3f680

25 files changed

+431
-468
lines changed

lldb/bindings/python/python-swigsafecast.swig

+7-10
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,16 +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(std::shared_ptr<lldb::SBStream> stream_sb) {
119-
return ToSWIGHelper(stream_sb.get(), SWIGTYPE_p_lldb__SBStream);
120-
}
121-
122-
PythonObject SWIGBridge::ToSWIGWrapper(Event *event) {
123-
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);
124121
}
125122

126123
PythonObject SWIGBridge::ToSWIGWrapper(

lldb/bindings/python/python-wrapper.swig

+130-27
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 *implementer, 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 *>(implementer));
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 *implementer, 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 *>(implementer));
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,
@@ -373,8 +500,9 @@ bool lldb_private::python::SWIGBridge::LLDBSwigPythonStopHookCallHandleStop(
373500
if (!pfunc.IsAllocated())
374501
return true;
375502

376-
std::shared_ptr<lldb::SBStream> sb_stream = std::make_shared<lldb::SBStream>();
377-
PythonObject sb_stream_arg = SWIGBridge::ToSWIGWrapper(sb_stream);
503+
auto *sb_stream = new lldb::SBStream();
504+
PythonObject sb_stream_arg =
505+
SWIGBridge::ToSWIGWrapper(std::unique_ptr<lldb::SBStream>(sb_stream));
378506
PythonObject result =
379507
pfunc(SWIGBridge::ToSWIGWrapper(std::move(exc_ctx_sp)), sb_stream_arg);
380508

@@ -389,7 +517,6 @@ bool lldb_private::python::SWIGBridge::LLDBSwigPythonStopHookCallHandleStop(
389517
// makes an internally help StreamString which I can't interpose, so I
390518
// have to copy it over here.
391519
stream->PutCString(sb_stream->GetData());
392-
sb_stream_arg.release();
393520

394521
if (result.get() == Py_False)
395522
return false;
@@ -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

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

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

16-
namespace lldb_private {
17-
class ScriptInterpreter;
18-
} // namespace lldb_private
19-
2016
namespace lldb {
2117

2218
class LLDB_API SBStream {
@@ -105,8 +101,6 @@ class LLDB_API SBStream {
105101
friend class SBValue;
106102
friend class SBWatchpoint;
107103

108-
friend class lldb_private::ScriptInterpreter;
109-
110104
lldb_private::Stream *operator->();
111105

112106
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"
@@ -51,8 +52,7 @@ class ScriptedInterface {
5152
}
5253

5354
template <typename T = StructuredData::ObjectSP>
54-
static bool CheckStructuredDataObject(llvm::StringRef caller, T obj,
55-
Status &error) {
55+
bool CheckStructuredDataObject(llvm::StringRef caller, T obj, Status &error) {
5656
if (!obj)
5757
return ErrorWithMessage<bool>(caller, "Null Structured Data object",
5858
error);

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

-38
This file was deleted.

lldb/include/lldb/Interpreter/ScriptInterpreter.h

+44-11
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"
@@ -252,6 +250,50 @@ class ScriptInterpreter : public PluginInterface {
252250
return lldb::ValueObjectListSP();
253251
}
254252

253+
virtual StructuredData::ObjectSP
254+
CreateScriptedThreadPlan(const char *class_name,
255+
const StructuredDataImpl &args_data,
256+
std::string &error_str,
257+
lldb::ThreadPlanSP thread_plan_sp) {
258+
return StructuredData::ObjectSP();
259+
}
260+
261+
virtual bool
262+
ScriptedThreadPlanExplainsStop(StructuredData::ObjectSP implementor_sp,
263+
Event *event, bool &script_error) {
264+
script_error = true;
265+
return true;
266+
}
267+
268+
virtual bool
269+
ScriptedThreadPlanShouldStop(StructuredData::ObjectSP implementor_sp,
270+
Event *event, bool &script_error) {
271+
script_error = true;
272+
return true;
273+
}
274+
275+
virtual bool
276+
ScriptedThreadPlanIsStale(StructuredData::ObjectSP implementor_sp,
277+
bool &script_error) {
278+
script_error = true;
279+
return true;
280+
}
281+
282+
virtual lldb::StateType
283+
ScriptedThreadPlanGetRunState(StructuredData::ObjectSP implementor_sp,
284+
bool &script_error) {
285+
script_error = true;
286+
return lldb::eStateStepping;
287+
}
288+
289+
virtual bool
290+
ScriptedThreadPlanGetStopDescription(StructuredData::ObjectSP implementor_sp,
291+
lldb_private::Stream *stream,
292+
bool &script_error) {
293+
script_error = true;
294+
return false;
295+
}
296+
255297
virtual StructuredData::GenericSP
256298
CreateScriptedBreakpointResolver(const char *class_name,
257299
const StructuredDataImpl &args_data,
@@ -550,11 +592,6 @@ class ScriptInterpreter : public PluginInterface {
550592
return {};
551593
}
552594

553-
virtual lldb::ScriptedThreadPlanInterfaceSP
554-
CreateScriptedThreadPlanInterface() {
555-
return {};
556-
}
557-
558595
virtual lldb::OperatingSystemInterfaceSP CreateOperatingSystemInterface() {
559596
return {};
560597
}
@@ -573,10 +610,6 @@ class ScriptInterpreter : public PluginInterface {
573610

574611
Status GetStatusFromSBError(const lldb::SBError &error) const;
575612

576-
Event *GetOpaqueTypeFromSBEvent(const lldb::SBEvent &event) const;
577-
578-
Stream *GetOpaqueTypeFromSBStream(const lldb::SBStream &stream) const;
579-
580613
lldb::BreakpointSP
581614
GetOpaqueTypeFromSBBreakpoint(const lldb::SBBreakpoint &breakpoint) const;
582615

0 commit comments

Comments
 (0)