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> 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 wrappers 18 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 callback 38 bool stop = lua_toboolean(L, -1); 39 lua_pop(L, 1); 40 41 return stop; 42} 43 44// This function is called from Lua::CallWatchpointCallback 45llvm::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 wrappers 53 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 callback 68 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 user 81 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