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,
17532e4203SPedro Tammela   lldb::BreakpointLocationSP bp_loc_sp,
18532e4203SPedro 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);
23532e4203SPedro Tammela   int nargs = 2;
24532e4203SPedro Tammela
25532e4203SPedro Tammela   llvm::Optional<lldb::SBStructuredData> extra_args;
26532e4203SPedro Tammela   if (extra_args_impl)
27532e4203SPedro 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
33532e4203SPedro Tammela   if (extra_args.hasValue()) {
34532e4203SPedro Tammela      PushSBClass(L, extra_args.getPointer());
35532e4203SPedro Tammela      nargs++;
36532e4203SPedro Tammela   }
37532e4203SPedro Tammela
38a0d7406aSPedro Tammela   // Call into the Lua callback passing 'sb_frame' and 'sb_bp_loc'.
39a0d7406aSPedro Tammela   // Expects a boolean return.
40532e4203SPedro 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
56*e81ba283SSiger Yang// This function is called from Lua::CallWatchpointCallback
57*e81ba283SSiger YangSWIGEXPORT llvm::Expected<bool>
58*e81ba283SSiger YangLLDBSwigLuaWatchpointCallbackFunction
59*e81ba283SSiger Yang(
60*e81ba283SSiger Yang   lua_State *L,
61*e81ba283SSiger Yang   lldb::StackFrameSP stop_frame_sp,
62*e81ba283SSiger Yang   lldb::WatchpointSP wp_sp
63*e81ba283SSiger Yang)
64*e81ba283SSiger Yang{
65*e81ba283SSiger Yang   lldb::SBFrame sb_frame(stop_frame_sp);
66*e81ba283SSiger Yang   lldb::SBWatchpoint sb_wp(wp_sp);
67*e81ba283SSiger Yang   int nargs = 2;
68*e81ba283SSiger Yang
69*e81ba283SSiger Yang   // Push the Lua wrappers
70*e81ba283SSiger Yang   PushSBClass(L, &sb_frame);
71*e81ba283SSiger Yang   PushSBClass(L, &sb_wp);
72*e81ba283SSiger Yang
73*e81ba283SSiger Yang   // Call into the Lua callback passing 'sb_frame' and 'sb_wp'.
74*e81ba283SSiger Yang   // Expects a boolean return.
75*e81ba283SSiger Yang   if (lua_pcall(L, nargs, 1, 0) != LUA_OK) {
76*e81ba283SSiger Yang      llvm::Error E = llvm::make_error<llvm::StringError>(
77*e81ba283SSiger Yang            llvm::formatv("{0}\n", lua_tostring(L, -1)),
78*e81ba283SSiger Yang            llvm::inconvertibleErrorCode());
79*e81ba283SSiger Yang      // Pop error message from the stack.
80*e81ba283SSiger Yang      lua_pop(L, 1);
81*e81ba283SSiger Yang      return std::move(E);
82*e81ba283SSiger Yang   }
83*e81ba283SSiger Yang
84*e81ba283SSiger Yang   // Boolean return from the callback
85*e81ba283SSiger Yang   bool stop = lua_toboolean(L, -1);
86*e81ba283SSiger Yang   lua_pop(L, 1);
87*e81ba283SSiger Yang
88*e81ba283SSiger Yang   return stop;
89*e81ba283SSiger Yang}
90*e81ba283SSiger Yang
91a0d7406aSPedro Tammela
92a0d7406aSPedro Tammela%}
93