33//! This module is responsible for generating bytecode from AST nodes.
44
55use oak_python:: ast:: {
6- BinaryOperator , BoolOperator , CompareOperator as ComparisonOperator , Comprehension , ExceptHandler , Expression , Keyword ,
7- Literal , Parameter , Pattern , Statement , UnaryOperator ,
6+ AugmentedOperator , BinaryOperator , BoolOperator , CompareOperator as ComparisonOperator , Comprehension , ExceptHandler , Expression , ImportName , Keyword ,
7+ Literal , Parameter , Statement , Type , UnaryOperator , WithItem ,
88} ;
99use python_types:: PythonResult ;
1010use smallvec:: SmallVec ;
@@ -162,7 +162,7 @@ impl CodeGenerator {
162162 self . generate_if ( Box :: new ( test) , body, orelse) ?;
163163 }
164164 Statement :: For { target, iter, body, orelse } => {
165- self . generate_for ( Box :: new ( target) , Box :: new ( iter) , body, orelse) ?;
165+ self . generate_for ( target, iter, body, orelse) ?;
166166 }
167167 Statement :: While { test, body, orelse } => {
168168 self . generate_while ( Box :: new ( test) , body, orelse) ?;
@@ -171,17 +171,10 @@ impl CodeGenerator {
171171 self . generate_try ( body, handlers, orelse, finalbody) ?;
172172 }
173173 Statement :: With { items, body } => {
174- let items = items. into_iter ( ) . map ( |item| ( item. context_expr , item. optional_vars . map ( Box :: new) ) ) . collect ( ) ;
175174 self . generate_with ( items, body) ?;
176175 }
177176 Statement :: Return ( value) => {
178- self . generate_return ( value. map ( Box :: new) ) ?;
179- }
180- Statement :: Yield ( value) => {
181- self . generate_yield ( value) ?;
182- }
183- Statement :: YieldFrom ( value) => {
184- self . generate_yield_from ( value) ?;
177+ self . generate_return ( value) ?;
185178 }
186179 Statement :: Break => {
187180 self . instructions . push ( Instruction :: Break ) ;
@@ -199,11 +192,11 @@ impl CodeGenerator {
199192 self . generate_assert ( Box :: new ( test) , msg. map ( Box :: new) ) ?;
200193 }
201194 Statement :: Import { names } => {
202- let names = names. into_iter ( ) . map ( |name| ( name. name , name. asname ) ) . collect ( ) ;
195+ let names = names. into_iter ( ) . map ( |name| ( name. name , name. alias ) ) . collect ( ) ;
203196 self . generate_import ( names) ?;
204197 }
205- Statement :: ImportFrom { module, names, level : _ } => {
206- let names = names. into_iter ( ) . map ( |name| ( name. name , name. asname ) ) . collect ( ) ;
198+ Statement :: ImportFrom { module, names } => {
199+ let names = names. into_iter ( ) . map ( |name| ( name. name , name. alias ) ) . collect ( ) ;
207200 self . generate_import_from ( module, names, 0 ) ?;
208201 }
209202 Statement :: Global { names } => {
@@ -213,13 +206,12 @@ impl CodeGenerator {
213206 self . generate_nonlocal ( names) ?;
214207 }
215208 Statement :: Assignment { target, value } => {
216- self . generate_assign ( vec ! [ Pattern :: Value ( target) ] , Box :: new ( value) ) ?;
209+ self . generate_assign ( target, value) ?;
217210 }
218211 Statement :: AugmentedAssignment { target, operator, value } => {
219- self . generate_aug_assign ( Box :: new ( Pattern :: Value ( target) ) , operator, Box :: new ( value) ) ?;
212+ self . generate_aug_assign ( target, operator, value) ?;
220213 }
221214 Statement :: Delete { targets } => {
222- let targets = targets. into_iter ( ) . map ( Pattern :: Value ) . collect ( ) ;
223215 self . generate_del ( targets) ?;
224216 }
225217 Statement :: Expression ( value) => {
@@ -409,11 +401,12 @@ impl CodeGenerator {
409401 & mut self ,
410402 name : String ,
411403 parameters : Vec < Parameter > ,
412- return_type : Option < Box < Expression > > ,
404+ return_type : Option < Type > ,
413405 body : Vec < Statement > ,
414406 decorators : Vec < Expression > ,
415407 ) -> PythonResult < ( ) > {
416408 // TODO: Implement function definition
409+ let _ = ( name, parameters, return_type, body, decorators) ;
417410 Ok ( ( ) )
418411 }
419412
@@ -464,12 +457,13 @@ impl CodeGenerator {
464457 /// Generate bytecode for a for statement
465458 fn generate_for (
466459 & mut self ,
467- target : Box < Pattern > ,
468- iter : Box < Expression > ,
460+ target : Expression ,
461+ iter : Expression ,
469462 body : Vec < Statement > ,
470463 orelse : Vec < Statement > ,
471464 ) -> PythonResult < ( ) > {
472465 // TODO: Implement for loop
466+ let _ = ( target, iter, body, orelse) ;
473467 Ok ( ( ) )
474468 }
475469
@@ -492,15 +486,16 @@ impl CodeGenerator {
492486 }
493487
494488 /// Generate bytecode for a with statement
495- fn generate_with ( & mut self , items : Vec < ( Expression , Option < Pattern > ) > , body : Vec < Statement > ) -> PythonResult < ( ) > {
489+ fn generate_with ( & mut self , items : Vec < WithItem > , body : Vec < Statement > ) -> PythonResult < ( ) > {
496490 // TODO: Implement with statement
491+ let _ = ( items, body) ;
497492 Ok ( ( ) )
498493 }
499494
500495 /// Generate bytecode for a return statement
501- fn generate_return ( & mut self , value : Option < Box < Expression > > ) -> PythonResult < ( ) > {
496+ fn generate_return ( & mut self , value : Option < Expression > ) -> PythonResult < ( ) > {
502497 if let Some ( value) = value {
503- self . generate_expression ( * value) ?;
498+ self . generate_expression ( value) ?;
504499 }
505500 else {
506501 self . instructions . push ( Instruction :: PushNull ) ;
@@ -509,35 +504,18 @@ impl CodeGenerator {
509504 Ok ( ( ) )
510505 }
511506
512- /// Generate bytecode for a yield statement
513- fn generate_yield ( & mut self , value : Option < Box < Expression > > ) -> PythonResult < ( ) > {
514- if let Some ( value) = value {
515- self . generate_expression ( * value) ?;
516- }
517- else {
518- self . instructions . push ( Instruction :: PushNull ) ;
519- }
520- self . instructions . push ( Instruction :: Yield ) ;
521- Ok ( ( ) )
522- }
523-
524- /// Generate bytecode for a yield from statement
525- fn generate_yield_from ( & mut self , value : Box < Expression > ) -> PythonResult < ( ) > {
526- self . generate_expression ( * value) ?;
527- self . instructions . push ( Instruction :: YieldFrom ) ;
528- Ok ( ( ) )
529- }
530-
531507 /// Generate bytecode for a raise statement
532- fn generate_raise ( & mut self , exc : Option < Box < Expression > > , cause : Option < Box < Expression > > ) -> PythonResult < ( ) > {
508+ fn generate_raise ( & mut self , exc : Option < Expression > , cause : Option < Expression > ) -> PythonResult < ( ) > {
533509 // TODO: Implement raise statement
510+ let _ = ( exc, cause) ;
534511 self . instructions . push ( Instruction :: Raise ) ;
535512 Ok ( ( ) )
536513 }
537514
538515 /// Generate bytecode for an assert statement
539- fn generate_assert ( & mut self , test : Box < Expression > , msg : Option < Box < Expression > > ) -> PythonResult < ( ) > {
516+ fn generate_assert ( & mut self , test : Expression , msg : Option < Expression > ) -> PythonResult < ( ) > {
540517 // TODO: Implement assert statement
518+ let _ = ( test, msg) ;
541519 Ok ( ( ) )
542520 }
543521
@@ -571,20 +549,23 @@ impl CodeGenerator {
571549 }
572550
573551 /// Generate bytecode for an assign statement
574- fn generate_assign ( & mut self , targets : Vec < Pattern > , value : Box < Expression > ) -> PythonResult < ( ) > {
552+ fn generate_assign ( & mut self , target : Expression , value : Expression ) -> PythonResult < ( ) > {
575553 // TODO: Implement assign statement
554+ let _ = ( target, value) ;
576555 Ok ( ( ) )
577556 }
578557
579558 /// Generate bytecode for an augmented assign statement
580- fn generate_aug_assign ( & mut self , target : Box < Pattern > , op : BinaryOperator , value : Box < Expression > ) -> PythonResult < ( ) > {
559+ fn generate_aug_assign ( & mut self , target : Expression , op : AugmentedOperator , value : Expression ) -> PythonResult < ( ) > {
581560 // TODO: Implement augmented assign statement
561+ let _ = ( target, op, value) ;
582562 Ok ( ( ) )
583563 }
584564
585565 /// Generate bytecode for a del statement
586- fn generate_del ( & mut self , targets : Vec < Pattern > ) -> PythonResult < ( ) > {
566+ fn generate_del ( & mut self , targets : Vec < Expression > ) -> PythonResult < ( ) > {
587567 // TODO: Implement del statement
568+ let _ = targets;
588569 Ok ( ( ) )
589570 }
590571
0 commit comments