Utoljára aktív 1722237684

lua_usage.rs Eredeti
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