| %header %{ |
| |
| template <typename T> |
| void |
| PushSBClass(lua_State* L, T* obj); |
| |
| %} |
| |
| %runtime %{ |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| void LLDBSwigLuaCallLuaLogOutputCallback(const char *str, void *baton); |
| int LLDBSwigLuaCloseFileHandle(lua_State *L); |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| %} |
| |
| %wrapper %{ |
| |
| // This function is called from Lua::CallBreakpointCallback |
| SWIGEXPORT llvm::Expected<bool> |
| LLDBSwigLuaBreakpointCallbackFunction |
| ( |
| lua_State *L, |
| lldb::StackFrameSP stop_frame_sp, |
| lldb::BreakpointLocationSP bp_loc_sp, |
| StructuredDataImpl *extra_args_impl |
| ) |
| { |
| lldb::SBFrame sb_frame(stop_frame_sp); |
| lldb::SBBreakpointLocation sb_bp_loc(bp_loc_sp); |
| int nargs = 2; |
| |
| llvm::Optional<lldb::SBStructuredData> extra_args; |
| if (extra_args_impl) |
| extra_args = lldb::SBStructuredData(extra_args_impl); |
| |
| // Push the Lua wrappers |
| PushSBClass(L, &sb_frame); |
| PushSBClass(L, &sb_bp_loc); |
| |
| if (extra_args.hasValue()) { |
| PushSBClass(L, extra_args.getPointer()); |
| nargs++; |
| } |
| |
| // Call into the Lua callback passing 'sb_frame' and 'sb_bp_loc'. |
| // Expects a boolean return. |
| if (lua_pcall(L, nargs, 1, 0) != LUA_OK) { |
| llvm::Error E = llvm::make_error<llvm::StringError>( |
| llvm::formatv("{0}\n", lua_tostring(L, -1)), |
| llvm::inconvertibleErrorCode()); |
| // Pop error message from the stack. |
| lua_pop(L, 1); |
| return std::move(E); |
| } |
| |
| // Boolean return from the callback |
| bool stop = lua_toboolean(L, -1); |
| lua_pop(L, 1); |
| |
| return stop; |
| } |
| |
| // This function is called from Lua::CallWatchpointCallback |
| SWIGEXPORT llvm::Expected<bool> |
| LLDBSwigLuaWatchpointCallbackFunction |
| ( |
| lua_State *L, |
| lldb::StackFrameSP stop_frame_sp, |
| lldb::WatchpointSP wp_sp |
| ) |
| { |
| lldb::SBFrame sb_frame(stop_frame_sp); |
| lldb::SBWatchpoint sb_wp(wp_sp); |
| int nargs = 2; |
| |
| // Push the Lua wrappers |
| PushSBClass(L, &sb_frame); |
| PushSBClass(L, &sb_wp); |
| |
| // Call into the Lua callback passing 'sb_frame' and 'sb_wp'. |
| // Expects a boolean return. |
| if (lua_pcall(L, nargs, 1, 0) != LUA_OK) { |
| llvm::Error E = llvm::make_error<llvm::StringError>( |
| llvm::formatv("{0}\n", lua_tostring(L, -1)), |
| llvm::inconvertibleErrorCode()); |
| // Pop error message from the stack. |
| lua_pop(L, 1); |
| return std::move(E); |
| } |
| |
| // Boolean return from the callback |
| bool stop = lua_toboolean(L, -1); |
| lua_pop(L, 1); |
| |
| return stop; |
| } |
| |
| SWIGEXPORT void |
| LLDBSwigLuaCallLuaLogOutputCallback(const char *str, void *baton) { |
| lua_State *L = (lua_State *)baton; |
| |
| lua_pushlightuserdata(L, (void *)&LLDBSwigLuaCallLuaLogOutputCallback); |
| lua_gettable(L, LUA_REGISTRYINDEX); |
| |
| // FIXME: There's no way to report errors back to the user |
| lua_pushstring(L, str); |
| lua_pcall(L, 1, 0, 0); |
| } |
| |
| int LLDBSwigLuaCloseFileHandle(lua_State *L) { |
| return luaL_error(L, "You cannot close a file handle used by lldb."); |
| } |
| |
| %} |