ScriptInterpreter.h revision 269024
1//===-- ScriptInterpreter.h -------------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef liblldb_ScriptInterpreter_h_ 11#define liblldb_ScriptInterpreter_h_ 12 13#include "lldb/lldb-private.h" 14 15#include "lldb/Core/Broadcaster.h" 16#include "lldb/Core/Error.h" 17 18#include "lldb/Utility/PseudoTerminal.h" 19 20 21namespace lldb_private { 22 23class ScriptInterpreterObject 24{ 25public: 26 ScriptInterpreterObject() : 27 m_object(NULL) 28 {} 29 30 ScriptInterpreterObject(void* obj) : 31 m_object(obj) 32 {} 33 34 ScriptInterpreterObject(const ScriptInterpreterObject& rhs) 35 : m_object(rhs.m_object) 36 {} 37 38 virtual void* 39 GetObject() 40 { 41 return m_object; 42 } 43 44 explicit operator bool () 45 { 46 return m_object != NULL; 47 } 48 49 ScriptInterpreterObject& 50 operator = (const ScriptInterpreterObject& rhs) 51 { 52 if (this != &rhs) 53 m_object = rhs.m_object; 54 return *this; 55 } 56 57 virtual 58 ~ScriptInterpreterObject() 59 {} 60 61protected: 62 void* m_object; 63}; 64 65class ScriptInterpreterLocker 66{ 67public: 68 69 ScriptInterpreterLocker () 70 { 71 } 72 73 virtual ~ScriptInterpreterLocker () 74 { 75 } 76private: 77 DISALLOW_COPY_AND_ASSIGN (ScriptInterpreterLocker); 78}; 79 80 81class ScriptInterpreter 82{ 83public: 84 85 typedef void (*SWIGInitCallback) (void); 86 87 typedef bool (*SWIGBreakpointCallbackFunction) (const char *python_function_name, 88 const char *session_dictionary_name, 89 const lldb::StackFrameSP& frame_sp, 90 const lldb::BreakpointLocationSP &bp_loc_sp); 91 92 typedef bool (*SWIGWatchpointCallbackFunction) (const char *python_function_name, 93 const char *session_dictionary_name, 94 const lldb::StackFrameSP& frame_sp, 95 const lldb::WatchpointSP &wp_sp); 96 97 typedef bool (*SWIGPythonTypeScriptCallbackFunction) (const char *python_function_name, 98 void *session_dictionary, 99 const lldb::ValueObjectSP& valobj_sp, 100 void** pyfunct_wrapper, 101 std::string& retval); 102 103 typedef void* (*SWIGPythonCreateSyntheticProvider) (const char *python_class_name, 104 const char *session_dictionary_name, 105 const lldb::ValueObjectSP& valobj_sp); 106 107 typedef void* (*SWIGPythonCreateOSPlugin) (const char *python_class_name, 108 const char *session_dictionary_name, 109 const lldb::ProcessSP& process_sp); 110 111 typedef uint32_t (*SWIGPythonCalculateNumChildren) (void *implementor); 112 typedef void* (*SWIGPythonGetChildAtIndex) (void *implementor, uint32_t idx); 113 typedef int (*SWIGPythonGetIndexOfChildWithName) (void *implementor, const char* child_name); 114 typedef void* (*SWIGPythonCastPyObjectToSBValue) (void* data); 115 typedef lldb::ValueObjectSP (*SWIGPythonGetValueObjectSPFromSBValue) (void* data); 116 typedef bool (*SWIGPythonUpdateSynthProviderInstance) (void* data); 117 typedef bool (*SWIGPythonMightHaveChildrenSynthProviderInstance) (void* data); 118 119 120 typedef bool (*SWIGPythonCallCommand) (const char *python_function_name, 121 const char *session_dictionary_name, 122 lldb::DebuggerSP& debugger, 123 const char* args, 124 lldb_private::CommandReturnObject& cmd_retobj); 125 126 typedef bool (*SWIGPythonCallModuleInit) (const char *python_module_name, 127 const char *session_dictionary_name, 128 lldb::DebuggerSP& debugger); 129 130 typedef bool (*SWIGPythonScriptKeyword_Process) (const char* python_function_name, 131 const char* session_dictionary_name, 132 lldb::ProcessSP& process, 133 std::string& output); 134 typedef bool (*SWIGPythonScriptKeyword_Thread) (const char* python_function_name, 135 const char* session_dictionary_name, 136 lldb::ThreadSP& thread, 137 std::string& output); 138 139 typedef bool (*SWIGPythonScriptKeyword_Target) (const char* python_function_name, 140 const char* session_dictionary_name, 141 lldb::TargetSP& target, 142 std::string& output); 143 144 typedef bool (*SWIGPythonScriptKeyword_Frame) (const char* python_function_name, 145 const char* session_dictionary_name, 146 lldb::StackFrameSP& frame, 147 std::string& output); 148 149 typedef void* (*SWIGPython_GetDynamicSetting) (void* module, 150 const char* setting, 151 const lldb::TargetSP& target_sp); 152 153 typedef enum 154 { 155 eScriptReturnTypeCharPtr, 156 eScriptReturnTypeBool, 157 eScriptReturnTypeShortInt, 158 eScriptReturnTypeShortIntUnsigned, 159 eScriptReturnTypeInt, 160 eScriptReturnTypeIntUnsigned, 161 eScriptReturnTypeLongInt, 162 eScriptReturnTypeLongIntUnsigned, 163 eScriptReturnTypeLongLong, 164 eScriptReturnTypeLongLongUnsigned, 165 eScriptReturnTypeFloat, 166 eScriptReturnTypeDouble, 167 eScriptReturnTypeChar, 168 eScriptReturnTypeCharStrOrNone, 169 eScriptReturnTypeOpaqueObject 170 } ScriptReturnType; 171 172 ScriptInterpreter (CommandInterpreter &interpreter, lldb::ScriptLanguage script_lang); 173 174 virtual ~ScriptInterpreter (); 175 176 struct ExecuteScriptOptions 177 { 178 public: 179 ExecuteScriptOptions () : 180 m_enable_io(true), 181 m_set_lldb_globals(true), 182 m_maskout_errors(true) 183 { 184 } 185 186 bool 187 GetEnableIO () const 188 { 189 return m_enable_io; 190 } 191 192 bool 193 GetSetLLDBGlobals () const 194 { 195 return m_set_lldb_globals; 196 } 197 198 bool 199 GetMaskoutErrors () const 200 { 201 return m_maskout_errors; 202 } 203 204 ExecuteScriptOptions& 205 SetEnableIO (bool enable) 206 { 207 m_enable_io = enable; 208 return *this; 209 } 210 211 ExecuteScriptOptions& 212 SetSetLLDBGlobals (bool set) 213 { 214 m_set_lldb_globals = set; 215 return *this; 216 } 217 218 ExecuteScriptOptions& 219 SetMaskoutErrors (bool maskout) 220 { 221 m_maskout_errors = maskout; 222 return *this; 223 } 224 225 private: 226 bool m_enable_io; 227 bool m_set_lldb_globals; 228 bool m_maskout_errors; 229 }; 230 231 virtual bool 232 ExecuteOneLine (const char *command, 233 CommandReturnObject *result, 234 const ExecuteScriptOptions &options = ExecuteScriptOptions()) = 0; 235 236 virtual void 237 ExecuteInterpreterLoop () = 0; 238 239 virtual bool 240 ExecuteOneLineWithReturn (const char *in_string, 241 ScriptReturnType return_type, 242 void *ret_value, 243 const ExecuteScriptOptions &options = ExecuteScriptOptions()) 244 { 245 return true; 246 } 247 248 virtual Error 249 ExecuteMultipleLines (const char *in_string, 250 const ExecuteScriptOptions &options = ExecuteScriptOptions()) 251 { 252 Error error; 253 error.SetErrorString("not implemented"); 254 return error; 255 } 256 257 virtual bool 258 ExportFunctionDefinitionToInterpreter (StringList &function_def) 259 { 260 return false; 261 } 262 263 virtual bool 264 GenerateBreakpointCommandCallbackData (StringList &input, std::string& output) 265 { 266 return false; 267 } 268 269 virtual bool 270 GenerateWatchpointCommandCallbackData (StringList &input, std::string& output) 271 { 272 return false; 273 } 274 275 virtual bool 276 GenerateTypeScriptFunction (const char* oneliner, std::string& output, void* name_token = NULL) 277 { 278 return false; 279 } 280 281 virtual bool 282 GenerateTypeScriptFunction (StringList &input, std::string& output, void* name_token = NULL) 283 { 284 return false; 285 } 286 287 virtual bool 288 GenerateScriptAliasFunction (StringList &input, std::string& output) 289 { 290 return false; 291 } 292 293 virtual bool 294 GenerateTypeSynthClass (StringList &input, std::string& output, void* name_token = NULL) 295 { 296 return false; 297 } 298 299 virtual bool 300 GenerateTypeSynthClass (const char* oneliner, std::string& output, void* name_token = NULL) 301 { 302 return false; 303 } 304 305 virtual lldb::ScriptInterpreterObjectSP 306 CreateSyntheticScriptedProvider (const char *class_name, 307 lldb::ValueObjectSP valobj) 308 { 309 return lldb::ScriptInterpreterObjectSP(); 310 } 311 312 virtual lldb::ScriptInterpreterObjectSP 313 OSPlugin_CreatePluginObject (const char *class_name, 314 lldb::ProcessSP process_sp) 315 { 316 return lldb::ScriptInterpreterObjectSP(); 317 } 318 319 virtual lldb::ScriptInterpreterObjectSP 320 OSPlugin_RegisterInfo (lldb::ScriptInterpreterObjectSP os_plugin_object_sp) 321 { 322 return lldb::ScriptInterpreterObjectSP(); 323 } 324 325 virtual lldb::ScriptInterpreterObjectSP 326 OSPlugin_ThreadsInfo (lldb::ScriptInterpreterObjectSP os_plugin_object_sp) 327 { 328 return lldb::ScriptInterpreterObjectSP(); 329 } 330 331 virtual lldb::ScriptInterpreterObjectSP 332 OSPlugin_RegisterContextData (lldb::ScriptInterpreterObjectSP os_plugin_object_sp, 333 lldb::tid_t thread_id) 334 { 335 return lldb::ScriptInterpreterObjectSP(); 336 } 337 338 virtual lldb::ScriptInterpreterObjectSP 339 OSPlugin_CreateThread (lldb::ScriptInterpreterObjectSP os_plugin_object_sp, 340 lldb::tid_t tid, 341 lldb::addr_t context) 342 { 343 return lldb::ScriptInterpreterObjectSP(); 344 } 345 346 virtual lldb::ScriptInterpreterObjectSP 347 LoadPluginModule (const FileSpec& file_spec, 348 lldb_private::Error& error) 349 { 350 return lldb::ScriptInterpreterObjectSP(); 351 } 352 353 virtual lldb::ScriptInterpreterObjectSP 354 GetDynamicSettings (lldb::ScriptInterpreterObjectSP plugin_module_sp, 355 Target* target, 356 const char* setting_name, 357 lldb_private::Error& error) 358 { 359 return lldb::ScriptInterpreterObjectSP(); 360 } 361 362 virtual bool 363 GenerateFunction(const char *signature, const StringList &input) 364 { 365 return false; 366 } 367 368 virtual void 369 CollectDataForBreakpointCommandCallback (BreakpointOptions *bp_options, 370 CommandReturnObject &result); 371 372 virtual void 373 CollectDataForWatchpointCommandCallback (WatchpointOptions *wp_options, 374 CommandReturnObject &result); 375 376 /// Set a one-liner as the callback for the breakpoint. 377 virtual void 378 SetBreakpointCommandCallback (BreakpointOptions *bp_options, 379 const char *oneliner) 380 { 381 return; 382 } 383 384 /// Set a one-liner as the callback for the watchpoint. 385 virtual void 386 SetWatchpointCommandCallback (WatchpointOptions *wp_options, 387 const char *oneliner) 388 { 389 return; 390 } 391 392 virtual bool 393 GetScriptedSummary (const char *function_name, 394 lldb::ValueObjectSP valobj, 395 lldb::ScriptInterpreterObjectSP& callee_wrapper_sp, 396 std::string& retval) 397 { 398 return false; 399 } 400 401 virtual size_t 402 CalculateNumChildren (const lldb::ScriptInterpreterObjectSP& implementor) 403 { 404 return 0; 405 } 406 407 virtual lldb::ValueObjectSP 408 GetChildAtIndex (const lldb::ScriptInterpreterObjectSP& implementor, uint32_t idx) 409 { 410 return lldb::ValueObjectSP(); 411 } 412 413 virtual int 414 GetIndexOfChildWithName (const lldb::ScriptInterpreterObjectSP& implementor, const char* child_name) 415 { 416 return UINT32_MAX; 417 } 418 419 virtual bool 420 UpdateSynthProviderInstance (const lldb::ScriptInterpreterObjectSP& implementor) 421 { 422 return false; 423 } 424 425 virtual bool 426 MightHaveChildrenSynthProviderInstance (const lldb::ScriptInterpreterObjectSP& implementor) 427 { 428 return true; 429 } 430 431 virtual bool 432 RunScriptBasedCommand (const char* impl_function, 433 const char* args, 434 ScriptedCommandSynchronicity synchronicity, 435 lldb_private::CommandReturnObject& cmd_retobj, 436 Error& error) 437 { 438 return false; 439 } 440 441 virtual bool 442 RunScriptFormatKeyword (const char* impl_function, 443 Process* process, 444 std::string& output, 445 Error& error) 446 { 447 error.SetErrorString("unimplemented"); 448 return false; 449 } 450 451 virtual bool 452 RunScriptFormatKeyword (const char* impl_function, 453 Thread* thread, 454 std::string& output, 455 Error& error) 456 { 457 error.SetErrorString("unimplemented"); 458 return false; 459 } 460 461 virtual bool 462 RunScriptFormatKeyword (const char* impl_function, 463 Target* target, 464 std::string& output, 465 Error& error) 466 { 467 error.SetErrorString("unimplemented"); 468 return false; 469 } 470 471 virtual bool 472 RunScriptFormatKeyword (const char* impl_function, 473 StackFrame* frame, 474 std::string& output, 475 Error& error) 476 { 477 error.SetErrorString("unimplemented"); 478 return false; 479 } 480 481 virtual bool 482 GetDocumentationForItem (const char* item, std::string& dest) 483 { 484 dest.clear(); 485 return false; 486 } 487 488 virtual bool 489 CheckObjectExists (const char* name) 490 { 491 return false; 492 } 493 494 virtual bool 495 LoadScriptingModule (const char* filename, 496 bool can_reload, 497 bool init_session, 498 lldb_private::Error& error, 499 lldb::ScriptInterpreterObjectSP* module_sp = nullptr) 500 { 501 error.SetErrorString("loading unimplemented"); 502 return false; 503 } 504 505 virtual lldb::ScriptInterpreterObjectSP 506 MakeScriptObject (void* object) 507 { 508 return lldb::ScriptInterpreterObjectSP(new ScriptInterpreterObject(object)); 509 } 510 511 virtual std::unique_ptr<ScriptInterpreterLocker> 512 AcquireInterpreterLock (); 513 514 const char * 515 GetScriptInterpreterPtyName (); 516 517 int 518 GetMasterFileDescriptor (); 519 520 CommandInterpreter & 521 GetCommandInterpreter (); 522 523 static std::string 524 LanguageToString (lldb::ScriptLanguage language); 525 526 static void 527 InitializeInterpreter (SWIGInitCallback python_swig_init_callback, 528 SWIGBreakpointCallbackFunction swig_breakpoint_callback, 529 SWIGWatchpointCallbackFunction swig_watchpoint_callback, 530 SWIGPythonTypeScriptCallbackFunction swig_typescript_callback, 531 SWIGPythonCreateSyntheticProvider swig_synthetic_script, 532 SWIGPythonCalculateNumChildren swig_calc_children, 533 SWIGPythonGetChildAtIndex swig_get_child_index, 534 SWIGPythonGetIndexOfChildWithName swig_get_index_child, 535 SWIGPythonCastPyObjectToSBValue swig_cast_to_sbvalue , 536 SWIGPythonGetValueObjectSPFromSBValue swig_get_valobj_sp_from_sbvalue, 537 SWIGPythonUpdateSynthProviderInstance swig_update_provider, 538 SWIGPythonMightHaveChildrenSynthProviderInstance swig_mighthavechildren_provider, 539 SWIGPythonCallCommand swig_call_command, 540 SWIGPythonCallModuleInit swig_call_module_init, 541 SWIGPythonCreateOSPlugin swig_create_os_plugin, 542 SWIGPythonScriptKeyword_Process swig_run_script_keyword_process, 543 SWIGPythonScriptKeyword_Thread swig_run_script_keyword_thread, 544 SWIGPythonScriptKeyword_Target swig_run_script_keyword_target, 545 SWIGPythonScriptKeyword_Frame swig_run_script_keyword_frame, 546 SWIGPython_GetDynamicSetting swig_plugin_get); 547 548 static void 549 TerminateInterpreter (); 550 551 virtual void 552 ResetOutputFileHandle (FILE *new_fh) { } //By default, do nothing. 553 554protected: 555 CommandInterpreter &m_interpreter; 556 lldb::ScriptLanguage m_script_lang; 557}; 558 559} // namespace lldb_private 560 561#endif // #ifndef liblldb_ScriptInterpreter_h_ 562