1*a0d7406aSPedro Tammela%header %{
2*a0d7406aSPedro Tammela
3*a0d7406aSPedro Tammelatemplate <typename T>
4*a0d7406aSPedro Tammelavoid
5*a0d7406aSPedro TammelaPushSBClass(lua_State* L, T* obj);
6*a0d7406aSPedro Tammela
7*a0d7406aSPedro Tammela%}
8*a0d7406aSPedro Tammela
9*a0d7406aSPedro Tammela%wrapper %{
10*a0d7406aSPedro Tammela
11*a0d7406aSPedro Tammela// This function is called from Lua::CallBreakpointCallback
12*a0d7406aSPedro TammelaSWIGEXPORT llvm::Expected<bool>
13*a0d7406aSPedro TammelaLLDBSwigLuaBreakpointCallbackFunction
14*a0d7406aSPedro Tammela(
15*a0d7406aSPedro Tammela   lua_State *L,
16*a0d7406aSPedro Tammela   lldb::StackFrameSP stop_frame_sp,
17*a0d7406aSPedro Tammela   lldb::BreakpointLocationSP bp_loc_sp
18*a0d7406aSPedro Tammela)
19*a0d7406aSPedro Tammela{
20*a0d7406aSPedro Tammela   lldb::SBFrame sb_frame(stop_frame_sp);
21*a0d7406aSPedro Tammela   lldb::SBBreakpointLocation sb_bp_loc(bp_loc_sp);
22*a0d7406aSPedro Tammela
23*a0d7406aSPedro Tammela   // Push the Lua wrappers
24*a0d7406aSPedro Tammela   PushSBClass(L, &sb_frame);
25*a0d7406aSPedro Tammela   PushSBClass(L, &sb_bp_loc);
26*a0d7406aSPedro Tammela
27*a0d7406aSPedro Tammela   // Call into the Lua callback passing 'sb_frame' and 'sb_bp_loc'.
28*a0d7406aSPedro Tammela   // Expects a boolean return.
29*a0d7406aSPedro Tammela   if (lua_pcall(L, 2, 1, 0) != LUA_OK) {
30*a0d7406aSPedro Tammela      llvm::Error E = llvm::make_error<llvm::StringError>(
31*a0d7406aSPedro Tammela            llvm::formatv("{0}\n", lua_tostring(L, -1)),
32*a0d7406aSPedro Tammela            llvm::inconvertibleErrorCode());
33*a0d7406aSPedro Tammela      // Pop error message from the stack.
34*a0d7406aSPedro Tammela      lua_pop(L, 1);
35*a0d7406aSPedro Tammela      return std::move(E);
36*a0d7406aSPedro Tammela   }
37*a0d7406aSPedro Tammela
38*a0d7406aSPedro Tammela   // Boolean return from the callback
39*a0d7406aSPedro Tammela   bool stop = lua_toboolean(L, -1);
40*a0d7406aSPedro Tammela   lua_pop(L, 1);
41*a0d7406aSPedro Tammela
42*a0d7406aSPedro Tammela   return stop;
43*a0d7406aSPedro Tammela}
44*a0d7406aSPedro Tammela
45*a0d7406aSPedro Tammela
46*a0d7406aSPedro Tammela%}
47