1 //===-- ScriptInterpreter.h -------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLDB_INTERPRETER_SCRIPTINTERPRETER_H 10 #define LLDB_INTERPRETER_SCRIPTINTERPRETER_H 11 12 #include "lldb/API/SBAttachInfo.h" 13 #include "lldb/API/SBBreakpoint.h" 14 #include "lldb/API/SBData.h" 15 #include "lldb/API/SBError.h" 16 #include "lldb/API/SBLaunchInfo.h" 17 #include "lldb/API/SBMemoryRegionInfo.h" 18 #include "lldb/Breakpoint/BreakpointOptions.h" 19 #include "lldb/Core/PluginInterface.h" 20 #include "lldb/Core/SearchFilter.h" 21 #include "lldb/Core/ThreadedCommunication.h" 22 #include "lldb/Host/PseudoTerminal.h" 23 #include "lldb/Host/StreamFile.h" 24 #include "lldb/Interpreter/Interfaces/OperatingSystemInterface.h" 25 #include "lldb/Interpreter/Interfaces/ScriptedPlatformInterface.h" 26 #include "lldb/Interpreter/Interfaces/ScriptedProcessInterface.h" 27 #include "lldb/Interpreter/Interfaces/ScriptedThreadInterface.h" 28 #include "lldb/Interpreter/ScriptObject.h" 29 #include "lldb/Utility/Broadcaster.h" 30 #include "lldb/Utility/Status.h" 31 #include "lldb/Utility/StructuredData.h" 32 #include "lldb/lldb-private.h" 33 #include <optional> 34 35 namespace lldb_private { 36 37 class ScriptInterpreterLocker { 38 public: 39 ScriptInterpreterLocker() = default; 40 41 virtual ~ScriptInterpreterLocker() = default; 42 43 private: 44 ScriptInterpreterLocker(const ScriptInterpreterLocker &) = delete; 45 const ScriptInterpreterLocker & 46 operator=(const ScriptInterpreterLocker &) = delete; 47 }; 48 49 class ExecuteScriptOptions { 50 public: 51 ExecuteScriptOptions() = default; 52 GetEnableIO()53 bool GetEnableIO() const { return m_enable_io; } 54 GetSetLLDBGlobals()55 bool GetSetLLDBGlobals() const { return m_set_lldb_globals; } 56 57 // If this is true then any exceptions raised by the script will be 58 // cleared with PyErr_Clear(). If false then they will be left for 59 // the caller to clean up GetMaskoutErrors()60 bool GetMaskoutErrors() const { return m_maskout_errors; } 61 SetEnableIO(bool enable)62 ExecuteScriptOptions &SetEnableIO(bool enable) { 63 m_enable_io = enable; 64 return *this; 65 } 66 SetSetLLDBGlobals(bool set)67 ExecuteScriptOptions &SetSetLLDBGlobals(bool set) { 68 m_set_lldb_globals = set; 69 return *this; 70 } 71 SetMaskoutErrors(bool maskout)72 ExecuteScriptOptions &SetMaskoutErrors(bool maskout) { 73 m_maskout_errors = maskout; 74 return *this; 75 } 76 77 private: 78 bool m_enable_io = true; 79 bool m_set_lldb_globals = true; 80 bool m_maskout_errors = true; 81 }; 82 83 class LoadScriptOptions { 84 public: 85 LoadScriptOptions() = default; 86 GetInitSession()87 bool GetInitSession() const { return m_init_session; } GetSilent()88 bool GetSilent() const { return m_silent; } 89 SetInitSession(bool b)90 LoadScriptOptions &SetInitSession(bool b) { 91 m_init_session = b; 92 return *this; 93 } 94 SetSilent(bool b)95 LoadScriptOptions &SetSilent(bool b) { 96 m_silent = b; 97 return *this; 98 } 99 100 private: 101 bool m_init_session = false; 102 bool m_silent = false; 103 }; 104 105 class ScriptInterpreterIORedirect { 106 public: 107 /// Create an IO redirect. If IO is enabled, this will redirects the output 108 /// to the command return object if set or to the debugger otherwise. If IO 109 /// is disabled, it will redirect all IO to /dev/null. 110 static llvm::Expected<std::unique_ptr<ScriptInterpreterIORedirect>> 111 Create(bool enable_io, Debugger &debugger, CommandReturnObject *result); 112 113 ~ScriptInterpreterIORedirect(); 114 GetInputFile()115 lldb::FileSP GetInputFile() const { return m_input_file_sp; } GetOutputFile()116 lldb::FileSP GetOutputFile() const { return m_output_file_sp->GetFileSP(); } GetErrorFile()117 lldb::FileSP GetErrorFile() const { return m_error_file_sp->GetFileSP(); } 118 119 /// Flush our output and error file handles. 120 void Flush(); 121 122 private: 123 ScriptInterpreterIORedirect(std::unique_ptr<File> input, 124 std::unique_ptr<File> output); 125 ScriptInterpreterIORedirect(Debugger &debugger, CommandReturnObject *result); 126 127 lldb::FileSP m_input_file_sp; 128 lldb::StreamFileSP m_output_file_sp; 129 lldb::StreamFileSP m_error_file_sp; 130 ThreadedCommunication m_communication; 131 bool m_disconnect; 132 }; 133 134 class ScriptInterpreter : public PluginInterface { 135 public: 136 enum ScriptReturnType { 137 eScriptReturnTypeCharPtr, 138 eScriptReturnTypeBool, 139 eScriptReturnTypeShortInt, 140 eScriptReturnTypeShortIntUnsigned, 141 eScriptReturnTypeInt, 142 eScriptReturnTypeIntUnsigned, 143 eScriptReturnTypeLongInt, 144 eScriptReturnTypeLongIntUnsigned, 145 eScriptReturnTypeLongLong, 146 eScriptReturnTypeLongLongUnsigned, 147 eScriptReturnTypeFloat, 148 eScriptReturnTypeDouble, 149 eScriptReturnTypeChar, 150 eScriptReturnTypeCharStrOrNone, 151 eScriptReturnTypeOpaqueObject 152 }; 153 154 ScriptInterpreter(Debugger &debugger, lldb::ScriptLanguage script_lang); 155 156 virtual StructuredData::DictionarySP GetInterpreterInfo(); 157 158 ~ScriptInterpreter() override = default; 159 Interrupt()160 virtual bool Interrupt() { return false; } 161 162 virtual bool ExecuteOneLine( 163 llvm::StringRef command, CommandReturnObject *result, 164 const ExecuteScriptOptions &options = ExecuteScriptOptions()) = 0; 165 166 virtual void ExecuteInterpreterLoop() = 0; 167 168 virtual bool ExecuteOneLineWithReturn( 169 llvm::StringRef in_string, ScriptReturnType return_type, void *ret_value, 170 const ExecuteScriptOptions &options = ExecuteScriptOptions()) { 171 return true; 172 } 173 174 virtual Status ExecuteMultipleLines( 175 const char *in_string, 176 const ExecuteScriptOptions &options = ExecuteScriptOptions()) { 177 Status error; 178 error.SetErrorString("not implemented"); 179 return error; 180 } 181 182 virtual Status ExportFunctionDefinitionToInterpreter(StringList & function_def)183 ExportFunctionDefinitionToInterpreter(StringList &function_def) { 184 Status error; 185 error.SetErrorString("not implemented"); 186 return error; 187 } 188 GenerateBreakpointCommandCallbackData(StringList & input,std::string & output,bool has_extra_args,bool is_callback)189 virtual Status GenerateBreakpointCommandCallbackData(StringList &input, 190 std::string &output, 191 bool has_extra_args, 192 bool is_callback) { 193 Status error; 194 error.SetErrorString("not implemented"); 195 return error; 196 } 197 GenerateWatchpointCommandCallbackData(StringList & input,std::string & output,bool is_callback)198 virtual bool GenerateWatchpointCommandCallbackData(StringList &input, 199 std::string &output, 200 bool is_callback) { 201 return false; 202 } 203 204 virtual bool GenerateTypeScriptFunction(const char *oneliner, 205 std::string &output, 206 const void *name_token = nullptr) { 207 return false; 208 } 209 210 virtual bool GenerateTypeScriptFunction(StringList &input, 211 std::string &output, 212 const void *name_token = nullptr) { 213 return false; 214 } 215 GenerateScriptAliasFunction(StringList & input,std::string & output)216 virtual bool GenerateScriptAliasFunction(StringList &input, 217 std::string &output) { 218 return false; 219 } 220 221 virtual bool GenerateTypeSynthClass(StringList &input, std::string &output, 222 const void *name_token = nullptr) { 223 return false; 224 } 225 226 virtual bool GenerateTypeSynthClass(const char *oneliner, std::string &output, 227 const void *name_token = nullptr) { 228 return false; 229 } 230 231 virtual StructuredData::ObjectSP CreateSyntheticScriptedProvider(const char * class_name,lldb::ValueObjectSP valobj)232 CreateSyntheticScriptedProvider(const char *class_name, 233 lldb::ValueObjectSP valobj) { 234 return StructuredData::ObjectSP(); 235 } 236 237 virtual StructuredData::GenericSP CreateScriptCommandObject(const char * class_name)238 CreateScriptCommandObject(const char *class_name) { 239 return StructuredData::GenericSP(); 240 } 241 242 virtual StructuredData::GenericSP CreateFrameRecognizer(const char * class_name)243 CreateFrameRecognizer(const char *class_name) { 244 return StructuredData::GenericSP(); 245 } 246 GetRecognizedArguments(const StructuredData::ObjectSP & implementor,lldb::StackFrameSP frame_sp)247 virtual lldb::ValueObjectListSP GetRecognizedArguments( 248 const StructuredData::ObjectSP &implementor, 249 lldb::StackFrameSP frame_sp) { 250 return lldb::ValueObjectListSP(); 251 } 252 253 virtual StructuredData::ObjectSP CreateScriptedThreadPlan(const char * class_name,const StructuredDataImpl & args_data,std::string & error_str,lldb::ThreadPlanSP thread_plan_sp)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 ScriptedThreadPlanExplainsStop(StructuredData::ObjectSP implementor_sp,Event * event,bool & script_error)262 ScriptedThreadPlanExplainsStop(StructuredData::ObjectSP implementor_sp, 263 Event *event, bool &script_error) { 264 script_error = true; 265 return true; 266 } 267 268 virtual bool ScriptedThreadPlanShouldStop(StructuredData::ObjectSP implementor_sp,Event * event,bool & script_error)269 ScriptedThreadPlanShouldStop(StructuredData::ObjectSP implementor_sp, 270 Event *event, bool &script_error) { 271 script_error = true; 272 return true; 273 } 274 275 virtual bool ScriptedThreadPlanIsStale(StructuredData::ObjectSP implementor_sp,bool & script_error)276 ScriptedThreadPlanIsStale(StructuredData::ObjectSP implementor_sp, 277 bool &script_error) { 278 script_error = true; 279 return true; 280 } 281 282 virtual lldb::StateType ScriptedThreadPlanGetRunState(StructuredData::ObjectSP implementor_sp,bool & script_error)283 ScriptedThreadPlanGetRunState(StructuredData::ObjectSP implementor_sp, 284 bool &script_error) { 285 script_error = true; 286 return lldb::eStateStepping; 287 } 288 289 virtual bool ScriptedThreadPlanGetStopDescription(StructuredData::ObjectSP implementor_sp,lldb_private::Stream * stream,bool & script_error)290 ScriptedThreadPlanGetStopDescription(StructuredData::ObjectSP implementor_sp, 291 lldb_private::Stream *stream, 292 bool &script_error) { 293 script_error = true; 294 return false; 295 } 296 297 virtual StructuredData::GenericSP CreateScriptedBreakpointResolver(const char * class_name,const StructuredDataImpl & args_data,lldb::BreakpointSP & bkpt_sp)298 CreateScriptedBreakpointResolver(const char *class_name, 299 const StructuredDataImpl &args_data, 300 lldb::BreakpointSP &bkpt_sp) { 301 return StructuredData::GenericSP(); 302 } 303 304 virtual bool ScriptedBreakpointResolverSearchCallback(StructuredData::GenericSP implementor_sp,SymbolContext * sym_ctx)305 ScriptedBreakpointResolverSearchCallback(StructuredData::GenericSP implementor_sp, 306 SymbolContext *sym_ctx) 307 { 308 return false; 309 } 310 311 virtual lldb::SearchDepth ScriptedBreakpointResolverSearchDepth(StructuredData::GenericSP implementor_sp)312 ScriptedBreakpointResolverSearchDepth(StructuredData::GenericSP implementor_sp) 313 { 314 return lldb::eSearchDepthModule; 315 } 316 317 virtual StructuredData::GenericSP CreateScriptedStopHook(lldb::TargetSP target_sp,const char * class_name,const StructuredDataImpl & args_data,Status & error)318 CreateScriptedStopHook(lldb::TargetSP target_sp, const char *class_name, 319 const StructuredDataImpl &args_data, Status &error) { 320 error.SetErrorString("Creating scripted stop-hooks with the current " 321 "script interpreter is not supported."); 322 return StructuredData::GenericSP(); 323 } 324 325 // This dispatches to the handle_stop method of the stop-hook class. It 326 // returns a "should_stop" bool. 327 virtual bool ScriptedStopHookHandleStop(StructuredData::GenericSP implementor_sp,ExecutionContext & exc_ctx,lldb::StreamSP stream_sp)328 ScriptedStopHookHandleStop(StructuredData::GenericSP implementor_sp, 329 ExecutionContext &exc_ctx, 330 lldb::StreamSP stream_sp) { 331 return true; 332 } 333 334 virtual StructuredData::ObjectSP LoadPluginModule(const FileSpec & file_spec,lldb_private::Status & error)335 LoadPluginModule(const FileSpec &file_spec, lldb_private::Status &error) { 336 return StructuredData::ObjectSP(); 337 } 338 339 virtual StructuredData::DictionarySP GetDynamicSettings(StructuredData::ObjectSP plugin_module_sp,Target * target,const char * setting_name,lldb_private::Status & error)340 GetDynamicSettings(StructuredData::ObjectSP plugin_module_sp, Target *target, 341 const char *setting_name, lldb_private::Status &error) { 342 return StructuredData::DictionarySP(); 343 } 344 GenerateFunction(const char * signature,const StringList & input,bool is_callback)345 virtual Status GenerateFunction(const char *signature, 346 const StringList &input, 347 bool is_callback) { 348 Status error; 349 error.SetErrorString("unimplemented"); 350 return error; 351 } 352 353 virtual void CollectDataForBreakpointCommandCallback( 354 std::vector<std::reference_wrapper<BreakpointOptions>> &options, 355 CommandReturnObject &result); 356 357 virtual void 358 CollectDataForWatchpointCommandCallback(WatchpointOptions *wp_options, 359 CommandReturnObject &result); 360 361 /// Set the specified text as the callback for the breakpoint. 362 Status SetBreakpointCommandCallback( 363 std::vector<std::reference_wrapper<BreakpointOptions>> &bp_options_vec, 364 const char *callback_text); 365 SetBreakpointCommandCallback(BreakpointOptions & bp_options,const char * callback_text,bool is_callback)366 virtual Status SetBreakpointCommandCallback(BreakpointOptions &bp_options, 367 const char *callback_text, 368 bool is_callback) { 369 Status error; 370 error.SetErrorString("unimplemented"); 371 return error; 372 } 373 374 /// This one is for deserialization: SetBreakpointCommandCallback(BreakpointOptions & bp_options,std::unique_ptr<BreakpointOptions::CommandData> & data_up)375 virtual Status SetBreakpointCommandCallback( 376 BreakpointOptions &bp_options, 377 std::unique_ptr<BreakpointOptions::CommandData> &data_up) { 378 Status error; 379 error.SetErrorString("unimplemented"); 380 return error; 381 } 382 383 Status SetBreakpointCommandCallbackFunction( 384 std::vector<std::reference_wrapper<BreakpointOptions>> &bp_options_vec, 385 const char *function_name, StructuredData::ObjectSP extra_args_sp); 386 387 /// Set a script function as the callback for the breakpoint. 388 virtual Status SetBreakpointCommandCallbackFunction(BreakpointOptions & bp_options,const char * function_name,StructuredData::ObjectSP extra_args_sp)389 SetBreakpointCommandCallbackFunction(BreakpointOptions &bp_options, 390 const char *function_name, 391 StructuredData::ObjectSP extra_args_sp) { 392 Status error; 393 error.SetErrorString("unimplemented"); 394 return error; 395 } 396 397 /// Set a one-liner as the callback for the watchpoint. SetWatchpointCommandCallback(WatchpointOptions * wp_options,const char * user_input,bool is_callback)398 virtual void SetWatchpointCommandCallback(WatchpointOptions *wp_options, 399 const char *user_input, 400 bool is_callback) {} 401 GetScriptedSummary(const char * function_name,lldb::ValueObjectSP valobj,StructuredData::ObjectSP & callee_wrapper_sp,const TypeSummaryOptions & options,std::string & retval)402 virtual bool GetScriptedSummary(const char *function_name, 403 lldb::ValueObjectSP valobj, 404 StructuredData::ObjectSP &callee_wrapper_sp, 405 const TypeSummaryOptions &options, 406 std::string &retval) { 407 return false; 408 } 409 410 // Calls the specified formatter matching Python function and returns its 411 // result (true if it's a match, false if we should keep looking for a 412 // matching formatter). FormatterCallbackFunction(const char * function_name,lldb::TypeImplSP type_impl_sp)413 virtual bool FormatterCallbackFunction(const char *function_name, 414 lldb::TypeImplSP type_impl_sp) { 415 return true; 416 } 417 Clear()418 virtual void Clear() { 419 // Clean up any ref counts to SBObjects that might be in global variables 420 } 421 422 virtual size_t CalculateNumChildren(const StructuredData::ObjectSP & implementor,uint32_t max)423 CalculateNumChildren(const StructuredData::ObjectSP &implementor, 424 uint32_t max) { 425 return 0; 426 } 427 428 virtual lldb::ValueObjectSP GetChildAtIndex(const StructuredData::ObjectSP & implementor,uint32_t idx)429 GetChildAtIndex(const StructuredData::ObjectSP &implementor, uint32_t idx) { 430 return lldb::ValueObjectSP(); 431 } 432 433 virtual int GetIndexOfChildWithName(const StructuredData::ObjectSP & implementor,const char * child_name)434 GetIndexOfChildWithName(const StructuredData::ObjectSP &implementor, 435 const char *child_name) { 436 return UINT32_MAX; 437 } 438 439 virtual bool UpdateSynthProviderInstance(const StructuredData::ObjectSP & implementor)440 UpdateSynthProviderInstance(const StructuredData::ObjectSP &implementor) { 441 return false; 442 } 443 MightHaveChildrenSynthProviderInstance(const StructuredData::ObjectSP & implementor)444 virtual bool MightHaveChildrenSynthProviderInstance( 445 const StructuredData::ObjectSP &implementor) { 446 return true; 447 } 448 449 virtual lldb::ValueObjectSP GetSyntheticValue(const StructuredData::ObjectSP & implementor)450 GetSyntheticValue(const StructuredData::ObjectSP &implementor) { 451 return nullptr; 452 } 453 454 virtual ConstString GetSyntheticTypeName(const StructuredData::ObjectSP & implementor)455 GetSyntheticTypeName(const StructuredData::ObjectSP &implementor) { 456 return ConstString(); 457 } 458 459 virtual bool RunScriptBasedCommand(const char * impl_function,llvm::StringRef args,ScriptedCommandSynchronicity synchronicity,lldb_private::CommandReturnObject & cmd_retobj,Status & error,const lldb_private::ExecutionContext & exe_ctx)460 RunScriptBasedCommand(const char *impl_function, llvm::StringRef args, 461 ScriptedCommandSynchronicity synchronicity, 462 lldb_private::CommandReturnObject &cmd_retobj, 463 Status &error, 464 const lldb_private::ExecutionContext &exe_ctx) { 465 return false; 466 } 467 RunScriptBasedCommand(StructuredData::GenericSP impl_obj_sp,llvm::StringRef args,ScriptedCommandSynchronicity synchronicity,lldb_private::CommandReturnObject & cmd_retobj,Status & error,const lldb_private::ExecutionContext & exe_ctx)468 virtual bool RunScriptBasedCommand( 469 StructuredData::GenericSP impl_obj_sp, llvm::StringRef args, 470 ScriptedCommandSynchronicity synchronicity, 471 lldb_private::CommandReturnObject &cmd_retobj, Status &error, 472 const lldb_private::ExecutionContext &exe_ctx) { 473 return false; 474 } 475 RunScriptBasedParsedCommand(StructuredData::GenericSP impl_obj_sp,Args & args,ScriptedCommandSynchronicity synchronicity,lldb_private::CommandReturnObject & cmd_retobj,Status & error,const lldb_private::ExecutionContext & exe_ctx)476 virtual bool RunScriptBasedParsedCommand( 477 StructuredData::GenericSP impl_obj_sp, Args& args, 478 ScriptedCommandSynchronicity synchronicity, 479 lldb_private::CommandReturnObject &cmd_retobj, Status &error, 480 const lldb_private::ExecutionContext &exe_ctx) { 481 return false; 482 } 483 RunScriptFormatKeyword(const char * impl_function,Process * process,std::string & output,Status & error)484 virtual bool RunScriptFormatKeyword(const char *impl_function, 485 Process *process, std::string &output, 486 Status &error) { 487 error.SetErrorString("unimplemented"); 488 return false; 489 } 490 RunScriptFormatKeyword(const char * impl_function,Thread * thread,std::string & output,Status & error)491 virtual bool RunScriptFormatKeyword(const char *impl_function, Thread *thread, 492 std::string &output, Status &error) { 493 error.SetErrorString("unimplemented"); 494 return false; 495 } 496 RunScriptFormatKeyword(const char * impl_function,Target * target,std::string & output,Status & error)497 virtual bool RunScriptFormatKeyword(const char *impl_function, Target *target, 498 std::string &output, Status &error) { 499 error.SetErrorString("unimplemented"); 500 return false; 501 } 502 RunScriptFormatKeyword(const char * impl_function,StackFrame * frame,std::string & output,Status & error)503 virtual bool RunScriptFormatKeyword(const char *impl_function, 504 StackFrame *frame, std::string &output, 505 Status &error) { 506 error.SetErrorString("unimplemented"); 507 return false; 508 } 509 RunScriptFormatKeyword(const char * impl_function,ValueObject * value,std::string & output,Status & error)510 virtual bool RunScriptFormatKeyword(const char *impl_function, 511 ValueObject *value, std::string &output, 512 Status &error) { 513 error.SetErrorString("unimplemented"); 514 return false; 515 } 516 GetDocumentationForItem(const char * item,std::string & dest)517 virtual bool GetDocumentationForItem(const char *item, std::string &dest) { 518 dest.clear(); 519 return false; 520 } 521 522 virtual bool GetShortHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp,std::string & dest)523 GetShortHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp, 524 std::string &dest) { 525 dest.clear(); 526 return false; 527 } 528 529 virtual StructuredData::ObjectSP GetOptionsForCommandObject(StructuredData::GenericSP cmd_obj_sp)530 GetOptionsForCommandObject(StructuredData::GenericSP cmd_obj_sp) { 531 return {}; 532 } 533 534 virtual StructuredData::ObjectSP GetArgumentsForCommandObject(StructuredData::GenericSP cmd_obj_sp)535 GetArgumentsForCommandObject(StructuredData::GenericSP cmd_obj_sp) { 536 return {}; 537 } 538 SetOptionValueForCommandObject(StructuredData::GenericSP cmd_obj_sp,ExecutionContext * exe_ctx,llvm::StringRef long_option,llvm::StringRef value)539 virtual bool SetOptionValueForCommandObject( 540 StructuredData::GenericSP cmd_obj_sp, ExecutionContext *exe_ctx, 541 llvm::StringRef long_option, llvm::StringRef value) { 542 return false; 543 } 544 OptionParsingStartedForCommandObject(StructuredData::GenericSP cmd_obj_sp)545 virtual void OptionParsingStartedForCommandObject( 546 StructuredData::GenericSP cmd_obj_sp) { 547 return; 548 } 549 550 virtual uint32_t GetFlagsForCommandObject(StructuredData::GenericSP cmd_obj_sp)551 GetFlagsForCommandObject(StructuredData::GenericSP cmd_obj_sp) { 552 return 0; 553 } 554 GetLongHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp,std::string & dest)555 virtual bool GetLongHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp, 556 std::string &dest) { 557 dest.clear(); 558 return false; 559 } 560 CheckObjectExists(const char * name)561 virtual bool CheckObjectExists(const char *name) { return false; } 562 563 virtual bool 564 LoadScriptingModule(const char *filename, const LoadScriptOptions &options, 565 lldb_private::Status &error, 566 StructuredData::ObjectSP *module_sp = nullptr, 567 FileSpec extra_search_dir = {}); 568 IsReservedWord(const char * word)569 virtual bool IsReservedWord(const char *word) { return false; } 570 571 virtual std::unique_ptr<ScriptInterpreterLocker> AcquireInterpreterLock(); 572 573 const char *GetScriptInterpreterPtyName(); 574 575 virtual llvm::Expected<unsigned> GetMaxPositionalArgumentsForCallable(const llvm::StringRef & callable_name)576 GetMaxPositionalArgumentsForCallable(const llvm::StringRef &callable_name) { 577 return llvm::createStringError( 578 llvm::inconvertibleErrorCode(), "Unimplemented function"); 579 } 580 581 static std::string LanguageToString(lldb::ScriptLanguage language); 582 583 static lldb::ScriptLanguage StringToLanguage(const llvm::StringRef &string); 584 GetLanguage()585 lldb::ScriptLanguage GetLanguage() { return m_script_lang; } 586 CreateScriptedProcessInterface()587 virtual lldb::ScriptedProcessInterfaceUP CreateScriptedProcessInterface() { 588 return {}; 589 } 590 CreateScriptedThreadInterface()591 virtual lldb::ScriptedThreadInterfaceSP CreateScriptedThreadInterface() { 592 return {}; 593 } 594 CreateOperatingSystemInterface()595 virtual lldb::OperatingSystemInterfaceSP CreateOperatingSystemInterface() { 596 return {}; 597 } 598 GetScriptedPlatformInterface()599 virtual lldb::ScriptedPlatformInterfaceUP GetScriptedPlatformInterface() { 600 return {}; 601 } 602 603 virtual StructuredData::ObjectSP CreateStructuredDataFromScriptObject(ScriptObject obj)604 CreateStructuredDataFromScriptObject(ScriptObject obj) { 605 return {}; 606 } 607 608 lldb::DataExtractorSP 609 GetDataExtractorFromSBData(const lldb::SBData &data) const; 610 611 Status GetStatusFromSBError(const lldb::SBError &error) const; 612 613 lldb::BreakpointSP 614 GetOpaqueTypeFromSBBreakpoint(const lldb::SBBreakpoint &breakpoint) const; 615 616 lldb::ProcessAttachInfoSP 617 GetOpaqueTypeFromSBAttachInfo(const lldb::SBAttachInfo &attach_info) const; 618 619 lldb::ProcessLaunchInfoSP 620 GetOpaqueTypeFromSBLaunchInfo(const lldb::SBLaunchInfo &launch_info) const; 621 622 std::optional<MemoryRegionInfo> GetOpaqueTypeFromSBMemoryRegionInfo( 623 const lldb::SBMemoryRegionInfo &mem_region) const; 624 625 protected: 626 Debugger &m_debugger; 627 lldb::ScriptLanguage m_script_lang; 628 }; 629 630 } // namespace lldb_private 631 632 #endif // LLDB_INTERPRETER_SCRIPTINTERPRETER_H 633