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