demo code added, test code removed
parent
ea5576948e
commit
32fa80a393
|
@ -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
|
5
init.lua
5
init.lua
|
@ -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")
|
|
@ -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()))
|
||||
|
|
@ -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
|
|
@ -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)
|
|
@ -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.")
|
Loading…
Reference in New Issue