130fdc8d8SChris Lattner //===-- ScriptInterpreter.cpp -----------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 630fdc8d8SChris Lattner // 730fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 830fdc8d8SChris Lattner 930fdc8d8SChris Lattner #include "lldb/Interpreter/ScriptInterpreter.h" 1030fdc8d8SChris Lattner 1130fdc8d8SChris Lattner #include <stdio.h> 12b9c1b51eSKate Stone #include <stdlib.h> 13b9c1b51eSKate Stone #include <string> 1430fdc8d8SChris Lattner 1524ae6294SZachary Turner #include "lldb/Host/PseudoTerminal.h" 1630fdc8d8SChris Lattner #include "lldb/Interpreter/CommandReturnObject.h" 1797206d57SZachary Turner #include "lldb/Utility/Status.h" 18bf9a7730SZachary Turner #include "lldb/Utility/Stream.h" 19573ab909SZachary Turner #include "lldb/Utility/StringList.h" 2030fdc8d8SChris Lattner 2130fdc8d8SChris Lattner using namespace lldb; 2230fdc8d8SChris Lattner using namespace lldb_private; 2330fdc8d8SChris Lattner 248d1fb843SJonas Devlieghere ScriptInterpreter::ScriptInterpreter(Debugger &debugger, 25b9c1b51eSKate Stone lldb::ScriptLanguage script_lang) 268d1fb843SJonas Devlieghere : m_debugger(debugger), m_script_lang(script_lang) {} 2730fdc8d8SChris Lattner 28b9c1b51eSKate Stone ScriptInterpreter::~ScriptInterpreter() {} 2930fdc8d8SChris Lattner 30b9c1b51eSKate Stone void ScriptInterpreter::CollectDataForBreakpointCommandCallback( 31b5796cb4SJim Ingham std::vector<BreakpointOptions *> &bp_options_vec, 32b9c1b51eSKate Stone CommandReturnObject &result) { 3330fdc8d8SChris Lattner result.SetStatus(eReturnStatusFailed); 34b9c1b51eSKate Stone result.AppendError( 35ba0eb7b6SJonas Devlieghere "This script interpreter does not support breakpoint callbacks."); 3630fdc8d8SChris Lattner } 3730fdc8d8SChris Lattner 38b9c1b51eSKate Stone void ScriptInterpreter::CollectDataForWatchpointCommandCallback( 39b9c1b51eSKate Stone WatchpointOptions *bp_options, CommandReturnObject &result) { 40e9a5627eSJohnny Chen result.SetStatus(eReturnStatusFailed); 41b9c1b51eSKate Stone result.AppendError( 42ba0eb7b6SJonas Devlieghere "This script interpreter does not support watchpoint callbacks."); 43e9a5627eSJohnny Chen } 44e9a5627eSJohnny Chen 45bd5c8d16SJonas Devlieghere bool ScriptInterpreter::LoadScriptingModule( 4615625112SJonas Devlieghere const char *filename, bool init_session, lldb_private::Status &error, 4715625112SJonas Devlieghere StructuredData::ObjectSP *module_sp) { 48bd5c8d16SJonas Devlieghere error.SetErrorString( 49bd5c8d16SJonas Devlieghere "This script interpreter does not support importing modules."); 50bd5c8d16SJonas Devlieghere return false; 51bd5c8d16SJonas Devlieghere } 52bd5c8d16SJonas Devlieghere 53b9c1b51eSKate Stone std::string ScriptInterpreter::LanguageToString(lldb::ScriptLanguage language) { 54b9c1b51eSKate Stone switch (language) { 553df9a8dfSCaroline Tice case eScriptLanguageNone: 56acdda134SJonas Devlieghere return "None"; 573df9a8dfSCaroline Tice case eScriptLanguagePython: 58acdda134SJonas Devlieghere return "Python"; 59acdda134SJonas Devlieghere case eScriptLanguageLua: 60acdda134SJonas Devlieghere return "Lua"; 61f7e07256SJim Ingham case eScriptLanguageUnknown: 62acdda134SJonas Devlieghere return "Unknown"; 633df9a8dfSCaroline Tice } 64*fbccef6bSPavel Labath llvm_unreachable("Unhandled ScriptInterpreter!"); 653df9a8dfSCaroline Tice } 662f88aadfSCaroline Tice 67f7e07256SJim Ingham lldb::ScriptLanguage 68f7e07256SJim Ingham ScriptInterpreter::StringToLanguage(const llvm::StringRef &language) { 69f7e07256SJim Ingham if (language.equals_lower(LanguageToString(eScriptLanguageNone))) 70f7e07256SJim Ingham return eScriptLanguageNone; 7145188dd9SDavide Italiano if (language.equals_lower(LanguageToString(eScriptLanguagePython))) 72f7e07256SJim Ingham return eScriptLanguagePython; 73acdda134SJonas Devlieghere if (language.equals_lower(LanguageToString(eScriptLanguageLua))) 74acdda134SJonas Devlieghere return eScriptLanguageLua; 75f7e07256SJim Ingham return eScriptLanguageUnknown; 76f7e07256SJim Ingham } 77f7e07256SJim Ingham 7897206d57SZachary Turner Status ScriptInterpreter::SetBreakpointCommandCallback( 79b9c1b51eSKate Stone std::vector<BreakpointOptions *> &bp_options_vec, 80b9c1b51eSKate Stone const char *callback_text) { 8197206d57SZachary Turner Status return_error; 82b9c1b51eSKate Stone for (BreakpointOptions *bp_options : bp_options_vec) { 83b5796cb4SJim Ingham return_error = SetBreakpointCommandCallback(bp_options, callback_text); 84b5796cb4SJim Ingham if (return_error.Success()) 85b5796cb4SJim Ingham break; 86b5796cb4SJim Ingham } 87b5796cb4SJim Ingham return return_error; 88b5796cb4SJim Ingham } 89b5796cb4SJim Ingham 90738af7a6SJim Ingham Status ScriptInterpreter::SetBreakpointCommandCallbackFunction( 91acdda134SJonas Devlieghere std::vector<BreakpointOptions *> &bp_options_vec, const char *function_name, 92738af7a6SJim Ingham StructuredData::ObjectSP extra_args_sp) { 93738af7a6SJim Ingham Status error; 94b9c1b51eSKate Stone for (BreakpointOptions *bp_options : bp_options_vec) { 95738af7a6SJim Ingham error = SetBreakpointCommandCallbackFunction(bp_options, function_name, 96738af7a6SJim Ingham extra_args_sp); 97738af7a6SJim Ingham if (!error.Success()) 98738af7a6SJim Ingham return error; 99b5796cb4SJim Ingham } 100738af7a6SJim Ingham return error; 101b5796cb4SJim Ingham } 102b5796cb4SJim Ingham 1037b0992d9SGreg Clayton std::unique_ptr<ScriptInterpreterLocker> 104b9c1b51eSKate Stone ScriptInterpreter::AcquireInterpreterLock() { 105b9c1b51eSKate Stone return std::unique_ptr<ScriptInterpreterLocker>( 106b9c1b51eSKate Stone new ScriptInterpreterLocker()); 107360cc318SEnrico Granata } 108