mirror of
https://gitlab.com/Syping/luaengineapp.git
synced 2025-09-10 18:56:29 +02:00
EngineType handling improved and JSON array support
This commit is contained in:
parent
406905b359
commit
1fd16e168c
11 changed files with 102 additions and 56 deletions
|
@ -1,6 +1,6 @@
|
|||
/*****************************************************************************
|
||||
* luaEngine Lua Engine for Qt
|
||||
* Copyright (C) 2018-2019 Syping
|
||||
* Copyright (C) 2018-2021 Syping
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -21,8 +21,12 @@
|
|||
#include <QCoreApplication>
|
||||
#include <QTextStream>
|
||||
#include <QMetaMethod>
|
||||
|
||||
LuaEngine::LuaEngine(QObject *parent, bool loadBaseLibraries) : QObject(parent)
|
||||
{
|
||||
LuaEngine(LuaEngineType::UnknownEngineType, parent, loadBaseLibraries);
|
||||
}
|
||||
|
||||
LuaEngine::LuaEngine(LuaEngineType engineType, QObject *parent, bool loadBaseLibraries) : QObject(parent), p_engineType(engineType)
|
||||
{
|
||||
L = luaL_newstate();
|
||||
if (loadBaseLibraries)
|
||||
|
@ -53,6 +57,11 @@ lua_State* LuaEngine::luaState()
|
|||
return L;
|
||||
}
|
||||
|
||||
LuaEngine::LuaEngineType LuaEngine::engineType()
|
||||
{
|
||||
return p_engineType;
|
||||
}
|
||||
|
||||
void LuaEngine::loadBaseLibraries()
|
||||
{
|
||||
luaL_openlibs(L);
|
||||
|
@ -148,7 +157,7 @@ bool LuaEngine::loadLuaScript(QIODevice *device, bool closeDevice)
|
|||
bool LuaEngine::executeLuaScript(const QByteArray &data)
|
||||
{
|
||||
if (loadLuaScript(data))
|
||||
return (lua_pcall(L, 0, LUA_MULTRET, 0) == 0) ? true : false;
|
||||
return (lua_pcall(L, 0, LUA_MULTRET, 0) == 0);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -181,7 +190,7 @@ bool LuaEngine::executeLuaFunction(lua_State *L_p, const char *name, bool requir
|
|||
{
|
||||
int returnCount = (requireReturn) ? LUA_MULTRET : 0;
|
||||
lua_getglobal(L_p, name);
|
||||
return (lua_pcall(L_p, 0, returnCount, 0) == 0) ? true : false;
|
||||
return (lua_pcall(L_p, 0, returnCount, 0) == 0);
|
||||
}
|
||||
|
||||
bool LuaEngine::executeLuaFunction(const char *name, const QVariant &argument, bool requireReturn)
|
||||
|
@ -194,7 +203,7 @@ bool LuaEngine::executeLuaFunction(lua_State *L_p, const char *name, const QVari
|
|||
int returnCount = (requireReturn) ? LUA_MULTRET : 0;
|
||||
lua_getglobal(L_p, name);
|
||||
pushVariant(L_p, argument);
|
||||
return (lua_pcall(L_p, 1, returnCount, 0) == 0) ? true : false;
|
||||
return (lua_pcall(L_p, 1, returnCount, 0) == 0);
|
||||
}
|
||||
|
||||
bool LuaEngine::executeLuaFunction(const char *name, const QVariantList &args, bool requireReturn)
|
||||
|
@ -209,7 +218,7 @@ bool LuaEngine::executeLuaFunction(lua_State *L_p, const char *name, const QVari
|
|||
for (const QVariant &argument : args) {
|
||||
pushVariant(L_p, argument);
|
||||
}
|
||||
return (lua_pcall(L_p, args.count(), returnCount, 0) == 0) ? true : false;
|
||||
return (lua_pcall(L_p, args.count(), returnCount, 0) == 0);
|
||||
}
|
||||
|
||||
void LuaEngine::pushFunction(const char *name, lua_CFunction function)
|
||||
|
@ -278,7 +287,7 @@ void LuaEngine::pushVariant(lua_State *L_p, const QVariant &variant)
|
|||
QStringList stringList = variant.toStringList();
|
||||
lua_createtable(L_p, 0, stringList.count());
|
||||
int currentId = 1;
|
||||
for (const QString &string : stringList) {
|
||||
for (const QString &string : qAsConst(stringList)) {
|
||||
lua_pushinteger(L_p, currentId);
|
||||
lua_pushstring(L_p, string.toUtf8().data());
|
||||
lua_settable(L_p, -3);
|
||||
|
@ -289,7 +298,7 @@ void LuaEngine::pushVariant(lua_State *L_p, const QVariant &variant)
|
|||
QVariantList variantList = variant.toList();
|
||||
lua_createtable(L_p, 0, variantList.count());
|
||||
int currentId = 1;
|
||||
for (const QVariant &variant : variantList) {
|
||||
for (const QVariant &variant : qAsConst(variantList)) {
|
||||
lua_pushinteger(L_p, currentId);
|
||||
pushVariant(L_p, variant);
|
||||
lua_settable(L_p, -3);
|
||||
|
@ -299,13 +308,10 @@ void LuaEngine::pushVariant(lua_State *L_p, const QVariant &variant)
|
|||
else if ((QMetaType::Type)variant.type() == QMetaType::QVariantMap) {
|
||||
QVariantMap variantMap = variant.toMap();
|
||||
lua_createtable(L_p, 0, variantMap.count());
|
||||
QVariantMap::const_iterator it = variantMap.constBegin();
|
||||
QVariantMap::const_iterator end = variantMap.constEnd();
|
||||
while (it != end) {
|
||||
for (auto it = variantMap.constBegin(); it != variantMap.constEnd(); it++) {
|
||||
lua_pushstring(L_p, it.key().toUtf8().data());
|
||||
pushVariant(L_p, it.value());
|
||||
lua_settable(L_p, -3);
|
||||
it++;
|
||||
}
|
||||
}
|
||||
else if ((QMetaType::Type)variant.type() == QMetaType::Void || (QMetaType::Type)variant.type() == QMetaType::VoidStar) {
|
||||
|
@ -367,7 +373,7 @@ QVariant LuaEngine::getVariant(lua_State *L_p, int index)
|
|||
else if (lua_isnoneornil(L_p, index)) {
|
||||
return QVariant();
|
||||
}
|
||||
QTextStream(stderr) << "Warning: Didn't catch lua_isnoneornil before empty QVariant got returned" << endl;
|
||||
QTextStream(stderr) << "Warning: Didn't catch lua_isnoneornil before empty QVariant got returned" << Qt::endl;
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
|
@ -433,8 +439,7 @@ int LuaEngine::luaObjectDelete_p(lua_State *L_p)
|
|||
if (getArgumentCount(L_p) >= 1) {
|
||||
void *pointer = getPointer(L_p, 1);
|
||||
if (pointer != NULL) {
|
||||
switch (getVariant(L_p, 2).toInt())
|
||||
{
|
||||
switch (getVariant(L_p, 2).toInt()) {
|
||||
case 1:
|
||||
((QObject*)pointer)->deleteLater();
|
||||
break;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*****************************************************************************
|
||||
* luaEngine Lua Engine for Qt
|
||||
* Copyright (C) 2018-2019 Syping
|
||||
* Copyright (C) 2018-2021 Syping
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -33,9 +33,12 @@ class LUAENGINESHARED_EXPORT LuaEngine : public QObject
|
|||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
enum LuaEngineType : qint8 { RuntimeEngineType = 0, PortableEngineType = 1, UnknownEngineType = -1 };
|
||||
LuaEngine(QObject *parent = nullptr, bool loadBaseLibraries = true);
|
||||
LuaEngine(LuaEngineType engineType, QObject *parent = nullptr, bool loadBaseLibraries = true);
|
||||
~LuaEngine();
|
||||
lua_State* luaState();
|
||||
LuaEngineType engineType();
|
||||
void loadBaseLibraries();
|
||||
QByteArray dumpLuaScript();
|
||||
bool loadLuaScript(const QByteArray &data);
|
||||
|
@ -75,6 +78,7 @@ public:
|
|||
|
||||
private:
|
||||
lua_State *L;
|
||||
LuaEngineType p_engineType;
|
||||
static int luaEngineWriter_p(lua_State *L_p, const void *buffer, size_t size, void *array);
|
||||
static int luaEngineQuit_p(lua_State *L_p);
|
||||
static int luaEngineVersion_p(lua_State *L_p);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue