@@ -21,6 +21,42 @@ pub struct AutorunEnv {
2121 pub code_len : usize ,
2222}
2323
24+ impl AutorunEnv {
25+ pub fn from_lua ( state : LuaState ) -> Option < Self > {
26+ lua_getglobal ( state, cstr ! ( "sautorun" ) ) ;
27+ if lua_type ( state, -1 ) == rglua:: lua:: TTABLE {
28+ lua_getfield ( state, -1 , cstr ! ( "STARTUP" ) ) ;
29+ let startup = lua_toboolean ( state, -1 ) != 0 ;
30+
31+ lua_getfield ( state, -1 , cstr ! ( "NAME" ) ) ;
32+ let identifier = lua_tostring ( state, -1 ) ;
33+
34+ lua_getfield ( state, -1 , cstr ! ( "CODE_LEN" ) ) ;
35+ let mut code_len = lua_tointeger ( state, -1 ) as usize ;
36+
37+ lua_getfield ( state, -1 , cstr ! ( "CODE" ) ) ;
38+ let code = lua_tolstring ( state, -1 , & mut code_len) ;
39+
40+ lua_getfield ( state, -1 , cstr ! ( "IP" ) ) ;
41+ let ip = lua_tostring ( state, -1 ) ;
42+
43+ lua_pop ( state, 6 ) ;
44+
45+ return Some ( AutorunEnv {
46+ is_autorun_file : false ,
47+ startup,
48+ code,
49+ identifier,
50+ code_len,
51+ ip
52+ } ) ;
53+ }
54+
55+ lua_pop ( state, 1 ) ;
56+ None
57+ }
58+ }
59+
2460// Functions to interact with lua without triggering the detours
2561pub fn compile < S : AsRef < str > > ( l : LuaState , code : S ) -> Result < ( ) , & ' static str > {
2662 let s = code. as_ref ( ) ;
@@ -135,6 +171,9 @@ pub fn run_env(
135171 lua_pushstring ( l, env. identifier ) ; // stack[3] = identifier
136172 lua_setfield ( l, -2 , cstr ! ( "NAME" ) ) ; // stack[2].NAME = table.remove(stack, 3)
137173
174+ lua_pushinteger ( l, env. code_len as LuaInteger ) ; // stack[3] = code_len
175+ lua_setfield ( l, -2 , cstr ! ( "CODE_LEN" ) ) ; // stack[2].CODE_LEN = table.remove(stack, 3)
176+
138177 lua_pushlstring ( l, env. code , env. code_len ) ; // stack[3] = identifier
139178 lua_setfield ( l, -2 , cstr ! ( "CODE" ) ) ; // stack[2].CODE = table.remove(stack, 3)
140179
0 commit comments