@@ -59,7 +59,7 @@ fn lua_print(vm: &mut LuaVM) -> LuaResult<MultiValue> {
5959
6060/// type(v) - Return the type of a value as a string
6161fn lua_type ( vm : & mut LuaVM ) -> LuaResult < MultiValue > {
62- let value = get_arg ( vm, 0 ) . unwrap_or ( LuaValue :: nil ( ) ) ;
62+ let value = get_arg ( vm, 1 ) . unwrap_or ( LuaValue :: nil ( ) ) ;
6363
6464 let type_name = match value. kind ( ) {
6565 LuaValueKind :: Nil => "nil" ,
@@ -78,10 +78,10 @@ fn lua_type(vm: &mut LuaVM) -> LuaResult<MultiValue> {
7878
7979/// assert(v [, message]) - Raise error if v is false or nil
8080fn lua_assert ( vm : & mut LuaVM ) -> LuaResult < MultiValue > {
81- let condition = get_arg ( vm, 0 ) . unwrap_or ( LuaValue :: nil ( ) ) ;
81+ let condition = get_arg ( vm, 1 ) . unwrap_or ( LuaValue :: nil ( ) ) ;
8282
8383 if !condition. is_truthy ( ) {
84- let message = get_arg ( vm, 1 )
84+ let message = get_arg ( vm, 2 )
8585 . and_then ( |v| v. as_lua_string ( ) . map ( |s| s. as_str ( ) . to_string ( ) ) )
8686 . unwrap_or_else ( || "assertion failed!" . to_string ( ) ) ;
8787 return Err ( vm. error ( message) ) ;
@@ -93,7 +93,7 @@ fn lua_assert(vm: &mut LuaVM) -> LuaResult<MultiValue> {
9393
9494/// error(message) - Raise an error
9595fn lua_error ( vm : & mut LuaVM ) -> LuaResult < MultiValue > {
96- let message = get_arg ( vm, 0 )
96+ let message = get_arg ( vm, 1 )
9797 . map ( |v| {
9898 vm. value_to_string ( & v)
9999 . unwrap_or_else ( |_| v. to_string_repr ( ) )
@@ -107,7 +107,7 @@ fn lua_error(vm: &mut LuaVM) -> LuaResult<MultiValue> {
107107/// tonumber(e [, base]) - Convert to number
108108fn lua_tonumber ( vm : & mut LuaVM ) -> LuaResult < MultiValue > {
109109 let value = require_arg ( vm, 1 , "tonumber" ) ?;
110- let base = get_arg ( vm, 1 ) . and_then ( |v| v. as_integer ( ) ) . unwrap_or ( 10 ) ;
110+ let base = get_arg ( vm, 2 ) . and_then ( |v| v. as_integer ( ) ) . unwrap_or ( 10 ) ;
111111
112112 if base < 2 || base > 36 {
113113 return Err ( vm. error ( "bad argument #2 to 'tonumber' (base out of range)" . to_string ( ) ) ) ;
@@ -250,13 +250,13 @@ fn lua_ipairs(vm: &mut LuaVM) -> LuaResult<MultiValue> {
250250#[ inline]
251251fn ipairs_next ( vm : & mut LuaVM ) -> LuaResult < MultiValue > {
252252 // Ultra-fast path: direct argument access without validation
253- let table_val = if let Some ( val) = get_arg ( vm, 0 ) {
253+ let table_val = if let Some ( val) = get_arg ( vm, 1 ) {
254254 val
255255 } else {
256256 return Err ( vm. error ( "ipairs iterator: table expected" . to_string ( ) ) ) ;
257257 } ;
258258
259- let index_val = if let Some ( val) = get_arg ( vm, 1 ) {
259+ let index_val = if let Some ( val) = get_arg ( vm, 2 ) {
260260 val
261261 } else {
262262 return Err ( vm. error ( "ipairs iterator: index expected" . to_string ( ) ) ) ;
@@ -428,6 +428,16 @@ fn lua_setmetatable(vm: &mut LuaVM) -> LuaResult<MultiValue> {
428428 return Err ( vm. error ( "Invalid table" . to_string ( ) ) ) ;
429429 } ;
430430
431+ // Check if current metatable has __metatable field (protection)
432+ if let Some ( current_mt) = table_ref. borrow ( ) . get_metatable ( ) {
433+ if let Some ( mt_table) = current_mt. as_lua_table ( ) {
434+ let metatable_field = vm. create_string ( "__metatable" ) ;
435+ if let Some ( _) = mt_table. borrow ( ) . raw_get ( & metatable_field) {
436+ return Err ( vm. error ( "cannot change a protected metatable" . to_string ( ) ) ) ;
437+ }
438+ }
439+ }
440+
431441 match metatable. kind ( ) {
432442 LuaValueKind :: Nil => {
433443 table_ref. borrow_mut ( ) . set_metatable ( None ) ;
@@ -501,8 +511,8 @@ fn lua_rawlen(vm: &mut LuaVM) -> LuaResult<MultiValue> {
501511
502512/// rawequal(v1, v2) - Equality without metamethods
503513fn lua_rawequal ( vm : & mut LuaVM ) -> LuaResult < MultiValue > {
504- let v1 = get_arg ( vm, 0 ) . unwrap_or ( LuaValue :: nil ( ) ) ;
505- let v2 = get_arg ( vm, 1 ) . unwrap_or ( LuaValue :: nil ( ) ) ;
514+ let v1 = get_arg ( vm, 1 ) . unwrap_or ( LuaValue :: nil ( ) ) ;
515+ let v2 = get_arg ( vm, 2 ) . unwrap_or ( LuaValue :: nil ( ) ) ;
506516
507517 let result = v1 == v2;
508518 Ok ( MultiValue :: single ( LuaValue :: boolean ( result) ) )
0 commit comments