22// Provides a clean way to register Rust functions as Lua libraries
33
44use crate :: lua_value:: { CFunction , LuaValue } ;
5- use crate :: lua_vm:: { LuaError , LuaResult , LuaVM } ;
5+ use crate :: lua_vm:: { LuaResult , LuaVM } ;
66use crate :: stdlib;
77
88/// Type for value initializers - functions that create values when the module loads
@@ -189,7 +189,7 @@ pub fn create_standard_registry() -> LibraryRegistry {
189189 registry. register ( stdlib:: string:: create_string_lib ( ) ) ;
190190 registry. register ( stdlib:: table:: create_table_lib ( ) ) ;
191191 registry. register ( stdlib:: math:: create_math_lib ( ) ) ;
192- registry. register ( stdlib:: io:: create_io_lib ( ) ) ;
192+ // registry.register(stdlib::io::create_io_lib());
193193 registry. register ( stdlib:: os:: create_os_lib ( ) ) ;
194194 registry. register ( stdlib:: utf8:: create_utf8_lib ( ) ) ;
195195 registry. register ( stdlib:: coroutine:: create_coroutine_lib ( ) ) ;
@@ -213,17 +213,18 @@ pub fn get_args(vm: &LuaVM) -> Vec<LuaValue> {
213213}
214214
215215/// Helper to get a specific argument
216+ /// 1 based index
216217#[ inline( always) ]
217218pub fn get_arg ( vm : & LuaVM , index : usize ) -> Option < LuaValue > {
218219 let frame = vm. frames . last ( ) . unwrap ( ) ;
219220 let base_ptr = frame. base_ptr ;
220221 let top = frame. top ;
221222
222- // Arguments are 0-indexed from caller's perspective
223- // But register 0 is the function, so arg 0 is at register 1
224- // get_arg(0) should return register[base_ptr + 1]
225- // get_arg(1) should return register[base_ptr + 2]
226- let reg_offset = index + 1 ; // +1 to skip the function at register 0
223+ // Arguments use 1-based indexing (Lua convention)
224+ // Register 0 is the function itself
225+ // get_arg(1) returns register[base_ptr + 1] (first argument)
226+ // get_arg(2) returns register[base_ptr + 2] (second argument)
227+ let reg_offset = index;
227228 if reg_offset < top {
228229 let reg_index = base_ptr + reg_offset;
229230 if reg_index < vm. register_stack . len ( ) {
@@ -237,11 +238,13 @@ pub fn get_arg(vm: &LuaVM, index: usize) -> Option<LuaValue> {
237238}
238239
239240/// Helper to require an argument
241+ /// 1 based index
240242#[ inline]
241- pub fn require_arg ( vm : & LuaVM , index : usize , func_name : & str ) -> LuaResult < LuaValue > {
242- get_arg ( vm, index) . ok_or_else ( || {
243- LuaError :: RuntimeError ( format ! ( "{}() requires argument {}" , func_name, index + 1 ) )
244- } )
243+ pub fn require_arg ( vm : & mut LuaVM , index : usize , func_name : & str ) -> LuaResult < LuaValue > {
244+ let Some ( arg) = get_arg ( vm, index) else {
245+ return Err ( vm. error ( format ! ( "{}() requires argument {}" , func_name, index + 1 ) ) ) ;
246+ } ;
247+ Ok ( arg)
245248}
246249
247250/// Helper to get argument count
@@ -251,19 +254,3 @@ pub fn arg_count(vm: &LuaVM) -> usize {
251254 // Subtract 1 for the function itself
252255 frame. top . saturating_sub ( 1 )
253256}
254-
255- /// Helper to get string argument
256- pub fn get_string ( vm : & LuaVM , index : usize , func_name : & str ) -> LuaResult < String > {
257- let arg = require_arg ( vm, index, func_name) ?;
258- unsafe {
259- arg. as_string ( )
260- . map ( |s| s. as_str ( ) . to_string ( ) )
261- . ok_or_else ( || {
262- LuaError :: RuntimeError ( format ! (
263- "{}() requires string argument {}" ,
264- func_name,
265- index + 1
266- ) )
267- } )
268- }
269- }
0 commit comments