@@ -128,15 +128,57 @@ fn dofile(env: &mut LuaEnv, args: usize, expected_ret: Option<usize>) -> Result<
128128 let func = LuaFunction :: LuaFunc ( func) ;
129129 env. function_call ( 0 , func. into ( ) , expected_ret)
130130}
131- fn tonumber ( _env : & mut LuaEnv , _args : usize ) -> Result < usize , RuntimeError > {
132- unimplemented ! ( "tonumber" ) ;
133- }
134131fn collectgarbage ( _env : & mut LuaEnv , _args : usize ) -> Result < usize , RuntimeError > {
135132 unimplemented ! ( "collectgarbage" ) ;
136133}
137134fn xpcall ( _env : & mut LuaEnv , _args : usize ) -> Result < usize , RuntimeError > {
138135 unimplemented ! ( "xpcall" ) ;
139136}
137+ fn tonumber ( env : & mut LuaEnv , args : usize ) -> Result < usize , RuntimeError > {
138+ match args {
139+ 0 => return Err ( RuntimeError :: new_empty_argument ( 1 , "value" ) ) ,
140+ 1 => {
141+ let value = env. pop ( ) ;
142+ let res = match value {
143+ LuaValue :: Number ( n) => LuaValue :: Number ( n) ,
144+ LuaValue :: String ( s) => LuaValue :: Number ( s. try_to_number ( ) ?) ,
145+ _ => LuaValue :: Nil ,
146+ } ;
147+ env. push ( res) ;
148+ Ok ( 1 )
149+ }
150+ _ => {
151+ env. pop_n ( args - 2 ) ;
152+ let ( value, base) = env. pop2 ( ) ;
153+ let base = match base {
154+ LuaValue :: Number ( n) => n. try_to_int ( ) ?,
155+ LuaValue :: String ( s) => s. try_to_number ( ) ?. try_to_int ( ) ?,
156+ _ => {
157+ return Err ( RuntimeError :: BadArgument (
158+ 2 ,
159+ Box :: new ( RuntimeError :: Expected ( "number" , base. type_str ( ) . into ( ) ) ) ,
160+ ) )
161+ }
162+ } ;
163+ if base < 2 || base > 36 {
164+ return Err ( RuntimeError :: BadArgument (
165+ 2 ,
166+ Box :: new ( RuntimeError :: BaseOutOfRange ) ,
167+ ) ) ;
168+ }
169+ let _value = match value {
170+ LuaValue :: String ( s) => s,
171+ _ => {
172+ return Err ( RuntimeError :: BadArgument (
173+ 1 ,
174+ Box :: new ( RuntimeError :: Expected ( "string" , value. type_str ( ) . into ( ) ) ) ,
175+ ) )
176+ }
177+ } ;
178+ unreachable ! ( "tonumber with more than 1 argument" ) ;
179+ }
180+ }
181+ }
140182
141183pub fn pcall (
142184 env : & mut LuaEnv ,
0 commit comments