@@ -10,7 +10,6 @@ use num_complex::Complex64;
10
10
use rustpython_parser:: { ast, parser} ;
11
11
12
12
use crate :: obj:: objlist:: PyListRef ;
13
- use crate :: obj:: objstr:: PyStringRef ;
14
13
use crate :: obj:: objtype:: PyClassRef ;
15
14
use crate :: pyobject:: { PyObjectRef , PyRef , PyResult , PyValue } ;
16
15
use crate :: vm:: VirtualMachine ;
@@ -19,9 +18,12 @@ use crate::vm::VirtualMachine;
19
18
struct AstNode ;
20
19
type AstNodeRef = PyRef < AstNode > ;
21
20
21
+ const MODULE_NAME : & str = "_ast" ;
22
+ pub const PY_COMPILE_FLAG_AST_ONLY : i32 = 0x0400 ;
23
+
22
24
impl PyValue for AstNode {
23
25
fn class ( vm : & VirtualMachine ) -> PyClassRef {
24
- vm. class ( "ast" , "AST" )
26
+ vm. class ( MODULE_NAME , "AST" )
25
27
}
26
28
}
27
29
@@ -48,14 +50,16 @@ macro_rules! node {
48
50
}
49
51
}
50
52
51
- fn program_to_ast ( vm : & VirtualMachine , program : & ast:: Program ) -> PyResult < AstNodeRef > {
52
- let py_body = statements_to_ast ( vm, & program. statements ) ?;
53
- Ok ( node ! ( vm, Module , { body => py_body } ) )
53
+ pub ( crate ) fn source_to_ast ( vm : & VirtualMachine , source : & str ) -> PyResult {
54
+ let internal_ast =
55
+ parser:: parse_program ( source) . map_err ( |err| vm. new_value_error ( format ! ( "{}" , err) ) ) ?;
56
+ let py_body = statements_to_ast ( vm, & internal_ast. statements ) ?;
57
+ Ok ( node ! ( vm, Module , { body => py_body } ) . into_object ( ) )
54
58
}
55
59
56
60
// Create a node class instance
57
61
fn create_node ( vm : & VirtualMachine , name : & str ) -> PyResult < AstNodeRef > {
58
- AstNode . into_ref_with_type ( vm, vm. class ( "ast" , name) )
62
+ AstNode . into_ref_with_type ( vm, vm. class ( MODULE_NAME , name) )
59
63
}
60
64
61
65
fn statements_to_ast ( vm : & VirtualMachine , statements : & [ ast:: Statement ] ) -> PyResult < PyListRef > {
@@ -630,20 +634,11 @@ fn string_to_ast(vm: &VirtualMachine, string: &ast::StringGroup) -> PyResult<Ast
630
634
Ok ( string)
631
635
}
632
636
633
- fn ast_parse ( source : PyStringRef , vm : & VirtualMachine ) -> PyResult < AstNodeRef > {
634
- let internal_ast = parser:: parse_program ( source. as_str ( ) )
635
- . map_err ( |err| vm. new_value_error ( format ! ( "{}" , err) ) ) ?;
636
- // source.clone();
637
- program_to_ast ( & vm, & internal_ast)
638
- }
639
-
640
- #[ allow( clippy:: cognitive_complexity) ]
641
637
pub fn make_module ( vm : & VirtualMachine ) -> PyObjectRef {
642
638
let ctx = & vm. ctx ;
643
639
644
640
let ast_base = py_class ! ( ctx, "AST" , ctx. object( ) , { } ) ;
645
- py_module ! ( vm, "ast" , {
646
- "parse" => ctx. new_rustfunc( ast_parse) ,
641
+ py_module ! ( vm, MODULE_NAME , {
647
642
"AST" => ast_base. clone( ) ,
648
643
// TODO: There's got to be a better way!
649
644
"alias" => py_class!( ctx, "alias" , ast_base. clone( ) , { } ) ,
@@ -709,5 +704,6 @@ pub fn make_module(vm: &VirtualMachine) -> PyObjectRef {
709
704
"withitem" => py_class!( ctx, "withitem" , ast_base. clone( ) , { } ) ,
710
705
"Yield" => py_class!( ctx, "Yield" , ast_base. clone( ) , { } ) ,
711
706
"YieldFrom" => py_class!( ctx, "YieldFrom" , ast_base. clone( ) , { } ) ,
707
+ "PyCF_ONLY_AST" => ctx. new_int( PY_COMPILE_FLAG_AST_ONLY ) ,
712
708
} )
713
709
}
0 commit comments