forked from daneos/lutango
add Lua 5.2 and 5.3 support
This commit is contained in:
parent
71673c8ede
commit
6cf75b0da6
@ -2,3 +2,5 @@
|
|||||||
|
|
||||||
luTango is a module providing access to [Tango Control System](https://www.tango-controls.org/) with Lua.
|
luTango is a module providing access to [Tango Control System](https://www.tango-controls.org/) with Lua.
|
||||||
In it's current state, a basic subset of client API is available (DeviceProxy, AttributeProxy), although not all Tango types are supported.
|
In it's current state, a basic subset of client API is available (DeviceProxy, AttributeProxy), although not all Tango types are supported.
|
||||||
|
|
||||||
|
The library has been tested with Lua 5.1, 5.2 and 5.3.
|
||||||
|
|||||||
@ -34,7 +34,7 @@ void set_log_level(LogLevel level)
|
|||||||
void lut_lua_register_log(lua_State* L)
|
void lut_lua_register_log(lua_State* L)
|
||||||
{
|
{
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
luaL_register(L, NULL, lut_log);
|
va_lua_register(L, lut_log);
|
||||||
lua_setfield(L, -2, "log");
|
lua_setfield(L, -2, "log");
|
||||||
LUT_LOG(INFO, "Registered log table");
|
LUT_LOG(INFO, "Registered log table");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,6 +18,7 @@
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
#include <core/lua.h>
|
#include <core/lua.h>
|
||||||
|
#include <core/lua/version_agnostic.h>
|
||||||
|
|
||||||
#define LUT_LOG(level, msg, ...) _log(level, msg, __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
|
#define LUT_LOG(level, msg, ...) _log(level, msg, __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
|
||||||
|
|
||||||
@ -42,7 +43,7 @@ void set_log_level(LogLevel level);
|
|||||||
void lut_lua_register_log(lua_State* L);
|
void lut_lua_register_log(lua_State* L);
|
||||||
int lut_log_set_log_level(lua_State* L);
|
int lut_log_set_log_level(lua_State* L);
|
||||||
|
|
||||||
static const luaL_reg lut_log[] =
|
static const luaL_Reg lut_log[] =
|
||||||
{
|
{
|
||||||
{ "set_log_level", lut_log_set_log_level },
|
{ "set_log_level", lut_log_set_log_level },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
|
|||||||
@ -38,7 +38,7 @@ std::vector<bool> pop_bool_table(lua_State* L, int idx)
|
|||||||
LUT_LOG(TRACE, "Popping boolean table from stack");
|
LUT_LOG(TRACE, "Popping boolean table from stack");
|
||||||
std::vector<bool> v;
|
std::vector<bool> v;
|
||||||
lua_settop(L, idx);
|
lua_settop(L, idx);
|
||||||
for(int i = 1; i <= lua_objlen(L, idx); i++)
|
for(int i = 1; i <= va_lua_objlen(L, idx); i++)
|
||||||
{
|
{
|
||||||
lua_rawgeti(L, idx, i);
|
lua_rawgeti(L, idx, i);
|
||||||
bool vi = lua_toboolean(L, idx+1);
|
bool vi = lua_toboolean(L, idx+1);
|
||||||
@ -53,7 +53,7 @@ std::vector<std::string> pop_string_table(lua_State* L, int idx)
|
|||||||
LUT_LOG(TRACE, "Popping string table from stack");
|
LUT_LOG(TRACE, "Popping string table from stack");
|
||||||
std::vector<std::string> v;
|
std::vector<std::string> v;
|
||||||
lua_settop(L, idx);
|
lua_settop(L, idx);
|
||||||
for(int i = 1; i <= lua_objlen(L, idx); i++)
|
for(int i = 1; i <= va_lua_objlen(L, idx); i++)
|
||||||
{
|
{
|
||||||
lua_rawgeti(L, idx, i);
|
lua_rawgeti(L, idx, i);
|
||||||
std::string vi = luaL_checkstring(L, idx+1);
|
std::string vi = luaL_checkstring(L, idx+1);
|
||||||
|
|||||||
@ -19,6 +19,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <core/lua.h>
|
#include <core/lua.h>
|
||||||
|
#include <core/lua/version_agnostic.h>
|
||||||
#include <core/logging/log.h>
|
#include <core/logging/log.h>
|
||||||
|
|
||||||
void push_bool_table(lua_State* L, std::vector<bool> value);
|
void push_bool_table(lua_State* L, std::vector<bool> value);
|
||||||
@ -52,7 +53,7 @@ std::vector<T> pop_number_table(lua_State* L, int idx)
|
|||||||
LUT_LOG(TRACE, "Popping number table from stack");
|
LUT_LOG(TRACE, "Popping number table from stack");
|
||||||
std::vector<T> v;
|
std::vector<T> v;
|
||||||
lua_settop(L, idx);
|
lua_settop(L, idx);
|
||||||
for(int i = 1; i <= lua_objlen(L, idx); i++)
|
for(int i = 1; i <= va_lua_objlen(L, idx); i++)
|
||||||
{
|
{
|
||||||
lua_rawgeti(L, idx, i);
|
lua_rawgeti(L, idx, i);
|
||||||
T vi = luaL_checknumber(L, idx+1);
|
T vi = luaL_checknumber(L, idx+1);
|
||||||
|
|||||||
25
src/core/lua/version_agnostic.cpp
Normal file
25
src/core/lua/version_agnostic.cpp
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// luTango - Lua binding for Tango
|
||||||
|
//
|
||||||
|
// Copyright (C) 2023 Grzegorz Kowalski
|
||||||
|
// See LICENSE for legal information
|
||||||
|
//
|
||||||
|
// file: version_agnostic.cpp
|
||||||
|
//
|
||||||
|
// Facilitate different versions of Lua
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#include "version_agnostic.h"
|
||||||
|
|
||||||
|
void va_lua_register(lua_State* L, const luaL_Reg* reg)
|
||||||
|
{
|
||||||
|
# if (LUA_VERSION_NUM > 501)
|
||||||
|
// Lua > 5.1
|
||||||
|
luaL_setfuncs(L, reg, 0);
|
||||||
|
# else
|
||||||
|
// Lua 5.1
|
||||||
|
luaL_register(L, NULL, reg);
|
||||||
|
# endif
|
||||||
|
}
|
||||||
29
src/core/lua/version_agnostic.h
Normal file
29
src/core/lua/version_agnostic.h
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// luTango - Lua binding for Tango
|
||||||
|
//
|
||||||
|
// Copyright (C) 2023 Grzegorz Kowalski
|
||||||
|
// See LICENSE for legal information
|
||||||
|
//
|
||||||
|
// file: version_agnostic.h
|
||||||
|
//
|
||||||
|
// Facilitate different versions of Lua
|
||||||
|
//
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#ifndef __VERSION_AGNOSTIC_H__
|
||||||
|
# define __VERSION_AGNOSTIC_H__
|
||||||
|
|
||||||
|
#include <core/lua.h>
|
||||||
|
|
||||||
|
#if (LUA_VERSION_NUM > 501)
|
||||||
|
// Lua > 5.1
|
||||||
|
# define va_lua_objlen lua_rawlen
|
||||||
|
#else
|
||||||
|
// Lua 5.1
|
||||||
|
# define va_lua_objlen lua_objlen
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void va_lua_register(lua_State* L, const luaL_Reg* reg);
|
||||||
|
|
||||||
|
#endif /* __VERSION_AGNOSTIC_H__ */
|
||||||
@ -16,7 +16,7 @@
|
|||||||
void lut_lua_register_sys(lua_State* L)
|
void lut_lua_register_sys(lua_State* L)
|
||||||
{
|
{
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
luaL_register(L, NULL, lut_sys);
|
va_lua_register(L, lut_sys);
|
||||||
lua_setfield(L, -2, "sys");
|
lua_setfield(L, -2, "sys");
|
||||||
LUT_LOG(INFO, "Registered sys table");
|
LUT_LOG(INFO, "Registered sys table");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,6 +17,7 @@
|
|||||||
#include <core/lua.h>
|
#include <core/lua.h>
|
||||||
#include <core/tango.h>
|
#include <core/tango.h>
|
||||||
#include <core/logging/log.h>
|
#include <core/logging/log.h>
|
||||||
|
#include <core/lua/version_agnostic.h>
|
||||||
|
|
||||||
// Lua API
|
// Lua API
|
||||||
void lut_lua_register_sys(lua_State* L);
|
void lut_lua_register_sys(lua_State* L);
|
||||||
@ -24,7 +25,7 @@ int lut_sys_version(lua_State* L);
|
|||||||
int lut_sys_tango_version(lua_State* L);
|
int lut_sys_tango_version(lua_State* L);
|
||||||
int lut_sys_cpp_version(lua_State* L);
|
int lut_sys_cpp_version(lua_State* L);
|
||||||
|
|
||||||
static const luaL_reg lut_sys[] =
|
static const luaL_Reg lut_sys[] =
|
||||||
{
|
{
|
||||||
{ "version", lut_sys_version },
|
{ "version", lut_sys_version },
|
||||||
{ "tango_version", lut_sys_tango_version },
|
{ "tango_version", lut_sys_tango_version },
|
||||||
|
|||||||
@ -76,7 +76,7 @@ void lut_lua_register_AttributeProxy(lua_State* L)
|
|||||||
{
|
{
|
||||||
// create table, register funcs and add it as AttributeProxy to lutango's table
|
// create table, register funcs and add it as AttributeProxy to lutango's table
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
luaL_register(L, NULL, lut_AttributeProxy);
|
va_lua_register(L, lut_AttributeProxy);
|
||||||
lua_setfield(L, -2, "AttributeProxy");
|
lua_setfield(L, -2, "AttributeProxy");
|
||||||
|
|
||||||
LUT_LOG(INFO, "Registered AttributeProxy table");
|
LUT_LOG(INFO, "Registered AttributeProxy table");
|
||||||
@ -101,7 +101,7 @@ int lut_AttributeProxy_create(lua_State* L)
|
|||||||
|
|
||||||
// set metatable, that allows userdata proper garbage collection
|
// set metatable, that allows userdata proper garbage collection
|
||||||
luaL_newmetatable(L, LUT_ATTRIBUTEPROXY);
|
luaL_newmetatable(L, LUT_ATTRIBUTEPROXY);
|
||||||
luaL_register(L, NULL, lut_AttributeProxy_userdata);
|
va_lua_register(L, lut_AttributeProxy_userdata);
|
||||||
lua_setmetatable(L, -2);
|
lua_setmetatable(L, -2);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
@ -22,6 +22,7 @@
|
|||||||
#include <core/utils.h>
|
#include <core/utils.h>
|
||||||
|
|
||||||
#include <core/lua/object.h>
|
#include <core/lua/object.h>
|
||||||
|
#include <core/lua/version_agnostic.h>
|
||||||
#include <core/logging/log.h>
|
#include <core/logging/log.h>
|
||||||
|
|
||||||
#include <core/tango/attrdata.h>
|
#include <core/tango/attrdata.h>
|
||||||
@ -53,7 +54,7 @@ int lut_AttributeProxy_create(lua_State* L);
|
|||||||
int lut_AttributeProxy_destroy(lua_State* L);
|
int lut_AttributeProxy_destroy(lua_State* L);
|
||||||
int lut_AttributeProxy_call(lua_State* L);
|
int lut_AttributeProxy_call(lua_State* L);
|
||||||
|
|
||||||
static const luaL_reg lut_AttributeProxy[] =
|
static const luaL_Reg lut_AttributeProxy[] =
|
||||||
{
|
{
|
||||||
// Lua API
|
// Lua API
|
||||||
{ "create", lut_AttributeProxy_create },
|
{ "create", lut_AttributeProxy_create },
|
||||||
@ -66,7 +67,7 @@ static const luaL_reg lut_AttributeProxy[] =
|
|||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
static const luaL_reg lut_AttributeProxy_userdata[] =
|
static const luaL_Reg lut_AttributeProxy_userdata[] =
|
||||||
{
|
{
|
||||||
{ "__gc", lut_AttributeProxy_destroy },
|
{ "__gc", lut_AttributeProxy_destroy },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
|
|||||||
@ -130,7 +130,7 @@ void lut_lua_register_DeviceProxy(lua_State* L)
|
|||||||
{
|
{
|
||||||
// create table, register funcs and add it as DeviceProxy to lutango's table
|
// create table, register funcs and add it as DeviceProxy to lutango's table
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
luaL_register(L, NULL, lut_DeviceProxy);
|
va_lua_register(L, lut_DeviceProxy);
|
||||||
lua_setfield(L, -2, "DeviceProxy");
|
lua_setfield(L, -2, "DeviceProxy");
|
||||||
|
|
||||||
LUT_LOG(INFO, "Registered DeviceProxy table");
|
LUT_LOG(INFO, "Registered DeviceProxy table");
|
||||||
@ -155,7 +155,7 @@ int lut_DeviceProxy_create(lua_State* L)
|
|||||||
|
|
||||||
// set metatable, that allows userdata proper garbage collection
|
// set metatable, that allows userdata proper garbage collection
|
||||||
luaL_newmetatable(L, LUT_DEVICEPROXY);
|
luaL_newmetatable(L, LUT_DEVICEPROXY);
|
||||||
luaL_register(L, NULL, lut_DeviceProxy_userdata);
|
va_lua_register(L, lut_DeviceProxy_userdata);
|
||||||
lua_setmetatable(L, -2);
|
lua_setmetatable(L, -2);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
@ -22,6 +22,7 @@
|
|||||||
#include <core/utils.h>
|
#include <core/utils.h>
|
||||||
|
|
||||||
#include <core/lua/object.h>
|
#include <core/lua/object.h>
|
||||||
|
#include <core/lua/version_agnostic.h>
|
||||||
#include <core/logging/log.h>
|
#include <core/logging/log.h>
|
||||||
|
|
||||||
#include <core/tango/attrdata.h>
|
#include <core/tango/attrdata.h>
|
||||||
@ -56,7 +57,7 @@ int lut_DeviceProxy_destroy(lua_State* L);
|
|||||||
int lut_DeviceProxy_index(lua_State* L);
|
int lut_DeviceProxy_index(lua_State* L);
|
||||||
int lut_DeviceProxy_newindex(lua_State* L);
|
int lut_DeviceProxy_newindex(lua_State* L);
|
||||||
|
|
||||||
static const luaL_reg lut_DeviceProxy[] =
|
static const luaL_Reg lut_DeviceProxy[] =
|
||||||
{
|
{
|
||||||
// Lua API
|
// Lua API
|
||||||
{ "create", lut_DeviceProxy_create },
|
{ "create", lut_DeviceProxy_create },
|
||||||
@ -71,7 +72,7 @@ static const luaL_reg lut_DeviceProxy[] =
|
|||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
static const luaL_reg lut_DeviceProxy_userdata[] =
|
static const luaL_Reg lut_DeviceProxy_userdata[] =
|
||||||
{
|
{
|
||||||
{ "__gc", lut_DeviceProxy_destroy },
|
{ "__gc", lut_DeviceProxy_destroy },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
|
|||||||
10
src/try.lua
10
src/try.lua
@ -11,6 +11,8 @@
|
|||||||
--
|
--
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
require "lutango.version_agnostic"
|
||||||
|
|
||||||
local function default_handler(e)
|
local function default_handler(e)
|
||||||
io.stderr:write("\n=================================== EXCEPTION ===================================\n")
|
io.stderr:write("\n=================================== EXCEPTION ===================================\n")
|
||||||
if e.is_DevFailed then
|
if e.is_DevFailed then
|
||||||
@ -28,11 +30,9 @@ local function default_handler(e)
|
|||||||
io.stderr:write("\n=================================================================================\n\n")
|
io.stderr:write("\n=================================================================================\n\n")
|
||||||
end
|
end
|
||||||
|
|
||||||
local function try(...)
|
local function try(f, ...)
|
||||||
local f = arg[1]
|
local f_arg = {...}
|
||||||
table.remove(arg, 1)
|
local ok, ret = xpcall(function() return f(va_unpack(f_arg)) end, default_handler)
|
||||||
|
|
||||||
local ok, ret = xpcall(function() return f(unpack(arg)) end, default_handler)
|
|
||||||
return ret
|
return ret
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
21
src/version_agnostic.lua
Normal file
21
src/version_agnostic.lua
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
-------------------------------------------------------------------------------
|
||||||
|
--
|
||||||
|
-- luTango - Lua binding for Tango
|
||||||
|
--
|
||||||
|
-- Copyright (C) 2023 Grzegorz Kowalski
|
||||||
|
-- See LICENSE for legal information
|
||||||
|
--
|
||||||
|
-- file: version_agnostic.lua
|
||||||
|
--
|
||||||
|
-- Facilitate different versions of Lua
|
||||||
|
-- WARNING! This module sets globals!
|
||||||
|
--
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
local version = tonumber(_VERSION:match("%d.%d"))
|
||||||
|
|
||||||
|
if version > 5.1 then
|
||||||
|
va_unpack = table.unpack
|
||||||
|
else
|
||||||
|
va_unpack = unpack
|
||||||
|
end
|
||||||
Loading…
x
Reference in New Issue
Block a user