9d5e37ed8c
I've found my recent ventures into the swig land painful because of the strange way they are formatted. This patch attempts to alleviate future headaches by formatting these files into something resembling the normal llvm style. Unfortunately, completely formatting these files automatically does not work because clang format gets confused by swigs % syntax, so I have employed a hybrid approach where I formatted blocks of c++ code with clang-format and then manually massaged the code until it looked reasonable (and compiled). I don't expect these files to remain perfectly formatted (although, if one's editor is configured to configure the current line/block on request, one can get pretty good results by using it judiciously), but at least it will prevent the (mangled form of the) old lldb style being proliferated endlessly. Differential Revision: https://reviews.llvm.org/D115736
88 lines
2.5 KiB
Plaintext
88 lines
2.5 KiB
Plaintext
%header %{
|
|
|
|
template <typename T> void PushSBClass(lua_State * L, T * obj);
|
|
|
|
// This function is called from Lua::CallBreakpointCallback
|
|
llvm::Expected<bool> lldb_private::LLDBSwigLuaBreakpointCallbackFunction(
|
|
lua_State * L, lldb::StackFrameSP stop_frame_sp,
|
|
lldb::BreakpointLocationSP bp_loc_sp,
|
|
const StructuredDataImpl &extra_args_impl) {
|
|
lldb::SBFrame sb_frame(stop_frame_sp);
|
|
lldb::SBBreakpointLocation sb_bp_loc(bp_loc_sp);
|
|
int nargs = 2;
|
|
|
|
lldb::SBStructuredData extra_args(extra_args_impl);
|
|
|
|
// Push the Lua wrappers
|
|
PushSBClass(L, &sb_frame);
|
|
PushSBClass(L, &sb_bp_loc);
|
|
|
|
if (extra_args.IsValid()) {
|
|
PushSBClass(L, &extra_args);
|
|
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
|
|
llvm::Expected<bool> lldb_private::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;
|
|
}
|
|
|
|
static 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);
|
|
}
|
|
|
|
static int LLDBSwigLuaCloseFileHandle(lua_State * L) {
|
|
return luaL_error(L, "You cannot close a file handle used by lldb.");
|
|
}
|
|
|
|
%}
|