Dernière activité 1722237684

rootspring's Avatar rootspring a révisé ce gist 1722237684. Aller à la révision

1 file changed, 107 insertions

lua_usage.rs(fichier créé)

@@ -0,0 +1,107 @@
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 + }
Plus récent Plus ancien