1480093f4SDimitry Andric //===-- Lua.cpp -----------------------------------------------------------===// 2480093f4SDimitry Andric // 3480093f4SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4480093f4SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5480093f4SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6480093f4SDimitry Andric // 7480093f4SDimitry Andric //===----------------------------------------------------------------------===// 8480093f4SDimitry Andric 9480093f4SDimitry Andric #include "Lua.h" 10480093f4SDimitry Andric #include "lldb/Host/FileSystem.h" 11480093f4SDimitry Andric #include "lldb/Utility/FileSpec.h" 12480093f4SDimitry Andric #include "llvm/Support/FormatVariadic.h" 13480093f4SDimitry Andric 14480093f4SDimitry Andric using namespace lldb_private; 15480093f4SDimitry Andric using namespace lldb; 16480093f4SDimitry Andric 17480093f4SDimitry Andric llvm::Error Lua::Run(llvm::StringRef buffer) { 18480093f4SDimitry Andric int error = 19480093f4SDimitry Andric luaL_loadbuffer(m_lua_state, buffer.data(), buffer.size(), "buffer") || 20480093f4SDimitry Andric lua_pcall(m_lua_state, 0, 0, 0); 21480093f4SDimitry Andric if (!error) 22480093f4SDimitry Andric return llvm::Error::success(); 23480093f4SDimitry Andric 24480093f4SDimitry Andric llvm::Error e = llvm::make_error<llvm::StringError>( 25480093f4SDimitry Andric llvm::formatv("{0}\n", lua_tostring(m_lua_state, -1)), 26480093f4SDimitry Andric llvm::inconvertibleErrorCode()); 27480093f4SDimitry Andric // Pop error message from the stack. 28480093f4SDimitry Andric lua_pop(m_lua_state, 1); 29480093f4SDimitry Andric return e; 30480093f4SDimitry Andric } 31480093f4SDimitry Andric 32480093f4SDimitry Andric llvm::Error Lua::LoadModule(llvm::StringRef filename) { 33480093f4SDimitry Andric FileSpec file(filename); 34480093f4SDimitry Andric if (!FileSystem::Instance().Exists(file)) { 35480093f4SDimitry Andric return llvm::make_error<llvm::StringError>("invalid path", 36480093f4SDimitry Andric llvm::inconvertibleErrorCode()); 37480093f4SDimitry Andric } 38480093f4SDimitry Andric 39480093f4SDimitry Andric ConstString module_extension = file.GetFileNameExtension(); 40480093f4SDimitry Andric if (module_extension != ".lua") { 41480093f4SDimitry Andric return llvm::make_error<llvm::StringError>("invalid extension", 42480093f4SDimitry Andric llvm::inconvertibleErrorCode()); 43480093f4SDimitry Andric } 44480093f4SDimitry Andric 45480093f4SDimitry Andric int error = luaL_loadfile(m_lua_state, filename.data()) || 46480093f4SDimitry Andric lua_pcall(m_lua_state, 0, 1, 0); 47480093f4SDimitry Andric if (error) { 48480093f4SDimitry Andric llvm::Error e = llvm::make_error<llvm::StringError>( 49480093f4SDimitry Andric llvm::formatv("{0}\n", lua_tostring(m_lua_state, -1)), 50480093f4SDimitry Andric llvm::inconvertibleErrorCode()); 51480093f4SDimitry Andric // Pop error message from the stack. 52480093f4SDimitry Andric lua_pop(m_lua_state, 1); 53480093f4SDimitry Andric return e; 54480093f4SDimitry Andric } 55480093f4SDimitry Andric 56480093f4SDimitry Andric ConstString module_name = file.GetFileNameStrippingExtension(); 57480093f4SDimitry Andric lua_setglobal(m_lua_state, module_name.GetCString()); 58480093f4SDimitry Andric return llvm::Error::success(); 59480093f4SDimitry Andric } 605ffd83dbSDimitry Andric 615ffd83dbSDimitry Andric llvm::Error Lua::ChangeIO(FILE *out, FILE *err) { 625ffd83dbSDimitry Andric assert(out != nullptr); 635ffd83dbSDimitry Andric assert(err != nullptr); 645ffd83dbSDimitry Andric 655ffd83dbSDimitry Andric lua_getglobal(m_lua_state, "io"); 665ffd83dbSDimitry Andric 675ffd83dbSDimitry Andric lua_getfield(m_lua_state, -1, "stdout"); 685ffd83dbSDimitry Andric if (luaL_Stream *s = static_cast<luaL_Stream *>( 695ffd83dbSDimitry Andric luaL_testudata(m_lua_state, -1, LUA_FILEHANDLE))) { 705ffd83dbSDimitry Andric s->f = out; 715ffd83dbSDimitry Andric lua_pop(m_lua_state, 1); 725ffd83dbSDimitry Andric } else { 735ffd83dbSDimitry Andric lua_pop(m_lua_state, 2); 745ffd83dbSDimitry Andric return llvm::make_error<llvm::StringError>("could not get stdout", 755ffd83dbSDimitry Andric llvm::inconvertibleErrorCode()); 765ffd83dbSDimitry Andric } 775ffd83dbSDimitry Andric 785ffd83dbSDimitry Andric lua_getfield(m_lua_state, -1, "stderr"); 795ffd83dbSDimitry Andric if (luaL_Stream *s = static_cast<luaL_Stream *>( 805ffd83dbSDimitry Andric luaL_testudata(m_lua_state, -1, LUA_FILEHANDLE))) { 815ffd83dbSDimitry Andric s->f = out; 825ffd83dbSDimitry Andric lua_pop(m_lua_state, 1); 835ffd83dbSDimitry Andric } else { 845ffd83dbSDimitry Andric lua_pop(m_lua_state, 2); 855ffd83dbSDimitry Andric return llvm::make_error<llvm::StringError>("could not get stderr", 865ffd83dbSDimitry Andric llvm::inconvertibleErrorCode()); 875ffd83dbSDimitry Andric } 885ffd83dbSDimitry Andric 895ffd83dbSDimitry Andric lua_pop(m_lua_state, 1); 905ffd83dbSDimitry Andric return llvm::Error::success(); 915ffd83dbSDimitry Andric } 92