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