@@ -169,11 +169,29 @@ impl VM {
169169 ByteCode :: Add => {
170170 let b = self . stack . pop ( ) . ok_or ( "栈为空,无法执行加法" ) ?;
171171 let a = self . stack . pop ( ) . ok_or ( "栈为空,无法执行加法" ) ?;
172-
172+
173173 let result = self . add_values ( a, b) ?;
174174 self . stack . push ( result) ;
175175 self . ip += 1 ;
176176 } ,
177+
178+ ByteCode :: Mul => {
179+ let b = self . stack . pop ( ) . ok_or ( "栈为空,无法执行乘法" ) ?;
180+ let a = self . stack . pop ( ) . ok_or ( "栈为空,无法执行乘法" ) ?;
181+
182+ let result = self . mul_values ( a, b) ?;
183+ self . stack . push ( result) ;
184+ self . ip += 1 ;
185+ } ,
186+
187+ ByteCode :: Div => {
188+ let b = self . stack . pop ( ) . ok_or ( "栈为空,无法执行除法" ) ?;
189+ let a = self . stack . pop ( ) . ok_or ( "栈为空,无法执行除法" ) ?;
190+
191+ let result = self . div_values ( a, b) ?;
192+ self . stack . push ( result) ;
193+ self . ip += 1 ;
194+ } ,
177195
178196 ByteCode :: Sub => {
179197 let b = self . stack . pop ( ) . ok_or ( "栈为空,无法执行减法" ) ?;
@@ -187,11 +205,56 @@ impl VM {
187205 ByteCode :: LessEqual => {
188206 let b = self . stack . pop ( ) . ok_or ( "栈为空,无法执行比较" ) ?;
189207 let a = self . stack . pop ( ) . ok_or ( "栈为空,无法执行比较" ) ?;
190-
208+
191209 let result = self . less_equal_values ( a, b) ?;
192210 self . stack . push ( result) ;
193211 self . ip += 1 ;
194212 } ,
213+
214+ ByteCode :: Greater => {
215+ let b = self . stack . pop ( ) . ok_or ( "栈为空,无法执行比较" ) ?;
216+ let a = self . stack . pop ( ) . ok_or ( "栈为空,无法执行比较" ) ?;
217+
218+ let result = self . greater_values ( a, b) ?;
219+ self . stack . push ( result) ;
220+ self . ip += 1 ;
221+ } ,
222+
223+ ByteCode :: GreaterEqual => {
224+ let b = self . stack . pop ( ) . ok_or ( "栈为空,无法执行比较" ) ?;
225+ let a = self . stack . pop ( ) . ok_or ( "栈为空,无法执行比较" ) ?;
226+
227+ let result = self . greater_equal_values ( a, b) ?;
228+ self . stack . push ( result) ;
229+ self . ip += 1 ;
230+ } ,
231+
232+ ByteCode :: Equal => {
233+ let b = self . stack . pop ( ) . ok_or ( "栈为空,无法执行比较" ) ?;
234+ let a = self . stack . pop ( ) . ok_or ( "栈为空,无法执行比较" ) ?;
235+
236+ let result = self . equal_values ( a, b) ?;
237+ self . stack . push ( result) ;
238+ self . ip += 1 ;
239+ } ,
240+
241+ ByteCode :: NotEqual => {
242+ let b = self . stack . pop ( ) . ok_or ( "栈为空,无法执行比较" ) ?;
243+ let a = self . stack . pop ( ) . ok_or ( "栈为空,无法执行比较" ) ?;
244+
245+ let result = self . not_equal_values ( a, b) ?;
246+ self . stack . push ( result) ;
247+ self . ip += 1 ;
248+ } ,
249+
250+ ByteCode :: Less => {
251+ let b = self . stack . pop ( ) . ok_or ( "栈为空,无法执行比较" ) ?;
252+ let a = self . stack . pop ( ) . ok_or ( "栈为空,无法执行比较" ) ?;
253+
254+ let result = self . less_values ( a, b) ?;
255+ self . stack . push ( result) ;
256+ self . ip += 1 ;
257+ } ,
195258
196259 ByteCode :: JumpIfFalse ( addr) => {
197260 let condition = self . stack . pop ( )
@@ -218,11 +281,24 @@ impl VM {
218281
219282 // 根据函数索引查找函数
220283 let program = self . program . as_ref ( ) . ok_or ( "没有加载程序" ) ?;
221- let function_name = match func_index {
222- 0 => "main" ,
223- 1 => "fib" ,
224- _ => return Err ( format ! ( "未知函数索引: {}" , func_index) ) ,
225- } ;
284+
285+ // 通过索引查找函数名
286+ let function_name = program. functions . iter ( )
287+ . find ( |( _, func) | {
288+ // 简单的索引映射:main=0, 其他按字母顺序
289+ if func. name == "main" {
290+ * func_index == 0
291+ } else {
292+ // 为其他函数分配索引(这里简化处理)
293+ match func. name . as_str ( ) {
294+ "fibonacci" => * func_index == 1 ,
295+ "fib" => * func_index == 1 ,
296+ _ => false ,
297+ }
298+ }
299+ } )
300+ . map ( |( name, _) | name. as_str ( ) )
301+ . ok_or ( format ! ( "未知函数索引: {}" , func_index) ) ?;
226302
227303 let function = program. functions . get ( function_name)
228304 . ok_or ( format ! ( "找不到函数: {}" , function_name) ) ?
@@ -253,6 +329,49 @@ impl VM {
253329 self . ip = 0 ;
254330 } ,
255331
332+ ByteCode :: CallLibrary ( lib_name, func_name, argc) => {
333+ // 从栈中获取参数
334+ let mut args = Vec :: new ( ) ;
335+ for _ in 0 ..* argc {
336+ args. push ( self . stack . pop ( ) . ok_or ( "栈为空,无法获取库函数参数" ) ?) ;
337+ }
338+ args. reverse ( ) ; // 恢复参数顺序
339+
340+ // 将参数转换为字符串
341+ let string_args: Vec < String > = args. iter ( )
342+ . map ( |v| self . value_to_string ( v) )
343+ . collect ( ) ;
344+
345+ if self . debug_mode {
346+ println ! ( "🚀 VM: 调用库函数 {}::{} 参数: {:?}" , lib_name, func_name, string_args) ;
347+ }
348+
349+ // 调用库函数
350+ match crate :: interpreter:: library_loader:: call_library_function ( lib_name, func_name, string_args) {
351+ Ok ( result_str) => {
352+ // 尝试将结果转换为适当的值类型
353+ let result_value = if let Ok ( int_val) = result_str. parse :: < i32 > ( ) {
354+ Value :: Int ( int_val)
355+ } else if let Ok ( float_val) = result_str. parse :: < f64 > ( ) {
356+ Value :: Float ( float_val)
357+ } else if result_str == "true" {
358+ Value :: Bool ( true )
359+ } else if result_str == "false" {
360+ Value :: Bool ( false )
361+ } else {
362+ Value :: String ( result_str)
363+ } ;
364+
365+ // 将结果压入栈
366+ self . stack . push ( result_value) ;
367+ self . ip += 1 ;
368+ } ,
369+ Err ( err) => {
370+ return Err ( format ! ( "库函数调用失败: {}" , err) ) ;
371+ }
372+ }
373+ } ,
374+
256375 ByteCode :: Return => {
257376 let return_value = if self . stack . len ( ) > 0 {
258377 self . stack . pop ( ) . unwrap_or ( Value :: None )
@@ -328,6 +447,52 @@ impl VM {
328447 }
329448 }
330449
450+ /// 值相乘
451+ fn mul_values ( & self , a : Value , b : Value ) -> Result < Value , String > {
452+ match ( & a, & b) {
453+ ( Value :: Int ( a) , Value :: Int ( b) ) => Ok ( Value :: Int ( a * b) ) ,
454+ ( Value :: Float ( a) , Value :: Float ( b) ) => Ok ( Value :: Float ( a * b) ) ,
455+ ( Value :: Int ( a) , Value :: Float ( b) ) => Ok ( Value :: Float ( * a as f64 * b) ) ,
456+ ( Value :: Float ( a) , Value :: Int ( b) ) => Ok ( Value :: Float ( a * * b as f64 ) ) ,
457+ _ => Err ( format ! ( "无法对 {:?} 和 {:?} 执行乘法" , a, b) ) ,
458+ }
459+ }
460+
461+ /// 值相除
462+ fn div_values ( & self , a : Value , b : Value ) -> Result < Value , String > {
463+ match ( & a, & b) {
464+ ( Value :: Int ( a) , Value :: Int ( b) ) => {
465+ if * b == 0 {
466+ Err ( "除零错误" . to_string ( ) )
467+ } else {
468+ Ok ( Value :: Int ( a / b) )
469+ }
470+ } ,
471+ ( Value :: Float ( a) , Value :: Float ( b) ) => {
472+ if * b == 0.0 {
473+ Err ( "除零错误" . to_string ( ) )
474+ } else {
475+ Ok ( Value :: Float ( a / b) )
476+ }
477+ } ,
478+ ( Value :: Int ( a) , Value :: Float ( b) ) => {
479+ if * b == 0.0 {
480+ Err ( "除零错误" . to_string ( ) )
481+ } else {
482+ Ok ( Value :: Float ( * a as f64 / b) )
483+ }
484+ } ,
485+ ( Value :: Float ( a) , Value :: Int ( b) ) => {
486+ if * b == 0 {
487+ Err ( "除零错误" . to_string ( ) )
488+ } else {
489+ Ok ( Value :: Float ( a / * b as f64 ) )
490+ }
491+ } ,
492+ _ => Err ( format ! ( "无法对 {:?} 和 {:?} 执行除法" , a, b) ) ,
493+ }
494+ }
495+
331496 /// 小于等于比较
332497 fn less_equal_values ( & self , a : Value , b : Value ) -> Result < Value , String > {
333498 match ( & a, & b) {
@@ -339,6 +504,61 @@ impl VM {
339504 }
340505 }
341506
507+ /// 大于比较
508+ fn greater_values ( & self , a : Value , b : Value ) -> Result < Value , String > {
509+ match ( & a, & b) {
510+ ( Value :: Int ( a) , Value :: Int ( b) ) => Ok ( Value :: Bool ( a > b) ) ,
511+ ( Value :: Float ( a) , Value :: Float ( b) ) => Ok ( Value :: Bool ( a > b) ) ,
512+ ( Value :: Int ( a) , Value :: Float ( b) ) => Ok ( Value :: Bool ( ( * a as f64 ) > * b) ) ,
513+ ( Value :: Float ( a) , Value :: Int ( b) ) => Ok ( Value :: Bool ( * a > ( * b as f64 ) ) ) ,
514+ _ => Err ( format ! ( "无法对 {:?} 和 {:?} 执行比较" , a, b) ) ,
515+ }
516+ }
517+
518+ /// 大于等于比较
519+ fn greater_equal_values ( & self , a : Value , b : Value ) -> Result < Value , String > {
520+ match ( & a, & b) {
521+ ( Value :: Int ( a) , Value :: Int ( b) ) => Ok ( Value :: Bool ( a >= b) ) ,
522+ ( Value :: Float ( a) , Value :: Float ( b) ) => Ok ( Value :: Bool ( a >= b) ) ,
523+ ( Value :: Int ( a) , Value :: Float ( b) ) => Ok ( Value :: Bool ( ( * a as f64 ) >= * b) ) ,
524+ ( Value :: Float ( a) , Value :: Int ( b) ) => Ok ( Value :: Bool ( * a >= ( * b as f64 ) ) ) ,
525+ _ => Err ( format ! ( "无法对 {:?} 和 {:?} 执行比较" , a, b) ) ,
526+ }
527+ }
528+
529+ /// 等于比较
530+ fn equal_values ( & self , a : Value , b : Value ) -> Result < Value , String > {
531+ match ( & a, & b) {
532+ ( Value :: Int ( a) , Value :: Int ( b) ) => Ok ( Value :: Bool ( a == b) ) ,
533+ ( Value :: Float ( a) , Value :: Float ( b) ) => Ok ( Value :: Bool ( a == b) ) ,
534+ ( Value :: Int ( a) , Value :: Float ( b) ) => Ok ( Value :: Bool ( ( * a as f64 ) == * b) ) ,
535+ ( Value :: Float ( a) , Value :: Int ( b) ) => Ok ( Value :: Bool ( * a == ( * b as f64 ) ) ) ,
536+ ( Value :: Bool ( a) , Value :: Bool ( b) ) => Ok ( Value :: Bool ( a == b) ) ,
537+ ( Value :: String ( a) , Value :: String ( b) ) => Ok ( Value :: Bool ( a == b) ) ,
538+ _ => Ok ( Value :: Bool ( false ) ) , // 不同类型默认不相等
539+ }
540+ }
541+
542+ /// 不等于比较
543+ fn not_equal_values ( & self , a : Value , b : Value ) -> Result < Value , String > {
544+ let equal_result = self . equal_values ( a, b) ?;
545+ match equal_result {
546+ Value :: Bool ( b) => Ok ( Value :: Bool ( !b) ) ,
547+ _ => Err ( "等于比较返回了非布尔值" . to_string ( ) ) ,
548+ }
549+ }
550+
551+ /// 小于比较
552+ fn less_values ( & self , a : Value , b : Value ) -> Result < Value , String > {
553+ match ( & a, & b) {
554+ ( Value :: Int ( a) , Value :: Int ( b) ) => Ok ( Value :: Bool ( a < b) ) ,
555+ ( Value :: Float ( a) , Value :: Float ( b) ) => Ok ( Value :: Bool ( a < b) ) ,
556+ ( Value :: Int ( a) , Value :: Float ( b) ) => Ok ( Value :: Bool ( ( * a as f64 ) < * b) ) ,
557+ ( Value :: Float ( a) , Value :: Int ( b) ) => Ok ( Value :: Bool ( * a < ( * b as f64 ) ) ) ,
558+ _ => Err ( format ! ( "无法对 {:?} 和 {:?} 执行比较" , a, b) ) ,
559+ }
560+ }
561+
342562 /// 检查值是否为假
343563 fn is_falsy ( & self , value : & Value ) -> bool {
344564 match value {
0 commit comments