Add global G and test (#41)

Global effil.G for all states
This commit is contained in:
mihacooper 2017-04-14 16:38:16 +03:00 committed by Ilia
parent cac3cd09e7
commit 6d20b0ff03
4 changed files with 37 additions and 15 deletions

View File

@ -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>()); } sol::object createTable(sol::this_state lua) { return sol::make_object(lua, getGC().create<SharedTable>()); }
SharedTable globalTable = getGC().create<SharedTable>();
} // namespace } // namespace
extern "C" int luaopen_libeffil(lua_State* L) { extern "C" int luaopen_libeffil(lua_State* L) {
@ -36,7 +38,8 @@ extern "C" int luaopen_libeffil(lua_State* L) {
"rawget", SharedTable::luaRawGet, "rawget", SharedTable::luaRawGet,
"size", SharedTable::luaSize, "size", SharedTable::luaSize,
"setmetatable", SharedTable::luaSetMetatable, "setmetatable", SharedTable::luaSetMetatable,
"getmetatable", SharedTable::luaGetMetatable "getmetatable", SharedTable::luaGetMetatable,
"G", sol::make_object(lua, globalTable)
); );
sol::stack::push(lua, publicApi); sol::stack::push(lua, publicApi);
return 1; return 1;

View File

@ -22,6 +22,7 @@ local api = {
rawset = capi.rawset, rawset = capi.rawset,
setmetatable = capi.setmetatable, setmetatable = capi.setmetatable,
getmetatable = capi.getmetatable, getmetatable = capi.getmetatable,
G = capi.G,
} }
local function run_thread(config, f, ...) local function run_thread(config, f, ...)

View File

@ -26,7 +26,7 @@ TEST(gc, GCObject) {
TEST(gc, collect) { TEST(gc, collect) {
getGC().cleanup(); getGC().cleanup();
ASSERT_EQ(getGC().size(), (size_t)0); ASSERT_EQ(getGC().size(), (size_t)1);
{ {
GCObject o1 = getGC().create<GCObject>(); GCObject o1 = getGC().create<GCObject>();
@ -34,9 +34,9 @@ TEST(gc, collect) {
GCObject o2 = getGC().create<GCObject>(); GCObject o2 = getGC().create<GCObject>();
; ;
} }
EXPECT_EQ(getGC().size(), (size_t)2); EXPECT_EQ(getGC().size(), (size_t)3);
getGC().cleanup(); getGC().cleanup();
EXPECT_EQ(getGC().size(), (size_t)0); EXPECT_EQ(getGC().size(), (size_t)1);
} }
namespace { namespace {
@ -58,12 +58,12 @@ TEST(gc, withRefs) {
root.add(child.handle()); root.add(child.handle());
} }
} }
EXPECT_EQ(getGC().size(), (size_t)5); EXPECT_EQ(getGC().size(), (size_t)6);
getGC().cleanup(); getGC().cleanup();
EXPECT_EQ(getGC().size(), (size_t)4); EXPECT_EQ(getGC().size(), (size_t)5);
} }
getGC().cleanup(); getGC().cleanup();
EXPECT_EQ(getGC().size(), (size_t)0); EXPECT_EQ(getGC().size(), (size_t)1);
} }
TEST(gc, autoCleanup) { TEST(gc, autoCleanup) {
@ -92,7 +92,7 @@ for i=1,1000 do
st[i] = {"Wow"} st[i] = {"Wow"}
end end
)"); )");
EXPECT_EQ(getGC().size(), (size_t)1001); EXPECT_EQ(getGC().size(), (size_t)1002);
lua.script(R"( lua.script(R"(
for i=1,1000 do for i=1,1000 do
@ -100,7 +100,7 @@ st[i] = nil
end end
)"); )");
getGC().cleanup(); getGC().cleanup();
EXPECT_EQ(getGC().size(), (size_t)1); EXPECT_EQ(getGC().size(), (size_t)2);
} }
TEST(gc, cycles) { TEST(gc, cycles) {
@ -116,16 +116,16 @@ st.parent.child = { ref = st.parent }
st[4] = { one = 1 } st[4] = { one = 1 }
st[5] = { flag = true } st[5] = { flag = true }
)"); )");
EXPECT_EQ(getGC().size(), (size_t)5); EXPECT_EQ(getGC().size(), (size_t)6);
lua.script("st.parent = nil"); lua.script("st.parent = nil");
lua.collect_garbage(); lua.collect_garbage();
getGC().cleanup(); getGC().cleanup();
EXPECT_EQ(getGC().size(), (size_t)3); EXPECT_EQ(getGC().size(), (size_t)4);
} }
getGC().cleanup(); getGC().cleanup();
EXPECT_EQ(getGC().size(), (size_t)0); EXPECT_EQ(getGC().size(), (size_t)1);
} }
TEST(gc, multipleStates) { TEST(gc, multipleStates) {
@ -140,7 +140,7 @@ TEST(gc, multipleStates) {
lua2["st"] = st; lua2["st"] = st;
} }
getGC().cleanup(); getGC().cleanup();
EXPECT_EQ(getGC().size(), (size_t)1); EXPECT_EQ(getGC().size(), (size_t)2);
lua1.script(R"( lua1.script(R"(
st.men = { name = "John", age = 22 } st.men = { name = "John", age = 22 }
@ -153,12 +153,12 @@ st.men.cat = st.cat
st.men.fish = st.fish st.men.fish = st.fish
)"); )");
getGC().cleanup(); getGC().cleanup();
EXPECT_EQ(getGC().size(), (size_t)5); EXPECT_EQ(getGC().size(), (size_t)6);
lua2.script("copy = { st.men } st = nil"); lua2.script("copy = { st.men } st = nil");
lua1.script("st = nil"); lua1.script("st = nil");
lua1.collect_garbage(); lua1.collect_garbage();
lua2.collect_garbage(); lua2.collect_garbage();
getGC().cleanup(); getGC().cleanup();
EXPECT_EQ(getGC().size(), (size_t)4); EXPECT_EQ(getGC().size(), (size_t)5);
} }

View File

@ -249,3 +249,21 @@ function TestSharedTableWithMetaTable:testMetatableAsSharedTable()
share.table_key = "table_value" share.table_key = "table_value"
test.assertEquals(share.table_key, "mt_table_value") test.assertEquals(share.table_key, "mt_table_value")
end 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