1*480093f4SDimitry Andric //===-- Lua.cpp -----------------------------------------------------------===// 2*480093f4SDimitry Andric // 3*480093f4SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*480093f4SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*480093f4SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*480093f4SDimitry Andric // 7*480093f4SDimitry Andric //===----------------------------------------------------------------------===// 8*480093f4SDimitry Andric 9*480093f4SDimitry Andric #include "Lua.h" 10*480093f4SDimitry Andric #include "lldb/Host/FileSystem.h" 11*480093f4SDimitry Andric #include "lldb/Utility/FileSpec.h" 12*480093f4SDimitry Andric #include "llvm/Support/FormatVariadic.h" 13*480093f4SDimitry Andric 14*480093f4SDimitry Andric using namespace lldb_private; 15*480093f4SDimitry Andric using namespace lldb; 16*480093f4SDimitry Andric 17*480093f4SDimitry Andric llvm::Error Lua::Run(llvm::StringRef buffer) { 18*480093f4SDimitry Andric int error = 19*480093f4SDimitry Andric luaL_loadbuffer(m_lua_state, buffer.data(), buffer.size(), "buffer") || 20*480093f4SDimitry Andric lua_pcall(m_lua_state, 0, 0, 0); 21*480093f4SDimitry Andric if (!error) 22*480093f4SDimitry Andric return llvm::Error::success(); 23*480093f4SDimitry Andric 24*480093f4SDimitry Andric llvm::Error e = llvm::make_error<llvm::StringError>( 25*480093f4SDimitry Andric llvm::formatv("{0}\n", lua_tostring(m_lua_state, -1)), 26*480093f4SDimitry Andric llvm::inconvertibleErrorCode()); 27*480093f4SDimitry Andric // Pop error message from the stack. 28*480093f4SDimitry Andric lua_pop(m_lua_state, 1); 29*480093f4SDimitry Andric return e; 30*480093f4SDimitry Andric } 31*480093f4SDimitry Andric 32*480093f4SDimitry Andric llvm::Error Lua::LoadModule(llvm::StringRef filename) { 33*480093f4SDimitry Andric FileSpec file(filename); 34*480093f4SDimitry Andric if (!FileSystem::Instance().Exists(file)) { 35*480093f4SDimitry Andric return llvm::make_error<llvm::StringError>("invalid path", 36*480093f4SDimitry Andric llvm::inconvertibleErrorCode()); 37*480093f4SDimitry Andric } 38*480093f4SDimitry Andric 39*480093f4SDimitry Andric ConstString module_extension = file.GetFileNameExtension(); 40*480093f4SDimitry Andric if (module_extension != ".lua") { 41*480093f4SDimitry Andric return llvm::make_error<llvm::StringError>("invalid extension", 42*480093f4SDimitry Andric llvm::inconvertibleErrorCode()); 43*480093f4SDimitry Andric } 44*480093f4SDimitry Andric 45*480093f4SDimitry Andric int error = luaL_loadfile(m_lua_state, filename.data()) || 46*480093f4SDimitry Andric lua_pcall(m_lua_state, 0, 1, 0); 47*480093f4SDimitry Andric if (error) { 48*480093f4SDimitry Andric llvm::Error e = llvm::make_error<llvm::StringError>( 49*480093f4SDimitry Andric llvm::formatv("{0}\n", lua_tostring(m_lua_state, -1)), 50*480093f4SDimitry Andric llvm::inconvertibleErrorCode()); 51*480093f4SDimitry Andric // Pop error message from the stack. 52*480093f4SDimitry Andric lua_pop(m_lua_state, 1); 53*480093f4SDimitry Andric return e; 54*480093f4SDimitry Andric } 55*480093f4SDimitry Andric 56*480093f4SDimitry Andric ConstString module_name = file.GetFileNameStrippingExtension(); 57*480093f4SDimitry Andric lua_setglobal(m_lua_state, module_name.GetCString()); 58*480093f4SDimitry Andric return llvm::Error::success(); 59*480093f4SDimitry Andric } 60