128613242SJonas Devlieghere //===-- Lua.cpp -----------------------------------------------------------===// 228613242SJonas Devlieghere // 328613242SJonas Devlieghere // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 428613242SJonas Devlieghere // See https://llvm.org/LICENSE.txt for license information. 528613242SJonas Devlieghere // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 628613242SJonas Devlieghere // 728613242SJonas Devlieghere //===----------------------------------------------------------------------===// 828613242SJonas Devlieghere 928613242SJonas Devlieghere #include "Lua.h" 10*572b9f46SJonas Devlieghere #include "lldb/Host/FileSystem.h" 11*572b9f46SJonas Devlieghere #include "lldb/Utility/FileSpec.h" 1228613242SJonas Devlieghere #include "llvm/Support/FormatVariadic.h" 1328613242SJonas Devlieghere 1428613242SJonas Devlieghere using namespace lldb_private; 1545c971f7SJonas Devlieghere using namespace lldb; 1628613242SJonas Devlieghere 1728613242SJonas Devlieghere llvm::Error Lua::Run(llvm::StringRef buffer) { 1828613242SJonas Devlieghere int error = 1928613242SJonas Devlieghere luaL_loadbuffer(m_lua_state, buffer.data(), buffer.size(), "buffer") || 2028613242SJonas Devlieghere lua_pcall(m_lua_state, 0, 0, 0); 2128613242SJonas Devlieghere if (!error) 2228613242SJonas Devlieghere return llvm::Error::success(); 2328613242SJonas Devlieghere 2428613242SJonas Devlieghere llvm::Error e = llvm::make_error<llvm::StringError>( 2528613242SJonas Devlieghere llvm::formatv("{0}\n", lua_tostring(m_lua_state, -1)), 2628613242SJonas Devlieghere llvm::inconvertibleErrorCode()); 2728613242SJonas Devlieghere // Pop error message from the stack. 2828613242SJonas Devlieghere lua_pop(m_lua_state, 1); 2928613242SJonas Devlieghere return e; 3028613242SJonas Devlieghere } 31*572b9f46SJonas Devlieghere 32*572b9f46SJonas Devlieghere llvm::Error Lua::LoadModule(llvm::StringRef filename) { 33*572b9f46SJonas Devlieghere FileSpec file(filename); 34*572b9f46SJonas Devlieghere if (!FileSystem::Instance().Exists(file)) { 35*572b9f46SJonas Devlieghere return llvm::make_error<llvm::StringError>("invalid path", 36*572b9f46SJonas Devlieghere llvm::inconvertibleErrorCode()); 37*572b9f46SJonas Devlieghere } 38*572b9f46SJonas Devlieghere 39*572b9f46SJonas Devlieghere ConstString module_extension = file.GetFileNameExtension(); 40*572b9f46SJonas Devlieghere if (module_extension != ".lua") { 41*572b9f46SJonas Devlieghere return llvm::make_error<llvm::StringError>("invalid extension", 42*572b9f46SJonas Devlieghere llvm::inconvertibleErrorCode()); 43*572b9f46SJonas Devlieghere } 44*572b9f46SJonas Devlieghere 45*572b9f46SJonas Devlieghere int error = luaL_loadfile(m_lua_state, filename.data()) || 46*572b9f46SJonas Devlieghere lua_pcall(m_lua_state, 0, 1, 0); 47*572b9f46SJonas Devlieghere if (error) { 48*572b9f46SJonas Devlieghere llvm::Error e = llvm::make_error<llvm::StringError>( 49*572b9f46SJonas Devlieghere llvm::formatv("{0}\n", lua_tostring(m_lua_state, -1)), 50*572b9f46SJonas Devlieghere llvm::inconvertibleErrorCode()); 51*572b9f46SJonas Devlieghere // Pop error message from the stack. 52*572b9f46SJonas Devlieghere lua_pop(m_lua_state, 1); 53*572b9f46SJonas Devlieghere return e; 54*572b9f46SJonas Devlieghere } 55*572b9f46SJonas Devlieghere 56*572b9f46SJonas Devlieghere ConstString module_name = file.GetFileNameStrippingExtension(); 57*572b9f46SJonas Devlieghere lua_setglobal(m_lua_state, module_name.GetCString()); 58*572b9f46SJonas Devlieghere return llvm::Error::success(); 59*572b9f46SJonas Devlieghere } 60