#[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); }