================ @@ -743,3 +743,41 @@ void SBCommand::SetFlags(uint32_t flags) { if (IsValid()) m_opaque_sp->GetFlags().Set(flags); } + +namespace lldb_private { +struct CommandCallbackData { + SBCommandPrintCallback callback; + void *callback_baton; +}; + +class CommandPrintCallbackBaton + : public lldb_private::TypedBaton<CommandCallbackData> { +public: + CommandPrintCallbackBaton(SBCommandPrintCallback callback, void *baton) + : TypedBaton(std::make_unique<CommandCallbackData>()) { + getItem()->callback = callback; + getItem()->callback_baton = baton; + } + + static lldb::CommandReturnObjectCallbackResult + PrivateCallback(lldb_private::CommandReturnObject &result, void *baton) { + if (baton) { + CommandCallbackData *data = (CommandCallbackData *)baton; + SBCommandReturnObject sb_result(result); + return data->callback(sb_result, data->callback_baton); + } + return eCommandReturnObjectPrintCallbackSkipped; + } +}; +} // namespace lldb_private + +void SBCommandInterpreter::SetPrintCallback( + lldb::SBCommandPrintCallback callback, void *baton) { + LLDB_INSTRUMENT_VA(this, callback, baton); + + BatonSP baton_sp = + std::make_shared<CommandPrintCallbackBaton>(callback, baton); ---------------- labath wrote:
I know this is here as a form of dependency inversion, and that we have this Baton thingy already, but it all fields unnecessarily elaborate. Couldn't the private callback type be a `std::function<CommandReturnObjectCallbackResult(CommandReturnObject&)>`, and just wrap things in a lambda? https://github.com/llvm/llvm-project/pull/125006 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits