Xcode uses a pseudoterminal for the debugger console. - The upside of this apporach is that it means that it can rely on LLDB's IOHandlers for multiline and script input. - The downside of this approach is that the command output is printed to the PTY and you don't get a SBCommandReturnObject. Adrian added support for inline diagnostics (#110901) and we'd like to access those from the IDE. This patch adds support for registering a callback in the command interpreter that gives access to the `(SB)CommandReturnObject` right before it will be printed. The callback implementation can choose whether it likes to handle printing the result or defer to lldb. If the callback indicated it handled the result, the command interpreter will skip printing the result. We considered a few other alternatives to solve this problem: - The most obvious one is using `HandleCommand`, which returns a `SBCommandReturnObject`. The problem with this approach is the multiline input mentioned above. We would need a way to tell the IDE that it should expect multiline input, which isn't known until LLDB starts handling the command. - To address the multiline issue,we considered exposing (some of the) IOHandler machinery through the SB API. To solve this particular issue, that would require reimplementing a ton of logic that already exists today in the CommandInterpeter. Furthermore that seems like overkill compared to the proposed solution. rdar://141254310
147 lines
5.5 KiB
Plaintext
147 lines
5.5 KiB
Plaintext
namespace lldb_private {
|
|
namespace python {
|
|
|
|
PythonObject ToSWIGHelper(void *obj, swig_type_info *info) {
|
|
return {PyRefType::Owned, SWIG_NewPointerObj(obj, info, SWIG_POINTER_OWN)};
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(std::unique_ptr<lldb::SBValue> value_sb) {
|
|
return ToSWIGHelper(value_sb.release(), SWIGTYPE_p_lldb__SBValue);
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(std::unique_ptr<lldb::SBCommandReturnObject> result_up) {
|
|
return ToSWIGHelper(result_up.release(), SWIGTYPE_p_lldb__SBCommandReturnObject);
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(lldb::ValueObjectSP value_sp) {
|
|
return ToSWIGWrapper(std::unique_ptr<lldb::SBValue>(new lldb::SBValue(value_sp)));
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(lldb::TargetSP target_sp) {
|
|
return ToSWIGHelper(new lldb::SBTarget(std::move(target_sp)),
|
|
SWIGTYPE_p_lldb__SBTarget);
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(lldb::ProcessSP process_sp) {
|
|
return ToSWIGHelper(new lldb::SBProcess(std::move(process_sp)),
|
|
SWIGTYPE_p_lldb__SBProcess);
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(lldb::ModuleSP module_sp) {
|
|
return ToSWIGHelper(new lldb::SBModule(std::move(module_sp)),
|
|
SWIGTYPE_p_lldb__SBModule);
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(lldb::ThreadPlanSP thread_plan_sp) {
|
|
return ToSWIGHelper(new lldb::SBThreadPlan(std::move(thread_plan_sp)),
|
|
SWIGTYPE_p_lldb__SBThreadPlan);
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(lldb::BreakpointSP breakpoint_sp) {
|
|
return ToSWIGHelper(new lldb::SBBreakpoint(std::move(breakpoint_sp)),
|
|
SWIGTYPE_p_lldb__SBBreakpoint);
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(Status&& status) {
|
|
return ToSWIGHelper(new lldb::SBError(std::move(status)), SWIGTYPE_p_lldb__SBError);
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(std::unique_ptr<lldb::SBStructuredData> data_sb) {
|
|
return ToSWIGHelper(data_sb.release(), SWIGTYPE_p_lldb__SBStructuredData);
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(const StructuredDataImpl &data_impl) {
|
|
return ToSWIGWrapper(std::unique_ptr<lldb::SBStructuredData>(new lldb::SBStructuredData(data_impl)));
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(lldb::ThreadSP thread_sp) {
|
|
return ToSWIGHelper(new lldb::SBThread(std::move(thread_sp)),
|
|
SWIGTYPE_p_lldb__SBThread);
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(lldb::StackFrameSP frame_sp) {
|
|
return ToSWIGHelper(new lldb::SBFrame(std::move(frame_sp)),
|
|
SWIGTYPE_p_lldb__SBFrame);
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(lldb::DebuggerSP debugger_sp) {
|
|
return ToSWIGHelper(new lldb::SBDebugger(std::move(debugger_sp)),
|
|
SWIGTYPE_p_lldb__SBDebugger);
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(lldb::WatchpointSP watchpoint_sp) {
|
|
return ToSWIGHelper(new lldb::SBWatchpoint(std::move(watchpoint_sp)),
|
|
SWIGTYPE_p_lldb__SBWatchpoint);
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(lldb::BreakpointLocationSP bp_loc_sp) {
|
|
return ToSWIGHelper(new lldb::SBBreakpointLocation(std::move(bp_loc_sp)),
|
|
SWIGTYPE_p_lldb__SBBreakpointLocation);
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(lldb::ExecutionContextRefSP ctx_sp) {
|
|
return ToSWIGHelper(new lldb::SBExecutionContext(std::move(ctx_sp)),
|
|
SWIGTYPE_p_lldb__SBExecutionContext);
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(lldb::TypeImplSP type_impl_sp) {
|
|
return ToSWIGHelper(new lldb::SBType(type_impl_sp), SWIGTYPE_p_lldb__SBType);
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(const TypeSummaryOptions &summary_options) {
|
|
return ToSWIGHelper(new lldb::SBTypeSummaryOptions(summary_options),
|
|
SWIGTYPE_p_lldb__SBTypeSummaryOptions);
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(const SymbolContext &sym_ctx) {
|
|
return ToSWIGHelper(new lldb::SBSymbolContext(sym_ctx),
|
|
SWIGTYPE_p_lldb__SBSymbolContext);
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(lldb::ProcessLaunchInfoSP launch_info_sp) {
|
|
return ToSWIGHelper(new lldb::ProcessLaunchInfoSP(std::move(launch_info_sp)),
|
|
SWIGTYPE_p_lldb__SBLaunchInfo);
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(lldb::ProcessAttachInfoSP attach_info_sp) {
|
|
return ToSWIGHelper(new lldb::ProcessAttachInfoSP(std::move(attach_info_sp)),
|
|
SWIGTYPE_p_lldb__SBAttachInfo);
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(lldb::DataExtractorSP data_sp) {
|
|
return ToSWIGHelper(new lldb::DataExtractorSP(std::move(data_sp)),
|
|
SWIGTYPE_p_lldb__SBData);
|
|
}
|
|
|
|
ScopedPythonObject<lldb::SBCommandReturnObject>
|
|
SWIGBridge::ToSWIGWrapper(CommandReturnObject &cmd_retobj) {
|
|
return ScopedPythonObject<lldb::SBCommandReturnObject>(
|
|
new lldb::SBCommandReturnObject(cmd_retobj),
|
|
SWIGTYPE_p_lldb__SBCommandReturnObject);
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(const Stream *s) {
|
|
return ToSWIGHelper(new lldb::SBStream(), SWIGTYPE_p_lldb__SBStream);
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(std::shared_ptr<lldb::SBStream> stream_sb) {
|
|
return ToSWIGHelper(stream_sb.get(), SWIGTYPE_p_lldb__SBStream);
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(Event *event) {
|
|
return ToSWIGHelper(new lldb::SBEvent(event), SWIGTYPE_p_lldb__SBEvent);
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(
|
|
std::unique_ptr<lldb::SBFileSpec> file_spec_sb) {
|
|
return ToSWIGHelper(file_spec_sb.release(), SWIGTYPE_p_lldb__SBFileSpec);
|
|
}
|
|
|
|
PythonObject SWIGBridge::ToSWIGWrapper(
|
|
std::unique_ptr<lldb::SBModuleSpec> module_spec_sb) {
|
|
return ToSWIGHelper(module_spec_sb.release(), SWIGTYPE_p_lldb__SBModuleSpec);
|
|
}
|
|
|
|
} // namespace python
|
|
} // namespace lldb_private
|