1%header %{
2
3template <typename T> void PushSBClass(lua_State * L, T * obj);
4
5// This function is called from Lua::CallBreakpointCallback
6llvm::Expected<bool> lldb_private::LLDBSwigLuaBreakpointCallbackFunction(
7    lua_State * L, lldb::StackFrameSP stop_frame_sp,
8    lldb::BreakpointLocationSP bp_loc_sp,
9    const StructuredDataImpl &extra_args_impl) {
10  lldb::SBFrame sb_frame(stop_frame_sp);
11  lldb::SBBreakpointLocation sb_bp_loc(bp_loc_sp);
12  int nargs = 2;
13
14  lldb::SBStructuredData extra_args(extra_args_impl);
15
16  // Push the Lua wrappers
17  PushSBClass(L, &sb_frame);
18  PushSBClass(L, &sb_bp_loc);
19
20  if (extra_args.IsValid()) {
21    PushSBClass(L, &extra_args);
22    nargs++;
23  }
24
25  // Call into the Lua callback passing 'sb_frame' and 'sb_bp_loc'.
26  // Expects a boolean return.
27  if (lua_pcall(L, nargs, 1, 0) != LUA_OK) {
28    llvm::Error E = llvm::make_error<llvm::StringError>(
29        llvm::formatv("{0}\n", lua_tostring(L, -1)),
30        llvm::inconvertibleErrorCode());
31    // Pop error message from the stack.
32    lua_pop(L, 1);
33    return std::move(E);
34  }
35
36  // Boolean return from the callback
37  bool stop = lua_toboolean(L, -1);
38  lua_pop(L, 1);
39
40  return stop;
41}
42
43// This function is called from Lua::CallWatchpointCallback
44llvm::Expected<bool> lldb_private::LLDBSwigLuaWatchpointCallbackFunction(
45    lua_State * L, lldb::StackFrameSP stop_frame_sp, lldb::WatchpointSP wp_sp) {
46  lldb::SBFrame sb_frame(stop_frame_sp);
47  lldb::SBWatchpoint sb_wp(wp_sp);
48  int nargs = 2;
49
50  // Push the Lua wrappers
51  PushSBClass(L, &sb_frame);
52  PushSBClass(L, &sb_wp);
53
54  // Call into the Lua callback passing 'sb_frame' and 'sb_wp'.
55  // Expects a boolean return.
56  if (lua_pcall(L, nargs, 1, 0) != LUA_OK) {
57    llvm::Error E = llvm::make_error<llvm::StringError>(
58        llvm::formatv("{0}\n", lua_tostring(L, -1)),
59        llvm::inconvertibleErrorCode());
60    // Pop error message from the stack.
61    lua_pop(L, 1);
62    return std::move(E);
63  }
64
65  // Boolean return from the callback
66  bool stop = lua_toboolean(L, -1);
67  lua_pop(L, 1);
68
69  return stop;
70}
71
72static void LLDBSwigLuaCallLuaLogOutputCallback(const char *str, void *baton) {
73  lua_State *L = (lua_State *)baton;
74
75  lua_pushlightuserdata(L, (void *)&LLDBSwigLuaCallLuaLogOutputCallback);
76  lua_gettable(L, LUA_REGISTRYINDEX);
77
78  // FIXME: There's no way to report errors back to the user
79  lua_pushstring(L, str);
80  lua_pcall(L, 1, 0, 0);
81}
82
83static int LLDBSwigLuaCloseFileHandle(lua_State * L) {
84  return luaL_error(L, "You cannot close a file handle used by lldb.");
85}
86
87%}
88