Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

beginNamespace promblem #266

Open
PyXiion opened this issue Oct 7, 2021 · 4 comments
Open

beginNamespace promblem #266

PyXiion opened this issue Oct 7, 2021 · 4 comments

Comments

@PyXiion
Copy link

PyXiion commented Oct 7, 2021

Hello! I have a problem. I have registered several SFML classes, but it gives an error when running.
This error:
/home/pyxiion/lua/bridge2.6/LuaBridge/detail/Namespace.h:1034: luabridge::Namespace::Namespace(const char*, luabridge::Namespace&): Assertion lua_istable (L, -1)' failed.

I have a script class that looks like this:

// Script.h
class Script {
public:
	lua_State *L;

	Script();
	Script(std::string);
	~Script();

	void LoadFile(std::string);
	void Unload();

	void Start();
	void Update();
	void Draw();

	void CallFunction(std::string);
};

I register classes first, call LoadFile, and then call Start

// Script.cpp
Script::Script() {
	L = luaL_newstate();
}
void Script::LoadFile(std::string script) {
	luaL_dofile(L, script.c_str());
	luaL_openlibs(L);
}
void Script::Start() {
	CallFunction("start");
}
void Script::Update() {
	CallFunction("update");
}
void Script::Draw() {
	CallFunction("draw");
}

void Script::CallFunction(std::string string) {
	LuaRef func = getGlobal(L, string.c_str());
	if (!func.isNil()) func();
}
// Proxies
void LuaDefines::transformableSetPositionProxy(sf::Transformable* t, sf::Vector2f xy) {
	t->setPosition(xy);
}
void LuaDefines::transformableSetScaleProxy(sf::Transformable* t, sf::Vector2f xy) {
	t->setScale(xy);
}
void LuaDefines::transformableSetOriginProxy(sf::Transformable* t, sf::Vector2f xy) {
	t->setOrigin(xy);
}
template<class T>
void LuaDefines::drawProxy(T* drawable) {
	window->draw(*drawable);
}

// Code for registering classes
void LuaDefines::RegisterGraphics(lua_State* L) {
	getGlobalNamespace(L)
		.beginNamespace("sf")
			.beginClass<sf::Vector2f>("vec2f")
				.addConstructor<void (*) ()>()
				.addConstructor<void (*) (float x, float y)>()
				.addProperty("x", &sf::Vector2f::x)
				.addProperty("y", &sf::Vector2f::y)

				.addFunction("__add", std::function<sf::Vector2f (sf::Vector2f*, sf::Vector2f*)>(
						[] (sf::Vector2f* v1, sf::Vector2f* v2) { return *v1 + *v2; }))

				.addFunction("__sub", std::function<sf::Vector2f (sf::Vector2f*, sf::Vector2f*)>(
						[] (sf::Vector2f* v1, sf::Vector2f* v2) { return *v1 - *v2; }))

				.addFunction("__div", std::function<sf::Vector2f (sf::Vector2f*, float)>(
						[] (sf::Vector2f* v, float f) { return *v / f; }))

				.addFunction("__mul", std::function<sf::Vector2f (sf::Vector2f*, float)>(
						[] (sf::Vector2f* v, float f) { return *v * f; }))

				.addFunction("__eq", std::function<bool (sf::Vector2f*, sf::Vector2f*)>(
						[] (sf::Vector2f* v1, sf::Vector2f* v2) { return *v1 == *v2; }))
			.endClass()

			.beginClass<sf::Vector2u>("vec2u")
				.addConstructor<void (*) ()>()
				.addConstructor<void (*) (int x, int y)>()
				.addProperty("x", &sf::Vector2u::x)
				.addProperty("y", &sf::Vector2u::y)

				.addFunction("__add", std::function<sf::Vector2u (sf::Vector2u*, sf::Vector2u*)>(
						[] (sf::Vector2u* v1, sf::Vector2u* v2) { return *v1 + *v2; }))

				.addFunction("__sub", std::function<sf::Vector2u (sf::Vector2u*, sf::Vector2u*)>(
						[] (sf::Vector2u* v1, sf::Vector2u* v2) { return *v1 - *v2; }))

				.addFunction("__eq", std::function<bool (sf::Vector2u*, sf::Vector2u*)>(
						[] (sf::Vector2u* v1, sf::Vector2u* v2) { return *v1 == *v2; }))
			.endClass()

			.beginClass<sf::Transformable>("transformable")
				.addFunction("setPosition", &transformableSetPositionProxy)
				.addFunction("setRotation", &sf::Transformable::setRotation)
				.addFunction("setScale", &transformableSetScaleProxy)
				.addFunction("setOrigin", &transformableSetOriginProxy)
			.endClass()

			.deriveClass<sf::Text, sf::Transformable>("text")
				.addConstructor<void (*) (void)>()
				.addFunction("setString", &sf::Text::setString)
				.addFunction("setFont", &sf::Text::setFont)
				.addFunction("setCharasterSize", &sf::Text::setCharacterSize)
				.addFunction("setLineSpacing", &sf::Text::setLineSpacing)
				.addFunction("setLetterSpacing", &sf::Text::setLetterSpacing)
				.addFunction("setStyle", &sf::Text::setStyle)
				.addFunction("setFillColor", &sf::Text::setFillColor)
				.addFunction("setOutlineColor", &sf::Text::setOutlineColor)
				.addFunction("setOutlineThickness", &sf::Text::setOutlineThickness)

				.addConstructor<void (*) (void)>()
				.addFunction("getString", &sf::Text::getString)
				.addFunction("getFont", &sf::Text::getFont)
				.addFunction("getCharasterSize", &sf::Text::getCharacterSize)
				.addFunction("getLineSpacing", &sf::Text::getLineSpacing)
				.addFunction("getLetterSpacing", &sf::Text::getLetterSpacing)
				.addFunction("getStyle", &sf::Text::getStyle)
				.addFunction("getFillColor", &sf::Text::getFillColor)
				.addFunction("getOutlineColor", &sf::Text::getOutlineColor)
				.addFunction("getOutlineThickness", &sf::Text::getOutlineThickness)

				.addFunction("draw", &drawProxy<sf::Text>)

			.endClass()
		.endNamespace()
	;
}

I do not know, maybe I should update LuaBridge.
Even when I register only the namespace, it throws this error.

void LuaDefines::RegisterGraphics(lua_State* L) {
	getGlobalNamespace(L)
		.beginNamespace("sf")

		.endNamespace()
	;
}
// /home/pyxiion/lua/bridge2.6/LuaBridge/detail/Namespace.h:1034: luabridge::Namespace::Namespace(const char*, luabridge::Namespace&): Assertion `lua_istable (L, -1)' failed.

I have debugged this code and I am sure that the error is happening right here.

Script script;
LuaDefines::RegisterGraphics(script.L);
script.LoadFile("data/scripts/debugInfo.lua"); // Error here
script.Start();
-- data/scripts/debugInfo.lua
text = sf.text()
text:setString("Test text")

draw = function ()
    text:draw()
end

I will try to update LuaBridge. (It didn't help)

@Nrosa01
Copy link

Nrosa01 commented Mar 29, 2022

I'm having the same problem, Did you solve it?

@PyXiion
Copy link
Author

PyXiion commented Mar 29, 2022 via email

@Nrosa01
Copy link

Nrosa01 commented Mar 29, 2022

Hi! I solved it, for some reason it works when I use in another class. It only gives the error in my Script class, I'm not sure why it happens but it seems to be that

@dmitry-t
Copy link
Collaborator

dmitry-t commented Aug 26, 2022

Next time please provide a minimal working example if you want to get a quick response.

In you case such example is:

extern "C" {
#include <lua5.2/lauxlib.h>
#include <lua5.2/lua.h>
#include <lua5.2/lualib.h>
}

#include <LuaBridge/LuaBridge.h>

#include <Windows.h>

int WinMain(HINSTANCE hInstance,
            HINSTANCE hPrevInstance,
            LPSTR lpCmdLine,
            int nCmdShow)
{
    lua_State* L = luaL_newstate();
    luabridge::getGlobalNamespace(L).beginNamespace("sf");
}

The beginNamespace() is failed because the _G value is nil.
For me it starts working once I initialize the Lua state with the luaL_openlibs():

    lua_State* L = luaL_newstate();
    luaL_openlibs(L);

BTW this can be useful for debugging:

#include <LuaBridge/detail/dump.h>
#include <sstream>
...
    lua_State* L = luaL_newstate();
    auto global = luabridge::getGlobalNamespace(L);
    std::ostringstream stream; // There's no console in the app
    luabridge::debug::dumpState(L, stream);
    // Now can see the stream contents in the debugger. The stack has a single nil value

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants