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