1a0d7406aSPedro Tammela%header %{
2a0d7406aSPedro Tammela
3*9d5e37edSPavel Labathtemplate <typename T> void PushSBClass(lua_State * L, T * obj);
4a0d7406aSPedro Tammela
5a0d7406aSPedro Tammela// This function is called from Lua::CallBreakpointCallback
6*9d5e37edSPavel Labathllvm::Expected<bool> lldb_private::LLDBSwigLuaBreakpointCallbackFunction(
7*9d5e37edSPavel Labath    lua_State * L, lldb::StackFrameSP stop_frame_sp,
8532e4203SPedro Tammela    lldb::BreakpointLocationSP bp_loc_sp,
9*9d5e37edSPavel Labath    const StructuredDataImpl &extra_args_impl) {
10a0d7406aSPedro Tammela  lldb::SBFrame sb_frame(stop_frame_sp);
11a0d7406aSPedro Tammela  lldb::SBBreakpointLocation sb_bp_loc(bp_loc_sp);
12532e4203SPedro Tammela  int nargs = 2;
13532e4203SPedro Tammela
1482de8df2SPavel Labath  lldb::SBStructuredData extra_args(extra_args_impl);
15a0d7406aSPedro Tammela
16a0d7406aSPedro Tammela  // Push the Lua wrappers
17a0d7406aSPedro Tammela  PushSBClass(L, &sb_frame);
18a0d7406aSPedro Tammela  PushSBClass(L, &sb_bp_loc);
19a0d7406aSPedro Tammela
2082de8df2SPavel Labath  if (extra_args.IsValid()) {
2182de8df2SPavel Labath    PushSBClass(L, &extra_args);
22532e4203SPedro Tammela    nargs++;
23532e4203SPedro Tammela  }
24532e4203SPedro Tammela
25a0d7406aSPedro Tammela  // Call into the Lua callback passing 'sb_frame' and 'sb_bp_loc'.
26a0d7406aSPedro Tammela  // Expects a boolean return.
27532e4203SPedro Tammela  if (lua_pcall(L, nargs, 1, 0) != LUA_OK) {
28a0d7406aSPedro Tammela    llvm::Error E = llvm::make_error<llvm::StringError>(
29a0d7406aSPedro Tammela        llvm::formatv("{0}\n", lua_tostring(L, -1)),
30a0d7406aSPedro Tammela        llvm::inconvertibleErrorCode());
31a0d7406aSPedro Tammela    // Pop error message from the stack.
32a0d7406aSPedro Tammela    lua_pop(L, 1);
33a0d7406aSPedro Tammela    return std::move(E);
34a0d7406aSPedro Tammela  }
35a0d7406aSPedro Tammela
36a0d7406aSPedro Tammela  // Boolean return from the callback
37a0d7406aSPedro Tammela  bool stop = lua_toboolean(L, -1);
38a0d7406aSPedro Tammela  lua_pop(L, 1);
39a0d7406aSPedro Tammela
40a0d7406aSPedro Tammela  return stop;
41a0d7406aSPedro Tammela}
42a0d7406aSPedro Tammela
43e81ba283SSiger Yang// This function is called from Lua::CallWatchpointCallback
44*9d5e37edSPavel Labathllvm::Expected<bool> lldb_private::LLDBSwigLuaWatchpointCallbackFunction(
45*9d5e37edSPavel Labath    lua_State * L, lldb::StackFrameSP stop_frame_sp, lldb::WatchpointSP wp_sp) {
46e81ba283SSiger Yang  lldb::SBFrame sb_frame(stop_frame_sp);
47e81ba283SSiger Yang  lldb::SBWatchpoint sb_wp(wp_sp);
48e81ba283SSiger Yang  int nargs = 2;
49e81ba283SSiger Yang
50e81ba283SSiger Yang  // Push the Lua wrappers
51e81ba283SSiger Yang  PushSBClass(L, &sb_frame);
52e81ba283SSiger Yang  PushSBClass(L, &sb_wp);
53e81ba283SSiger Yang
54e81ba283SSiger Yang  // Call into the Lua callback passing 'sb_frame' and 'sb_wp'.
55e81ba283SSiger Yang  // Expects a boolean return.
56e81ba283SSiger Yang  if (lua_pcall(L, nargs, 1, 0) != LUA_OK) {
57e81ba283SSiger Yang    llvm::Error E = llvm::make_error<llvm::StringError>(
58e81ba283SSiger Yang        llvm::formatv("{0}\n", lua_tostring(L, -1)),
59e81ba283SSiger Yang        llvm::inconvertibleErrorCode());
60e81ba283SSiger Yang    // Pop error message from the stack.
61e81ba283SSiger Yang    lua_pop(L, 1);
62e81ba283SSiger Yang    return std::move(E);
63e81ba283SSiger Yang  }
64e81ba283SSiger Yang
65e81ba283SSiger Yang  // Boolean return from the callback
66e81ba283SSiger Yang  bool stop = lua_toboolean(L, -1);
67e81ba283SSiger Yang  lua_pop(L, 1);
68e81ba283SSiger Yang
69e81ba283SSiger Yang  return stop;
70e81ba283SSiger Yang}
71e81ba283SSiger Yang
72*9d5e37edSPavel Labathstatic void LLDBSwigLuaCallLuaLogOutputCallback(const char *str, void *baton) {
7367f94e5aSSiger Yang  lua_State *L = (lua_State *)baton;
7467f94e5aSSiger Yang
7567f94e5aSSiger Yang  lua_pushlightuserdata(L, (void *)&LLDBSwigLuaCallLuaLogOutputCallback);
7667f94e5aSSiger Yang  lua_gettable(L, LUA_REGISTRYINDEX);
7767f94e5aSSiger Yang
7867f94e5aSSiger Yang  // FIXME: There's no way to report errors back to the user
7967f94e5aSSiger Yang  lua_pushstring(L, str);
8067f94e5aSSiger Yang  lua_pcall(L, 1, 0, 0);
8167f94e5aSSiger Yang}
8267f94e5aSSiger Yang
83a52af6d3SPavel Labathstatic int LLDBSwigLuaCloseFileHandle(lua_State * L) {
8467f94e5aSSiger Yang  return luaL_error(L, "You cannot close a file handle used by lldb.");
8567f94e5aSSiger Yang}
86a0d7406aSPedro Tammela
87a0d7406aSPedro Tammela%}
88