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