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