demo code added, test code removed

master
Joachim Stolberg 2020-05-10 17:48:52 +02:00
parent ea5576948e
commit 32fa80a393
6 changed files with 73 additions and 399 deletions

70
demo.lua Normal file
View File

@ -0,0 +1,70 @@
--[[
SaferLua [safer_lua]
====================
Copyright (C) 2018-2020 Joachim Stolberg
LGPLv2.1+
See LICENSE.txt for more information
Example demo code
]]--
-- demo function 1
local function output(self, s)
print(self.meta.name, s)
end
-- demo function 2
local function add(self, param1, param2)
return param1 + param2
end
-- for Lua interpreter errors
local function error(pos, s)
print("[Safer Lua] "..(s or ""))
end
-- init function code block
local init = [[
-- init code here
sum = 0
$output("Hello world!")
]]
-- loop function code block
local loop = [[
-- loop code here
sum = $add(1, sum)
$output(sum)
]]
-- runtime environment
local env = {
output = output,
add = add,
}
-- runtime meta data (protected for the running Lua script)
env.meta = {num = 1, name = "Joe"}
-- used for ingame positions
local pos = {x = 0, y = 0, z = 0}
-- elapsed game time
local elapsed = 1
-- compile the Lus script to byte code (only once)
local code = safer_lua.init(pos, init, loop, env, error)
if code then
for i=1, 10 do
-- execute the byte code
safer_lua.run_loop(pos, elapsed, code, error)
end
end

View File

@ -3,7 +3,7 @@
SaferLua [safer_lua]
====================
Copyright (C) 2018 Joachim Stolberg
Copyright (C) 2018-2020 Joachim Stolberg
LGPLv2.1+
See LICENSE.txt for more information
@ -19,4 +19,5 @@ safer_lua.version = 1.0
dofile(minetest.get_modpath("safer_lua") .. "/data_struct.lua")
dofile(minetest.get_modpath("safer_lua") .. "/scanner.lua")
dofile(minetest.get_modpath("safer_lua") .. "/environ.lua")
dofile(minetest.get_modpath("safer_lua") .. "/environ.lua")
dofile(minetest.get_modpath("safer_lua") .. "/demo.lua")

View File

@ -1,203 +0,0 @@
core = {}
function core.global_exists(name)
return false
end
dofile('/home/joachim/minetest4/builtin/common/vector.lua')
dofile('/home/joachim/minetest4/builtin/common/misc_helpers.lua')
safer_lua = {}
safer_lua.MaxTableSize = 1000 -- number of table entries considering string lenghts
dofile('/home/joachim/minetest4/mods/techpack/safer_lua/data_struct.lua')
print("Array")
local a = safer_lua.Array(1,2,3,4) --> {1,2,3,4}
a.add(6) --> {1,2,3,4,6}
a.set(2, 8) --> {1,8,3,4,6}
a.insert(5,7) --> {1,8,3,4,7,6}
print(dump(a.__dump()))
a.remove(3) --> {1,8,4,7,6}
a.insert(1, "hello") --> {"hello",1,8,4,7,6}
print(a.size()) --> function returns 10
print(dump(a.__dump()))
print("Store")
local s = safer_lua.Store() --> {}
s.set("val", 12) --> {val = 12}
s.get("val") --> returns 12
s.set(0, "hello") --> {val = 12, [0] = "hello"}
print(dump(s.__dump()))
s.del("val") --> {[0] = "hello"}
print(s.size()) --> function returns 6
print("Set")
s = safer_lua.Set("Tom", "Lucy", "Joe") --> {Tom = true, Lucy = true, Joe = true}
s.add("Susi") --> {Tom = true, Lucy = true, Joe = true, Susi = true}
s.del("Tom") --> {Lucy = true, Joe = true, Susi = true}
print(dump(s.__dump()))
print(s.has("Joe")) --> function returns `true`
print(s.has("Mike")) --> function returns `false`
print(s.size()) --> function returns 11
print("S1")
local s1 = safer_lua.Store()
assert(s1.size() == 0)
s1.a = 3
s1[1] = 4
assert(s1.size() == 0)
s1.set("b", "Hallo")
assert(s1.size() == 1)
assert(s1.memsize() == 6)
s1.set("b", "Hall")
assert(s1.size() == 1)
assert(s1.memsize() == 5)
assert(s1.get("b") == "Hall")
assert(s1.size() == 1)
s1.set("1234", "12345678")
assert(s1.size() == 2)
assert(s1.memsize() == 17)
s1.del("1234")
print(s1.size())
assert(s1.size() == 1)
assert(s1.memsize() == 5)
assert(s1.get("1234") == nil)
print("S2")
local s2 = safer_lua.Store()
assert(s2.size() == 0)
assert(s2.memsize() == 0)
s2.set("b", "Joe")
assert(s2.size() == 1)
assert(s2.memsize() == 4)
assert(s2.b == nil)
assert(s2.get('b') == "Joe")
s2.c = "XXX!"
assert(s2.c == nil)
s1.set("c", s2)
print(dump(s1.get("c")))
assert(s1.size() == 2)
print(s1.memsize())
assert(s1.memsize() == 10)
assert(s2.size() == 1)
assert(s2.memsize() == 4)
print("A1")
local a1 = safer_lua.Array(1,2,3,4)
assert(a1.size() == 4)
print(dump(a1))
a1.set(2, "Hallo")
assert(a1.size() == 4)
assert(a1.memsize() == 8)
a1.insert(1, 0)
assert(a1.size() == 5)
assert(a1.memsize() == 9)
a1.remove(3)
assert(a1.size() == 4)
assert(a1.memsize() == 4)
print(a1.MemSize)
print(a1.Size)
print("Set")
local s3 = safer_lua.Set("Joe", "Bob", "Tom")
print(s3.size())
s3.add("Susi")
local t = s3.__dump()
print(dump(t))
s3.del("Tom")
assert(s3.has("Susi") == true)
assert(s3.has("Mike") == false)
print(s3.size())
assert(s3.size() == 3)
assert(s3.memsize() == 10)
local s4 = safer_lua.Set()
s4.__load(3, 12, {Joe=true, Bob=true, Tom=true})
assert(s4.has("Joe") == true)
assert(s4.has("Mike") == false)
print(s4.size())
assert(s4.size() == 3)
assert(s4.memsize() == 12)
local tbl = safer_lua.datastruct_to_table(s3)
s3 = safer_lua.table_to_datastruct(tbl)
assert(s3.has("Susi") == true)
assert(s3.has("Mike") == false)
print(s3.size())
assert(s3.size() == 3)
assert(s3.memsize() == 10)
tbl = safer_lua.datastruct_to_table(a1)
a1 = safer_lua.table_to_datastruct(tbl)
assert(a1.size() == 4)
assert(a1.memsize() == 4)
assert(a1.get(4) == 4)
tbl = safer_lua.datastruct_to_table(s2)
s2 = safer_lua.table_to_datastruct(tbl)
assert(s2.size() == 1)
assert(s2.memsize() == 4)
assert(s2.get("b") == "Joe")
print("next over Array")
local a2 = safer_lua.Array(10, 20, 30)
for i,v in a2.next() do
print(i,v)
end
print("next over Set")
local s6 = safer_lua.Set("Joe", "Bob", "Tom")
for i,v in s6.next() do
print(i,v)
end
print("next over Store")
local s7 = safer_lua.Store() --> {}
s7.set("a", 12)
s7.set("b", 13)
s7.set("c", 14)
for k,v in s7.next() do
print(k,v)
end
print("sort")
a3 = safer_lua.Array("Joe", "Bob", "Tom")
a3.sort(true)
print(dump(a3.__dump()))
a3.sort()
print(dump(a3.__dump()))
s7 = safer_lua.Store()
s7.set("Joe", 1000)
s7.set("Susi", 800)
s7.set("Tom", 60)
s7.set("Mike", 900)
s7.set("Bob", 1100)
local k = s7.keys()
print(dump(k.__dump()))
local k = s7.keys("up")
print(dump(k.__dump()))
local k = s7.keys("down")
print(dump(k.__dump()))

View File

@ -1,94 +0,0 @@
core = {}
function core.global_exists(name)
return false
end
dofile('/home/joachim/minetest4/builtin/common/vector.lua')
dofile('/home/joachim/minetest4/builtin/common/misc_helpers.lua')
safer_lua = {}
dofile('/home/joachim/minetest4/mods/techpack/safer_lua/data_struct.lua')
dofile('/home/joachim/minetest4/mods/techpack/safer_lua/scanner.lua')
dofile('/home/joachim/minetest4/mods/techpack/safer_lua/environ.lua')
--local Cache = {}
--local key = minetest.pos_to_hash(pos)
--code = Cache[key]
local function foo(self, val)
print("Hallo", val)
end
local function error(pos, s)
print("[Test] "..(s or "").." at pos "..dump(pos))
end
local init = "fo"
local loop = [[
--$loopcycle(5)
--$events(true)
$foo("hallo")
$foo("hallo")
$foo(math.floor(5.5))
$foo("Joe")
a = Store()
a.set("a", 123)
a.set("b", 456)
$foo(a.get("a"))
$foo(ticks)
if ticks == 10 then $foo("Fehler") end
for k,v in a.next() do
$foo(k)
end
--for k = 1,4,1 do
-- next = 3
-- $foo(k)
--end
--$foo(meta.pos)
]]
local init2 = [[
meme = "\n\n\"" while true do end meme = ""
]]
local env = {foo = foo}
env.meta = {pos=1, owner="Joe", number="0123"}
local code = safer_lua.init(0, init, "", loop, env, error)
if code then
print(safer_lua.run_loop(0, 0, code, error))
safer_lua.run_loop(0, 1, code, error)
safer_lua.run_loop(0, 2, code, error)
end
print("\n<<< Coroutine >>>\n")
local function outp(self, val)
print(val)
end
local function step(self, num)
for i=1,num do
print(i)
coroutine.yield()
end
end
local thread = [[
$outp("hallo")
$step(2)
$outp(meta.pos)
]]
env = {step = step, outp = outp}
env.meta = {pos=1, owner="Joe", number="0123", error=error}
local co, code = safer_lua.co_create(0, init, thread, env, error)
if code then
for i=1,20 do
if safer_lua.co_resume(0, co, code, error) == false then break end
end
end

View File

@ -1,41 +0,0 @@
core = {}
function core.global_exists(name)
return false
end
safer_lua = {}
dofile('/home/joachim/minetest4/builtin/common/vector.lua')
dofile('/home/joachim/minetest4/builtin/common/misc_helpers.lua')
dofile('/home/joachim/minetest4/mods/techpack/safer_lua/scanner.lua')
code = [[
-- GOOD
a = 1
a = a + 1
print(a)
foo(a)
-- BAD
_G.print(()
t = {}
for i = 1,1000 do
]]
code2 = [[
meme = "\"" while true do end meme = ""
]]
code3 = "s = [[abc]]"
local function error(pos, s)
print("[Robbi] "..s)
end
safer_lua:check(nil, code, "Code", error)
lToken = safer_lua:scanner(code2)
safer_lua:check(nil, code2, "Code", error)
lToken = safer_lua:scanner(code3)
safer_lua:check(nil, code3, "Code", error)

View File

@ -1,59 +0,0 @@
core = {}
function core.global_exists(name)
return false
end
dofile('/home/joachim/minetest/builtin/common/vector.lua')
dofile('/home/joachim/minetest/builtin/common/misc_helpers.lua')
safer_lua = {}
safer_lua.MaxTableSize = 1000 -- number of table entries considering string lenghts
dofile('/home/joachim/minetest4/mods/techpack/safer_lua/data_struct.lua')
local s1 = safer_lua.Store()
local s2 = safer_lua.Store()
print("S1")
assert(s1.size() == 0)
s1.a = 3
assert(s1.size() == 0)
s1.set("b", "Hallo")
assert(s1.size() == 1)
assert(s1.get("b") == "Hallo")
assert(s1.size() == 1)
print("S2")
assert(s2.size() == 0)
s2.set("b", "Joe")
assert(s2.size() == 1)
assert(s2.b == nil)
s2.c = "XXX!"
assert(s2.c == nil)
s1.set("c", s2)
print(s1.get("c"))
local s3 = safer_lua.Store("a", 4, "b", 5, "c")
assert(s3.get("a") == 4)
assert(s3.get("b") == 5)
assert(s3.get("c") == nil)
s = safer_lua.Store("a", 4, "b", 5) --> {a = 4, b = 5}
--s = safer_lua.Store() --> {a = 4, b = 5}
s.set("val", 12) --> {a = 4, b = 5, val = 12}
s.get("val") --> returns 12
s.set(0, "hello") --> {a = 4, b = 5, val = 12, [0] = "hello"}
s.del("val") --> {a = 4, b = 5, [0] = "hello"}
print(s.size()) --> function returns 3
print(s.memsize()) --> function returns 8
print("Ready.")