lua_usage.rs
· 2.6 KiB · Rust
原始文件
#[tokio::test]
async fn multilua_test() {
let vm1 = Lua::new();
vm1.sandbox(true).unwrap();
let vm2 = Lua::new();
vm2.sandbox(true).unwrap();
// To allow locking down _G, we need to create a table to store user data (__stack)
vm1.globals()
.set("__stack", vm1.create_table().unwrap())
.unwrap();
vm2.globals()
.set("__stack", vm2.create_table().unwrap())
.unwrap();
// Set a global variable
let f: LuaFunction = vm1
.load(
r#"
-- My first function
function(args)
for k, v in pairs(args) do
print(k, v)
end
__stack.obs = "some text value"
return args["a"]
end
"#,
)
.eval_async()
.await
.unwrap();
let luav = vm1.create_table().unwrap();
luav.set("a", 1).unwrap();
let res: i32 = f.call_async(luav).await.unwrap();
assert_eq!(res, 1);
// _G.obj must persist
let f: LuaFunction = vm1
.load(
r#"
-- If __stack.obs is set, return arg1
function(args)
for k, v in pairs(args) do
print(k, v)
end
if __stack.obs == "some text value" then
return args["arg1"]
end
return 3
end
"#,
)
.eval_async()
.await
.unwrap();
let res: i32 = f
.call_async({
let t = vm1.create_table().unwrap();
t.set("arg1", 5).unwrap();
t
})
.await
.unwrap();
assert_eq!(res, 5);
// But _G.obs must not be set in vm2
// _G.obj must persist
let f: LuaFunction = vm2
.load(
r#"
-- If __stack.obs is set, return arg1
function(args)
for k, v in pairs(args) do
print(k, v)
end
if __stack.obs == "some text value" then
return args["arg1"]
end
return 3
end
"#,
)
.eval_async()
.await
.unwrap();
let res: i32 = f
.call_async({
let t = vm2.create_table().unwrap();
t.set("arg1", 5).unwrap();
t
})
.await
.unwrap();
assert_eq!(res, 3);
}
1 | #[tokio::test] |
2 | async fn multilua_test() { |
3 | let vm1 = Lua::new(); |
4 | vm1.sandbox(true).unwrap(); |
5 | let vm2 = Lua::new(); |
6 | vm2.sandbox(true).unwrap(); |
7 | |
8 | // To allow locking down _G, we need to create a table to store user data (__stack) |
9 | vm1.globals() |
10 | .set("__stack", vm1.create_table().unwrap()) |
11 | .unwrap(); |
12 | vm2.globals() |
13 | .set("__stack", vm2.create_table().unwrap()) |
14 | .unwrap(); |
15 | |
16 | // Set a global variable |
17 | let f: LuaFunction = vm1 |
18 | .load( |
19 | r#" |
20 | -- My first function |
21 | function(args) |
22 | for k, v in pairs(args) do |
23 | print(k, v) |
24 | end |
25 | __stack.obs = "some text value" |
26 | return args["a"] |
27 | end |
28 | "#, |
29 | ) |
30 | .eval_async() |
31 | .await |
32 | .unwrap(); |
33 | |
34 | let luav = vm1.create_table().unwrap(); |
35 | luav.set("a", 1).unwrap(); |
36 | |
37 | let res: i32 = f.call_async(luav).await.unwrap(); |
38 | |
39 | assert_eq!(res, 1); |
40 | |
41 | // _G.obj must persist |
42 | let f: LuaFunction = vm1 |
43 | .load( |
44 | r#" |
45 | -- If __stack.obs is set, return arg1 |
46 | function(args) |
47 | for k, v in pairs(args) do |
48 | print(k, v) |
49 | end |
50 | |
51 | if __stack.obs == "some text value" then |
52 | return args["arg1"] |
53 | end |
54 | |
55 | return 3 |
56 | end |
57 | "#, |
58 | ) |
59 | .eval_async() |
60 | .await |
61 | .unwrap(); |
62 | |
63 | let res: i32 = f |
64 | .call_async({ |
65 | let t = vm1.create_table().unwrap(); |
66 | t.set("arg1", 5).unwrap(); |
67 | t |
68 | }) |
69 | .await |
70 | .unwrap(); |
71 | |
72 | assert_eq!(res, 5); |
73 | |
74 | // But _G.obs must not be set in vm2 |
75 | // _G.obj must persist |
76 | let f: LuaFunction = vm2 |
77 | .load( |
78 | r#" |
79 | -- If __stack.obs is set, return arg1 |
80 | function(args) |
81 | for k, v in pairs(args) do |
82 | print(k, v) |
83 | end |
84 | |
85 | if __stack.obs == "some text value" then |
86 | return args["arg1"] |
87 | end |
88 | |
89 | return 3 |
90 | end |
91 | "#, |
92 | ) |
93 | .eval_async() |
94 | .await |
95 | .unwrap(); |
96 | |
97 | let res: i32 = f |
98 | .call_async({ |
99 | let t = vm2.create_table().unwrap(); |
100 | t.set("arg1", 5).unwrap(); |
101 | t |
102 | }) |
103 | .await |
104 | .unwrap(); |
105 | |
106 | assert_eq!(res, 3); |
107 | } |
108 |