@@ -11,7 +11,7 @@ use rustpython_parser::{ast, mode::Mode, parser};
1111
1212use crate :: obj:: objlist:: PyListRef ;
1313use crate :: obj:: objtype:: PyClassRef ;
14- use crate :: pyobject:: { PyObjectRef , PyRef , PyResult , PyValue } ;
14+ use crate :: pyobject:: { IntoPyObject , PyObjectRef , PyRef , PyResult , PyValue } ;
1515use crate :: slots:: PyTpFlags ;
1616use crate :: vm:: VirtualMachine ;
1717
@@ -204,7 +204,7 @@ fn statement_to_ast(vm: &VirtualMachine, statement: &ast::Statement) -> PyResult
204204 names,
205205 } => node ! ( vm, ImportFrom , {
206206 level => vm. ctx. new_int( * level) ,
207- module => optional_string_to_py_obj ( vm , module ) ,
207+ module => module . as_ref ( ) . into_pyobject ( vm ) ,
208208 names => map_ast( alias_to_ast, vm, names) ?
209209 } ) ,
210210 Nonlocal { names } => node ! ( vm, Nonlocal , {
@@ -247,7 +247,7 @@ fn statement_to_ast(vm: &VirtualMachine, statement: &ast::Statement) -> PyResult
247247fn alias_to_ast ( vm : & VirtualMachine , alias : & ast:: ImportSymbol ) -> PyResult < AstNodeRef > {
248248 Ok ( node ! ( vm, alias, {
249249 name => vm. ctx. new_str( & alias. symbol) ,
250- asname => optional_string_to_py_obj ( vm , & alias. alias)
250+ asname => alias. alias. as_ref ( ) . into_pyobject ( vm ) ,
251251 } ) )
252252}
253253
@@ -274,7 +274,7 @@ fn with_item_to_ast(vm: &VirtualMachine, with_item: &ast::WithItem) -> PyResult<
274274fn handler_to_ast ( vm : & VirtualMachine , handler : & ast:: ExceptHandler ) -> PyResult < AstNodeRef > {
275275 let node = node ! ( vm, ExceptHandler , {
276276 typ => optional_expression_to_ast( vm, & handler. typ) ?,
277- name => optional_string_to_py_obj ( vm , & handler. name) ,
277+ name => handler. name. as_ref ( ) . into_pyobject ( vm ) ,
278278 body => statements_to_ast( vm, & handler. body) ?,
279279 } ) ;
280280 Ok ( node)
@@ -297,12 +297,11 @@ fn optional_expressions_to_ast(
297297}
298298
299299fn optional_expression_to_ast ( vm : & VirtualMachine , value : & Option < ast:: Expression > ) -> PyResult {
300- let value = if let Some ( value) = value {
301- expression_to_ast ( vm, value) ?. into_object ( )
302- } else {
303- vm. ctx . none ( )
304- } ;
305- Ok ( value)
300+ let ast = value
301+ . as_ref ( )
302+ . map ( |expr| expression_to_ast ( vm, expr) )
303+ . transpose ( ) ?;
304+ Ok ( ast. into_pyobject ( vm) )
306305}
307306
308307fn expressions_to_ast ( vm : & VirtualMachine , expressions : & [ ast:: Expression ] ) -> PyResult < PyListRef > {
@@ -439,11 +438,8 @@ fn expression_to_ast(vm: &VirtualMachine, expression: &ast::Expression) -> PyRes
439438 let mut keys = Vec :: new ( ) ;
440439 let mut values = Vec :: new ( ) ;
441440 for ( k, v) in elements {
442- if let Some ( k) = k {
443- keys. push ( expression_to_ast ( vm, k) ?. into_object ( ) ) ;
444- } else {
445- keys. push ( vm. ctx . none ( ) ) ;
446- }
441+ let k = k. as_ref ( ) . map ( |k| expression_to_ast ( vm, k) ) . transpose ( ) ?;
442+ keys. push ( k. into_pyobject ( vm) ) ;
447443 values. push ( expression_to_ast ( vm, v) ?. into_object ( ) ) ;
448444 }
449445
@@ -484,13 +480,12 @@ fn expression_to_ast(vm: &VirtualMachine, expression: &ast::Expression) -> PyRes
484480 } )
485481 }
486482 Yield { value } => {
487- let py_value = if let Some ( value) = value {
488- expression_to_ast ( vm, value) ?. into_object ( )
489- } else {
490- vm. ctx . none ( )
491- } ;
483+ let py_value = value
484+ . as_ref ( )
485+ . map ( |v| expression_to_ast ( vm, v) )
486+ . transpose ( ) ?;
492487 node ! ( vm, Yield , {
493- value => py_value
488+ value => py_value. into_pyobject ( vm )
494489 } )
495490 }
496491 YieldFrom { value } => {
@@ -567,12 +562,12 @@ fn vararg_to_ast(vm: &VirtualMachine, vararg: &ast::Varargs) -> PyResult {
567562}
568563
569564fn parameter_to_ast ( vm : & VirtualMachine , parameter : & ast:: Parameter ) -> PyResult < AstNodeRef > {
570- let py_annotation = if let Some ( annotation ) = & parameter. annotation {
571- expression_to_ast ( vm , annotation ) ? . into_object ( )
572- } else {
573- vm . ctx . none ( )
574- } ;
575-
565+ let py_annotation = parameter
566+ . annotation
567+ . as_ref ( )
568+ . map ( |expr| expression_to_ast ( vm , expr ) )
569+ . transpose ( ) ?
570+ . into_pyobject ( vm ) ;
576571 let py_node = node ! ( vm, arg, {
577572 arg => vm. ctx. new_str( & parameter. arg) ,
578573 annotation => py_annotation
@@ -584,17 +579,9 @@ fn parameter_to_ast(vm: &VirtualMachine, parameter: &ast::Parameter) -> PyResult
584579 Ok ( py_node)
585580}
586581
587- fn optional_string_to_py_obj ( vm : & VirtualMachine , name : & Option < String > ) -> PyObjectRef {
588- if let Some ( name) = name {
589- vm. ctx . new_str ( name)
590- } else {
591- vm. ctx . none ( )
592- }
593- }
594-
595582fn keyword_to_ast ( vm : & VirtualMachine , keyword : & ast:: Keyword ) -> PyResult < AstNodeRef > {
596583 Ok ( node ! ( vm, keyword, {
597- arg => optional_string_to_py_obj ( vm , & keyword. name) ,
584+ arg => keyword. name. as_ref ( ) . into_pyobject ( vm ) ,
598585 value => expression_to_ast( vm, & keyword. value) ?
599586 } ) )
600587}
0 commit comments