From 6d20b0ff03b3ad1948959e6df21e4139921b4255 Mon Sep 17 00:00:00 2001 From: mihacooper Date: Fri, 14 Apr 2017 16:38:16 +0300 Subject: [PATCH] Add global G and test (#41) Global effil.G for all states --- src/cpp/lua-module.cpp | 5 ++++- src/lua/effil.lua | 1 + tests/cpp/garbage-collector.cpp | 28 ++++++++++++++-------------- tests/lua/shared_table.lua | 18 ++++++++++++++++++ 4 files changed, 37 insertions(+), 15 deletions(-) diff --git a/src/cpp/lua-module.cpp b/src/cpp/lua-module.cpp index 5a1d544..e9aa3e0 100644 --- a/src/cpp/lua-module.cpp +++ b/src/cpp/lua-module.cpp @@ -20,6 +20,8 @@ sol::object createThread(const sol::this_state& lua, sol::object createTable(sol::this_state lua) { return sol::make_object(lua, getGC().create()); } +SharedTable globalTable = getGC().create(); + } // namespace extern "C" int luaopen_libeffil(lua_State* L) { @@ -36,7 +38,8 @@ extern "C" int luaopen_libeffil(lua_State* L) { "rawget", SharedTable::luaRawGet, "size", SharedTable::luaSize, "setmetatable", SharedTable::luaSetMetatable, - "getmetatable", SharedTable::luaGetMetatable + "getmetatable", SharedTable::luaGetMetatable, + "G", sol::make_object(lua, globalTable) ); sol::stack::push(lua, publicApi); return 1; diff --git a/src/lua/effil.lua b/src/lua/effil.lua index b4dfe13..9326736 100644 --- a/src/lua/effil.lua +++ b/src/lua/effil.lua @@ -22,6 +22,7 @@ local api = { rawset = capi.rawset, setmetatable = capi.setmetatable, getmetatable = capi.getmetatable, + G = capi.G, } local function run_thread(config, f, ...) diff --git a/tests/cpp/garbage-collector.cpp b/tests/cpp/garbage-collector.cpp index f81ca04..4c897f6 100644 --- a/tests/cpp/garbage-collector.cpp +++ b/tests/cpp/garbage-collector.cpp @@ -26,7 +26,7 @@ TEST(gc, GCObject) { TEST(gc, collect) { getGC().cleanup(); - ASSERT_EQ(getGC().size(), (size_t)0); + ASSERT_EQ(getGC().size(), (size_t)1); { GCObject o1 = getGC().create(); @@ -34,9 +34,9 @@ TEST(gc, collect) { GCObject o2 = getGC().create(); ; } - EXPECT_EQ(getGC().size(), (size_t)2); + EXPECT_EQ(getGC().size(), (size_t)3); getGC().cleanup(); - EXPECT_EQ(getGC().size(), (size_t)0); + EXPECT_EQ(getGC().size(), (size_t)1); } namespace { @@ -58,12 +58,12 @@ TEST(gc, withRefs) { root.add(child.handle()); } } - EXPECT_EQ(getGC().size(), (size_t)5); + EXPECT_EQ(getGC().size(), (size_t)6); getGC().cleanup(); - EXPECT_EQ(getGC().size(), (size_t)4); + EXPECT_EQ(getGC().size(), (size_t)5); } getGC().cleanup(); - EXPECT_EQ(getGC().size(), (size_t)0); + EXPECT_EQ(getGC().size(), (size_t)1); } TEST(gc, autoCleanup) { @@ -92,7 +92,7 @@ for i=1,1000 do st[i] = {"Wow"} end )"); - EXPECT_EQ(getGC().size(), (size_t)1001); + EXPECT_EQ(getGC().size(), (size_t)1002); lua.script(R"( for i=1,1000 do @@ -100,7 +100,7 @@ st[i] = nil end )"); getGC().cleanup(); - EXPECT_EQ(getGC().size(), (size_t)1); + EXPECT_EQ(getGC().size(), (size_t)2); } TEST(gc, cycles) { @@ -116,16 +116,16 @@ st.parent.child = { ref = st.parent } st[4] = { one = 1 } st[5] = { flag = true } )"); - EXPECT_EQ(getGC().size(), (size_t)5); + EXPECT_EQ(getGC().size(), (size_t)6); lua.script("st.parent = nil"); lua.collect_garbage(); getGC().cleanup(); - EXPECT_EQ(getGC().size(), (size_t)3); + EXPECT_EQ(getGC().size(), (size_t)4); } getGC().cleanup(); - EXPECT_EQ(getGC().size(), (size_t)0); + EXPECT_EQ(getGC().size(), (size_t)1); } TEST(gc, multipleStates) { @@ -140,7 +140,7 @@ TEST(gc, multipleStates) { lua2["st"] = st; } getGC().cleanup(); - EXPECT_EQ(getGC().size(), (size_t)1); + EXPECT_EQ(getGC().size(), (size_t)2); lua1.script(R"( st.men = { name = "John", age = 22 } @@ -153,12 +153,12 @@ st.men.cat = st.cat st.men.fish = st.fish )"); getGC().cleanup(); - EXPECT_EQ(getGC().size(), (size_t)5); + EXPECT_EQ(getGC().size(), (size_t)6); lua2.script("copy = { st.men } st = nil"); lua1.script("st = nil"); lua1.collect_garbage(); lua2.collect_garbage(); getGC().cleanup(); - EXPECT_EQ(getGC().size(), (size_t)4); + EXPECT_EQ(getGC().size(), (size_t)5); } diff --git a/tests/lua/shared_table.lua b/tests/lua/shared_table.lua index 70ca408..ef1660f 100644 --- a/tests/lua/shared_table.lua +++ b/tests/lua/shared_table.lua @@ -249,3 +249,21 @@ function TestSharedTableWithMetaTable:testMetatableAsSharedTable() share.table_key = "table_value" test.assertEquals(share.table_key, "mt_table_value") end + +function TestSharedTable:testGlobalTable() + test.assertNotEquals(effil.G, nil) + effil.G.test_key = "test_value" + local thr = effil.thread(function() + local effil = require "effil" + if effil.G == nil or effil.G.test_key ~= "test_value" then + error("Invalid value of global table: " .. tostring(effil.G and effil.G.test_key or nil)) + end + effil.G.test_key = "checked" + end)() + local status, err = thr:wait() + if status == "failed" then + print("Thread failed with message: " .. err) + end + test.assertEquals(status, "completed") + test.assertEquals(effil.G.test_key, "checked") +end