1- use std:: collections:: HashMap ;
21use cranelift:: prelude:: * ;
32use num_traits:: cast:: ToPrimitive ;
43use rustpython_bytecode:: bytecode:: { BinaryOperator , Constant , Instruction , NameScope } ;
4+ use std:: collections:: HashMap ;
55
66use super :: JITCompileError ;
77
88pub struct FunctionCompiler < ' a , ' b > {
99 builder : & ' a mut FunctionBuilder < ' b > ,
1010 stack : Vec < Value > ,
11- variables : HashMap < String , Variable >
11+ variables : HashMap < String , Variable > ,
1212}
1313
1414impl < ' a , ' b > FunctionCompiler < ' a , ' b > {
1515 pub fn new ( builder : & ' a mut FunctionBuilder < ' b > ) -> FunctionCompiler < ' a , ' b > {
1616 FunctionCompiler {
1717 builder,
1818 stack : Vec :: new ( ) ,
19- variables : HashMap :: new ( )
19+ variables : HashMap :: new ( ) ,
2020 }
2121 }
2222
2323 pub fn add_instruction ( & mut self , instruction : & Instruction ) -> Result < ( ) , JITCompileError > {
2424 match instruction {
2525 Instruction :: LoadName {
2626 name,
27- scope : NameScope :: Local
27+ scope : NameScope :: Local ,
2828 } => {
29- let var = self . variables . get ( name) . ok_or ( JITCompileError :: BadBytecode ) ?;
29+ let var = self
30+ . variables
31+ . get ( name)
32+ . ok_or ( JITCompileError :: BadBytecode ) ?;
3033 self . stack . push ( self . builder . use_var ( * var) ) ;
3134 Ok ( ( ) )
3235 }
3336 Instruction :: StoreName {
3437 name,
35- scope : NameScope :: Local
38+ scope : NameScope :: Local ,
3639 } => {
3740 let var = match self . variables . get ( name) {
3841 Some ( var) => * var,
@@ -43,7 +46,8 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
4346 var
4447 }
4548 } ;
46- self . builder . def_var ( var, self . stack . pop ( ) . ok_or ( JITCompileError :: BadBytecode ) ?) ;
49+ self . builder
50+ . def_var ( var, self . stack . pop ( ) . ok_or ( JITCompileError :: BadBytecode ) ?) ;
4751 Ok ( ( ) )
4852 }
4953 Instruction :: LoadConst {
@@ -62,22 +66,27 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
6266 . return_ ( & [ self . stack . pop ( ) . ok_or ( JITCompileError :: BadBytecode ) ?] ) ;
6367 Ok ( ( ) )
6468 }
65- Instruction :: BinaryOperation {
66- op,
67- ..
68- } => {
69+ Instruction :: BinaryOperation { op, .. } => {
6970 let a = self . stack . pop ( ) . ok_or ( JITCompileError :: BadBytecode ) ?;
7071 let b = self . stack . pop ( ) . ok_or ( JITCompileError :: BadBytecode ) ?;
7172 match op {
7273 BinaryOperator :: Add => {
7374 let ( out, carry) = self . builder . ins ( ) . iadd_ifcout ( a, b) ;
74- self . builder . ins ( ) . trapif ( IntCC :: Overflow , carry, TrapCode :: IntegerOverflow ) ;
75+ self . builder . ins ( ) . trapif (
76+ IntCC :: Overflow ,
77+ carry,
78+ TrapCode :: IntegerOverflow ,
79+ ) ;
7580 self . stack . push ( out) ;
7681 Ok ( ( ) )
7782 }
7883 BinaryOperator :: Subtract => {
7984 let ( out, carry) = self . builder . ins ( ) . isub_ifbout ( a, b) ;
80- self . builder . ins ( ) . trapif ( IntCC :: Overflow , carry, TrapCode :: IntegerOverflow ) ;
85+ self . builder . ins ( ) . trapif (
86+ IntCC :: Overflow ,
87+ carry,
88+ TrapCode :: IntegerOverflow ,
89+ ) ;
8190 self . stack . push ( out) ;
8291 Ok ( ( ) )
8392 }
0 commit comments