brintos

brintos / llvm-project-archived public Read only

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