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