167de8962SJonas Devlieghere //===-- ScriptInterpreterLua.h ----------------------------------*- C++ -*-===//
267de8962SJonas Devlieghere //
367de8962SJonas Devlieghere // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
467de8962SJonas Devlieghere // See https://llvm.org/LICENSE.txt for license information.
567de8962SJonas Devlieghere // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
667de8962SJonas Devlieghere //
767de8962SJonas Devlieghere //===----------------------------------------------------------------------===//
867de8962SJonas Devlieghere 
967de8962SJonas Devlieghere #ifndef liblldb_ScriptInterpreterLua_h_
1067de8962SJonas Devlieghere #define liblldb_ScriptInterpreterLua_h_
1167de8962SJonas Devlieghere 
12*532e4203SPedro Tammela #include "lldb/Core/StructuredDataImpl.h"
1367de8962SJonas Devlieghere #include "lldb/Interpreter/ScriptInterpreter.h"
14a0d7406aSPedro Tammela #include "lldb/Utility/Status.h"
15a0d7406aSPedro Tammela #include "lldb/lldb-enumerations.h"
1667de8962SJonas Devlieghere 
1767de8962SJonas Devlieghere namespace lldb_private {
184164be72SJonas Devlieghere class Lua;
1967de8962SJonas Devlieghere class ScriptInterpreterLua : public ScriptInterpreter {
2067de8962SJonas Devlieghere public:
21a0d7406aSPedro Tammela   class CommandDataLua : public BreakpointOptions::CommandData {
22a0d7406aSPedro Tammela   public:
23a0d7406aSPedro Tammela     CommandDataLua() : BreakpointOptions::CommandData() {
24a0d7406aSPedro Tammela       interpreter = lldb::eScriptLanguageLua;
25a0d7406aSPedro Tammela     }
26*532e4203SPedro Tammela     CommandDataLua(StructuredData::ObjectSP extra_args_sp)
27*532e4203SPedro Tammela         : BreakpointOptions::CommandData(), m_extra_args_sp(extra_args_sp) {
28*532e4203SPedro Tammela       interpreter = lldb::eScriptLanguageLua;
29*532e4203SPedro Tammela     }
30*532e4203SPedro Tammela     StructuredData::ObjectSP m_extra_args_sp;
31a0d7406aSPedro Tammela   };
32a0d7406aSPedro Tammela 
3367de8962SJonas Devlieghere   ScriptInterpreterLua(Debugger &debugger);
3467de8962SJonas Devlieghere 
3567de8962SJonas Devlieghere   ~ScriptInterpreterLua() override;
3667de8962SJonas Devlieghere 
3767de8962SJonas Devlieghere   bool ExecuteOneLine(
3867de8962SJonas Devlieghere       llvm::StringRef command, CommandReturnObject *result,
3967de8962SJonas Devlieghere       const ExecuteScriptOptions &options = ExecuteScriptOptions()) override;
4067de8962SJonas Devlieghere 
4167de8962SJonas Devlieghere   void ExecuteInterpreterLoop() override;
4267de8962SJonas Devlieghere 
4300bb397bSJonas Devlieghere   bool LoadScriptingModule(const char *filename, bool init_session,
44572b9f46SJonas Devlieghere                            lldb_private::Status &error,
4500bb397bSJonas Devlieghere                            StructuredData::ObjectSP *module_sp = nullptr,
4600bb397bSJonas Devlieghere                            FileSpec extra_search_dir = {}) override;
47572b9f46SJonas Devlieghere 
4867de8962SJonas Devlieghere   // Static Functions
4967de8962SJonas Devlieghere   static void Initialize();
5067de8962SJonas Devlieghere 
5167de8962SJonas Devlieghere   static void Terminate();
5267de8962SJonas Devlieghere 
5367de8962SJonas Devlieghere   static lldb::ScriptInterpreterSP CreateInstance(Debugger &debugger);
5467de8962SJonas Devlieghere 
5567de8962SJonas Devlieghere   static lldb_private::ConstString GetPluginNameStatic();
5667de8962SJonas Devlieghere 
5767de8962SJonas Devlieghere   static const char *GetPluginDescriptionStatic();
5867de8962SJonas Devlieghere 
59a0d7406aSPedro Tammela   static bool BreakpointCallbackFunction(void *baton,
60a0d7406aSPedro Tammela                                          StoppointCallbackContext *context,
61a0d7406aSPedro Tammela                                          lldb::user_id_t break_id,
62a0d7406aSPedro Tammela                                          lldb::user_id_t break_loc_id);
63a0d7406aSPedro Tammela 
6467de8962SJonas Devlieghere   // PluginInterface protocol
6567de8962SJonas Devlieghere   lldb_private::ConstString GetPluginName() override;
6667de8962SJonas Devlieghere 
6767de8962SJonas Devlieghere   uint32_t GetPluginVersion() override;
684164be72SJonas Devlieghere 
694164be72SJonas Devlieghere   Lua &GetLua();
704164be72SJonas Devlieghere 
7145c971f7SJonas Devlieghere   llvm::Error EnterSession(lldb::user_id_t debugger_id);
7245c971f7SJonas Devlieghere   llvm::Error LeaveSession();
7345c971f7SJonas Devlieghere 
74d853bd7aSPedro Tammela   void CollectDataForBreakpointCommandCallback(
75d853bd7aSPedro Tammela       std::vector<BreakpointOptions *> &bp_options_vec,
76d853bd7aSPedro Tammela       CommandReturnObject &result) override;
77d853bd7aSPedro Tammela 
78a0d7406aSPedro Tammela   Status SetBreakpointCommandCallback(BreakpointOptions *bp_options,
79a0d7406aSPedro Tammela                                       const char *command_body_text) override;
80a0d7406aSPedro Tammela 
81*532e4203SPedro Tammela   Status SetBreakpointCommandCallbackFunction(
82*532e4203SPedro Tammela       BreakpointOptions *bp_options, const char *function_name,
83*532e4203SPedro Tammela       StructuredData::ObjectSP extra_args_sp) override;
84*532e4203SPedro Tammela 
854164be72SJonas Devlieghere private:
864164be72SJonas Devlieghere   std::unique_ptr<Lua> m_lua;
8745c971f7SJonas Devlieghere   bool m_session_is_active = false;
88*532e4203SPedro Tammela 
89*532e4203SPedro Tammela   Status RegisterBreakpointCallback(BreakpointOptions *bp_options,
90*532e4203SPedro Tammela                                     const char *command_body_text,
91*532e4203SPedro Tammela                                     StructuredData::ObjectSP extra_args_sp);
9267de8962SJonas Devlieghere };
9367de8962SJonas Devlieghere 
9467de8962SJonas Devlieghere } // namespace lldb_private
9567de8962SJonas Devlieghere 
9667de8962SJonas Devlieghere #endif // liblldb_ScriptInterpreterLua_h_
97