//===-- ScriptInterpreter.h -------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef liblldb_ScriptInterpreter_h_ #define liblldb_ScriptInterpreter_h_ // C Includes // C++ Includes // Other libraries and framework includes // Project includes #include "lldb/lldb-private.h" #include "lldb/Breakpoint/BreakpointOptions.h" #include "lldb/Core/Broadcaster.h" #include "lldb/Core/PluginInterface.h" #include "lldb/Utility/Status.h" #include "lldb/Utility/StructuredData.h" #include "lldb/Host/PseudoTerminal.h" namespace lldb_private { class ScriptInterpreterLocker { public: ScriptInterpreterLocker() = default; virtual ~ScriptInterpreterLocker() = default; private: DISALLOW_COPY_AND_ASSIGN(ScriptInterpreterLocker); }; class ScriptInterpreter : public PluginInterface { public: typedef enum { eScriptReturnTypeCharPtr, eScriptReturnTypeBool, eScriptReturnTypeShortInt, eScriptReturnTypeShortIntUnsigned, eScriptReturnTypeInt, eScriptReturnTypeIntUnsigned, eScriptReturnTypeLongInt, eScriptReturnTypeLongIntUnsigned, eScriptReturnTypeLongLong, eScriptReturnTypeLongLongUnsigned, eScriptReturnTypeFloat, eScriptReturnTypeDouble, eScriptReturnTypeChar, eScriptReturnTypeCharStrOrNone, eScriptReturnTypeOpaqueObject } ScriptReturnType; ScriptInterpreter(CommandInterpreter &interpreter, lldb::ScriptLanguage script_lang); ~ScriptInterpreter() override; struct ExecuteScriptOptions { public: ExecuteScriptOptions() : m_enable_io(true), m_set_lldb_globals(true), m_maskout_errors(true) {} bool GetEnableIO() const { return m_enable_io; } bool GetSetLLDBGlobals() const { return m_set_lldb_globals; } bool GetMaskoutErrors() const { return m_maskout_errors; } ExecuteScriptOptions &SetEnableIO(bool enable) { m_enable_io = enable; return *this; } ExecuteScriptOptions &SetSetLLDBGlobals(bool set) { m_set_lldb_globals = set; return *this; } ExecuteScriptOptions &SetMaskoutErrors(bool maskout) { m_maskout_errors = maskout; return *this; } private: bool m_enable_io; bool m_set_lldb_globals; bool m_maskout_errors; }; virtual bool Interrupt() { return false; } virtual bool ExecuteOneLine( const char *command, CommandReturnObject *result, const ExecuteScriptOptions &options = ExecuteScriptOptions()) = 0; virtual void ExecuteInterpreterLoop() = 0; virtual bool ExecuteOneLineWithReturn( const char *in_string, ScriptReturnType return_type, void *ret_value, const ExecuteScriptOptions &options = ExecuteScriptOptions()) { return true; } virtual Status ExecuteMultipleLines( const char *in_string, const ExecuteScriptOptions &options = ExecuteScriptOptions()) { Status error; error.SetErrorString("not implemented"); return error; } virtual Status ExportFunctionDefinitionToInterpreter(StringList &function_def) { Status error; error.SetErrorString("not implemented"); return error; } virtual Status GenerateBreakpointCommandCallbackData(StringList &input, std::string &output) { Status error; error.SetErrorString("not implemented"); return error; } virtual bool GenerateWatchpointCommandCallbackData(StringList &input, std::string &output) { return false; } virtual bool GenerateTypeScriptFunction(const char *oneliner, std::string &output, const void *name_token = nullptr) { return false; } virtual bool GenerateTypeScriptFunction(StringList &input, std::string &output, const void *name_token = nullptr) { return false; } virtual bool GenerateScriptAliasFunction(StringList &input, std::string &output) { return false; } virtual bool GenerateTypeSynthClass(StringList &input, std::string &output, const void *name_token = nullptr) { return false; } virtual bool GenerateTypeSynthClass(const char *oneliner, std::string &output, const void *name_token = nullptr) { return false; } virtual StructuredData::ObjectSP CreateSyntheticScriptedProvider(const char *class_name, lldb::ValueObjectSP valobj) { return StructuredData::ObjectSP(); } virtual StructuredData::GenericSP CreateScriptCommandObject(const char *class_name) { return StructuredData::GenericSP(); } virtual StructuredData::GenericSP OSPlugin_CreatePluginObject(const char *class_name, lldb::ProcessSP process_sp) { return StructuredData::GenericSP(); } virtual StructuredData::DictionarySP OSPlugin_RegisterInfo(StructuredData::ObjectSP os_plugin_object_sp) { return StructuredData::DictionarySP(); } virtual StructuredData::ArraySP OSPlugin_ThreadsInfo(StructuredData::ObjectSP os_plugin_object_sp) { return StructuredData::ArraySP(); } virtual StructuredData::StringSP OSPlugin_RegisterContextData(StructuredData::ObjectSP os_plugin_object_sp, lldb::tid_t thread_id) { return StructuredData::StringSP(); } virtual StructuredData::DictionarySP OSPlugin_CreateThread(StructuredData::ObjectSP os_plugin_object_sp, lldb::tid_t tid, lldb::addr_t context) { return StructuredData::DictionarySP(); } virtual StructuredData::ObjectSP CreateScriptedThreadPlan(const char *class_name, lldb::ThreadPlanSP thread_plan_sp) { return StructuredData::ObjectSP(); } virtual bool ScriptedThreadPlanExplainsStop(StructuredData::ObjectSP implementor_sp, Event *event, bool &script_error) { script_error = true; return true; } virtual bool ScriptedThreadPlanShouldStop(StructuredData::ObjectSP implementor_sp, Event *event, bool &script_error) { script_error = true; return true; } virtual bool ScriptedThreadPlanIsStale(StructuredData::ObjectSP implementor_sp, bool &script_error) { script_error = true; return true; } virtual lldb::StateType ScriptedThreadPlanGetRunState(StructuredData::ObjectSP implementor_sp, bool &script_error) { script_error = true; return lldb::eStateStepping; } virtual StructuredData::ObjectSP LoadPluginModule(const FileSpec &file_spec, lldb_private::Status &error) { return StructuredData::ObjectSP(); } virtual StructuredData::DictionarySP GetDynamicSettings(StructuredData::ObjectSP plugin_module_sp, Target *target, const char *setting_name, lldb_private::Status &error) { return StructuredData::DictionarySP(); } virtual Status GenerateFunction(const char *signature, const StringList &input) { Status error; error.SetErrorString("unimplemented"); return error; } virtual void CollectDataForBreakpointCommandCallback( std::vector &options, CommandReturnObject &result); virtual void CollectDataForWatchpointCommandCallback(WatchpointOptions *wp_options, CommandReturnObject &result); /// Set the specified text as the callback for the breakpoint. Status SetBreakpointCommandCallback(std::vector &bp_options_vec, const char *callback_text); virtual Status SetBreakpointCommandCallback(BreakpointOptions *bp_options, const char *callback_text) { Status error; error.SetErrorString("unimplemented"); return error; } /// This one is for deserialization: virtual Status SetBreakpointCommandCallback( BreakpointOptions *bp_options, std::unique_ptr &data_up) { Status error; error.SetErrorString("unimplemented"); return error; } void SetBreakpointCommandCallbackFunction( std::vector &bp_options_vec, const char *function_name); /// Set a one-liner as the callback for the breakpoint. virtual void SetBreakpointCommandCallbackFunction(BreakpointOptions *bp_options, const char *function_name) {} /// Set a one-liner as the callback for the watchpoint. virtual void SetWatchpointCommandCallback(WatchpointOptions *wp_options, const char *oneliner) {} virtual bool GetScriptedSummary(const char *function_name, lldb::ValueObjectSP valobj, StructuredData::ObjectSP &callee_wrapper_sp, const TypeSummaryOptions &options, std::string &retval) { return false; } virtual void Clear() { // Clean up any ref counts to SBObjects that might be in global variables } virtual size_t CalculateNumChildren(const StructuredData::ObjectSP &implementor, uint32_t max) { return 0; } virtual lldb::ValueObjectSP GetChildAtIndex(const StructuredData::ObjectSP &implementor, uint32_t idx) { return lldb::ValueObjectSP(); } virtual int GetIndexOfChildWithName(const StructuredData::ObjectSP &implementor, const char *child_name) { return UINT32_MAX; } virtual bool UpdateSynthProviderInstance(const StructuredData::ObjectSP &implementor) { return false; } virtual bool MightHaveChildrenSynthProviderInstance( const StructuredData::ObjectSP &implementor) { return true; } virtual lldb::ValueObjectSP GetSyntheticValue(const StructuredData::ObjectSP &implementor) { return nullptr; } virtual ConstString GetSyntheticTypeName(const StructuredData::ObjectSP &implementor) { return ConstString(); } virtual bool RunScriptBasedCommand(const char *impl_function, const char *args, ScriptedCommandSynchronicity synchronicity, lldb_private::CommandReturnObject &cmd_retobj, Status &error, const lldb_private::ExecutionContext &exe_ctx) { return false; } virtual bool RunScriptBasedCommand(StructuredData::GenericSP impl_obj_sp, const char *args, ScriptedCommandSynchronicity synchronicity, lldb_private::CommandReturnObject &cmd_retobj, Status &error, const lldb_private::ExecutionContext &exe_ctx) { return false; } virtual bool RunScriptFormatKeyword(const char *impl_function, Process *process, std::string &output, Status &error) { error.SetErrorString("unimplemented"); return false; } virtual bool RunScriptFormatKeyword(const char *impl_function, Thread *thread, std::string &output, Status &error) { error.SetErrorString("unimplemented"); return false; } virtual bool RunScriptFormatKeyword(const char *impl_function, Target *target, std::string &output, Status &error) { error.SetErrorString("unimplemented"); return false; } virtual bool RunScriptFormatKeyword(const char *impl_function, StackFrame *frame, std::string &output, Status &error) { error.SetErrorString("unimplemented"); return false; } virtual bool RunScriptFormatKeyword(const char *impl_function, ValueObject *value, std::string &output, Status &error) { error.SetErrorString("unimplemented"); return false; } virtual bool GetDocumentationForItem(const char *item, std::string &dest) { dest.clear(); return false; } virtual bool GetShortHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp, std::string &dest) { dest.clear(); return false; } virtual uint32_t GetFlagsForCommandObject(StructuredData::GenericSP cmd_obj_sp) { return 0; } virtual bool GetLongHelpForCommandObject(StructuredData::GenericSP cmd_obj_sp, std::string &dest) { dest.clear(); return false; } virtual bool CheckObjectExists(const char *name) { return false; } virtual bool LoadScriptingModule(const char *filename, bool can_reload, bool init_session, lldb_private::Status &error, StructuredData::ObjectSP *module_sp = nullptr) { error.SetErrorString("loading unimplemented"); return false; } virtual bool IsReservedWord(const char *word) { return false; } virtual std::unique_ptr AcquireInterpreterLock(); const char *GetScriptInterpreterPtyName(); int GetMasterFileDescriptor(); CommandInterpreter &GetCommandInterpreter(); static std::string LanguageToString(lldb::ScriptLanguage language); static lldb::ScriptLanguage StringToLanguage(const llvm::StringRef &string); virtual void ResetOutputFileHandle(FILE *new_fh) {} // By default, do nothing. lldb::ScriptLanguage GetLanguage() { return m_script_lang; } protected: CommandInterpreter &m_interpreter; lldb::ScriptLanguage m_script_lang; }; } // namespace lldb_private #endif // liblldb_ScriptInterpreter_h_