@@ -9,11 +9,10 @@ use num_complex::Complex64;
9
9
10
10
use rustpython_parser:: { ast, parser} ;
11
11
12
- use crate :: function:: PyFuncArgs ;
13
12
use crate :: obj:: objlist:: PyListRef ;
14
- use crate :: obj:: objstr;
13
+ use crate :: obj:: objstr:: PyStringRef ;
15
14
use crate :: obj:: objtype:: PyClassRef ;
16
- use crate :: pyobject:: { PyObject , PyObjectRef , PyRef , PyResult , PyValue , TypeProtocol } ;
15
+ use crate :: pyobject:: { PyObjectRef , PyRef , PyResult , PyValue } ;
17
16
use crate :: vm:: VirtualMachine ;
18
17
19
18
#[ derive( Debug ) ]
@@ -26,28 +25,12 @@ impl PyValue for AstNode {
26
25
}
27
26
}
28
27
29
- /*
30
- * Idea: maybe we can create a sort of struct with some helper functions?
31
- struct AstToPyAst {
32
- ctx: &PyContext,
33
- }
34
-
35
- impl AstToPyAst {
36
- fn new(ctx: &PyContext) -> Self {
37
- AstToPyAst {
38
- ctx: ctx,
39
- }
40
- }
41
-
42
- }
43
- */
44
-
45
28
macro_rules! node {
46
29
( $vm: expr, $node_name: ident, { $( $attr_name: ident => $attr_value: expr) ,* $( , ) * } ) => {
47
30
{
48
31
let node = create_node( $vm, stringify!( $node_name) ) ;
49
32
$(
50
- $vm. set_attr( & node, stringify!( $attr_name) , $attr_value) . unwrap( ) ;
33
+ $vm. set_attr( node. as_object ( ) , stringify!( $attr_name) , $attr_value) . unwrap( ) ;
51
34
) *
52
35
node
53
36
}
@@ -57,25 +40,27 @@ macro_rules! node {
57
40
}
58
41
}
59
42
60
- fn program_to_ast ( vm : & VirtualMachine , program : & ast:: Program ) -> PyObjectRef {
43
+ fn program_to_ast ( vm : & VirtualMachine , program : & ast:: Program ) -> AstNodeRef {
61
44
let py_body = statements_to_ast ( vm, & program. statements ) ;
62
45
node ! ( vm, Module , { body => py_body } )
63
46
}
64
47
65
48
// Create a node class instance
66
- fn create_node ( vm : & VirtualMachine , name : & str ) -> PyObjectRef {
67
- PyObject :: new ( AstNode , vm. class ( "ast" , name) , Some ( vm. ctx . new_dict ( ) ) )
49
+ fn create_node ( vm : & VirtualMachine , name : & str ) -> AstNodeRef {
50
+ AstNode
51
+ . into_ref_with_type ( vm, vm. class ( "ast" , name) )
52
+ . unwrap ( )
68
53
}
69
54
70
55
fn statements_to_ast ( vm : & VirtualMachine , statements : & [ ast:: LocatedStatement ] ) -> PyListRef {
71
56
let body = statements
72
57
. iter ( )
73
- . map ( |statement| statement_to_ast ( & vm, statement) )
58
+ . map ( |statement| statement_to_ast ( & vm, statement) . into_object ( ) )
74
59
. collect ( ) ;
75
60
vm. ctx . new_list ( body) . downcast ( ) . unwrap ( )
76
61
}
77
62
78
- fn statement_to_ast ( vm : & VirtualMachine , statement : & ast:: LocatedStatement ) -> PyObjectRef {
63
+ fn statement_to_ast ( vm : & VirtualMachine , statement : & ast:: LocatedStatement ) -> AstNodeRef {
79
64
let node = match & statement. node {
80
65
ast:: Statement :: ClassDef {
81
66
name,
@@ -95,7 +80,7 @@ fn statement_to_ast(vm: &VirtualMachine, statement: &ast::LocatedStatement) -> P
95
80
returns,
96
81
} => {
97
82
let py_returns = if let Some ( hint) = returns {
98
- expression_to_ast ( vm, hint)
83
+ expression_to_ast ( vm, hint) . into_object ( )
99
84
} else {
100
85
vm. ctx . none ( )
101
86
} ;
@@ -112,7 +97,7 @@ fn statement_to_ast(vm: &VirtualMachine, statement: &ast::LocatedStatement) -> P
112
97
ast:: Statement :: Pass => node ! ( vm, Pass ) ,
113
98
ast:: Statement :: Assert { test, msg } => {
114
99
let py_msg = match msg {
115
- Some ( msg) => expression_to_ast ( vm, msg) ,
100
+ Some ( msg) => expression_to_ast ( vm, msg) . into_object ( ) ,
116
101
None => vm. ctx . none ( ) ,
117
102
} ;
118
103
node ! ( vm, Assert , {
@@ -121,15 +106,18 @@ fn statement_to_ast(vm: &VirtualMachine, statement: &ast::LocatedStatement) -> P
121
106
} )
122
107
}
123
108
ast:: Statement :: Delete { targets } => {
124
- let py_targets = vm
125
- . ctx
126
- . new_tuple ( targets. iter ( ) . map ( |v| expression_to_ast ( vm, v) ) . collect ( ) ) ;
109
+ let py_targets = vm. ctx . new_tuple (
110
+ targets
111
+ . iter ( )
112
+ . map ( |v| expression_to_ast ( vm, v) . into_object ( ) )
113
+ . collect ( ) ,
114
+ ) ;
127
115
128
116
node ! ( vm, Delete , { targets => py_targets } )
129
117
}
130
118
ast:: Statement :: Return { value } => {
131
119
let py_value = if let Some ( value) = value {
132
- expression_to_ast ( vm, value)
120
+ expression_to_ast ( vm, value) . into_object ( )
133
121
} else {
134
122
vm. ctx . none ( )
135
123
} ;
@@ -181,20 +169,20 @@ fn statement_to_ast(vm: &VirtualMachine, statement: &ast::LocatedStatement) -> P
181
169
182
170
// set lineno on node:
183
171
let lineno = vm. ctx . new_int ( statement. location . get_row ( ) ) ;
184
- vm. set_attr ( & node, "lineno" , lineno) . unwrap ( ) ;
172
+ vm. set_attr ( node. as_object ( ) , "lineno" , lineno) . unwrap ( ) ;
185
173
186
174
node
187
175
}
188
176
189
177
fn expressions_to_ast ( vm : & VirtualMachine , expressions : & [ ast:: Expression ] ) -> PyListRef {
190
178
let py_expression_nodes = expressions
191
179
. iter ( )
192
- . map ( |expression| expression_to_ast ( vm, expression) )
180
+ . map ( |expression| expression_to_ast ( vm, expression) . into_object ( ) )
193
181
. collect ( ) ;
194
182
vm. ctx . new_list ( py_expression_nodes) . downcast ( ) . unwrap ( )
195
183
}
196
184
197
- fn expression_to_ast ( vm : & VirtualMachine , expression : & ast:: Expression ) -> PyObjectRef {
185
+ fn expression_to_ast ( vm : & VirtualMachine , expression : & ast:: Expression ) -> AstNodeRef {
198
186
let node = match & expression {
199
187
ast:: Expression :: Call { function, args, .. } => node ! ( vm, Call , {
200
188
func => expression_to_ast( vm, function) ,
@@ -237,8 +225,8 @@ fn expression_to_ast(vm: &VirtualMachine, expression: &ast::Expression) -> PyObj
237
225
}
238
226
ast:: Expression :: BoolOp { a, op, b } => {
239
227
// Attach values:
240
- let py_a = expression_to_ast ( vm, a) ;
241
- let py_b = expression_to_ast ( vm, b) ;
228
+ let py_a = expression_to_ast ( vm, a) . into_object ( ) ;
229
+ let py_b = expression_to_ast ( vm, b) . into_object ( ) ;
242
230
let py_values = vm. ctx . new_tuple ( vec ! [ py_a, py_b] ) ;
243
231
244
232
let str_op = match op {
@@ -277,7 +265,7 @@ fn expression_to_ast(vm: &VirtualMachine, expression: &ast::Expression) -> PyObj
277
265
let py_b = vm. ctx . new_list (
278
266
vals. iter ( )
279
267
. skip ( 1 )
280
- . map ( |x| expression_to_ast ( vm, x) )
268
+ . map ( |x| expression_to_ast ( vm, x) . into_object ( ) )
281
269
. collect ( ) ,
282
270
) ;
283
271
node ! ( vm, Compare , {
@@ -333,8 +321,8 @@ fn expression_to_ast(vm: &VirtualMachine, expression: &ast::Expression) -> PyObj
333
321
let mut keys = Vec :: new ( ) ;
334
322
let mut values = Vec :: new ( ) ;
335
323
for ( k, v) in elements {
336
- keys. push ( expression_to_ast ( vm, k) ) ;
337
- values. push ( expression_to_ast ( vm, v) ) ;
324
+ keys. push ( expression_to_ast ( vm, k) . into_object ( ) ) ;
325
+ values. push ( expression_to_ast ( vm, v) . into_object ( ) ) ;
338
326
}
339
327
340
328
node ! ( vm, Dict , {
@@ -345,7 +333,7 @@ fn expression_to_ast(vm: &VirtualMachine, expression: &ast::Expression) -> PyObj
345
333
ast:: Expression :: Comprehension { kind, generators } => {
346
334
let g = generators
347
335
. iter ( )
348
- . map ( |g| comprehension_to_ast ( vm, g) )
336
+ . map ( |g| comprehension_to_ast ( vm, g) . into_object ( ) )
349
337
. collect ( ) ;
350
338
let py_generators = vm. ctx . new_list ( g) ;
351
339
@@ -366,7 +354,7 @@ fn expression_to_ast(vm: &VirtualMachine, expression: &ast::Expression) -> PyObj
366
354
}
367
355
ast:: Expression :: Yield { value } => {
368
356
let py_value = match value {
369
- Some ( value) => expression_to_ast ( vm, value) ,
357
+ Some ( value) => expression_to_ast ( vm, value) . into_object ( ) ,
370
358
None => vm. ctx . none ( ) ,
371
359
} ;
372
360
node ! ( vm, Yield , {
@@ -401,22 +389,24 @@ fn expression_to_ast(vm: &VirtualMachine, expression: &ast::Expression) -> PyObj
401
389
402
390
// TODO: retrieve correct lineno:
403
391
let lineno = vm. ctx . new_int ( 1 ) ;
404
- vm. set_attr ( & node, "lineno" , lineno) . unwrap ( ) ;
405
-
392
+ vm. set_attr ( node. as_object ( ) , "lineno" , lineno) . unwrap ( ) ;
406
393
node
407
394
}
408
395
409
- fn parameters_to_ast ( vm : & VirtualMachine , args : & ast:: Parameters ) -> PyObjectRef {
410
- let args = vm
411
- . ctx
412
- . new_list ( args. args . iter ( ) . map ( |a| parameter_to_ast ( vm, a) ) . collect ( ) ) ;
396
+ fn parameters_to_ast ( vm : & VirtualMachine , args : & ast:: Parameters ) -> AstNodeRef {
397
+ let args = vm. ctx . new_list (
398
+ args. args
399
+ . iter ( )
400
+ . map ( |a| parameter_to_ast ( vm, a) . into_object ( ) )
401
+ . collect ( ) ,
402
+ ) ;
413
403
414
404
node ! ( vm, arguments, { args => args } )
415
405
}
416
406
417
- fn parameter_to_ast ( vm : & VirtualMachine , parameter : & ast:: Parameter ) -> PyObjectRef {
407
+ fn parameter_to_ast ( vm : & VirtualMachine , parameter : & ast:: Parameter ) -> AstNodeRef {
418
408
let py_annotation = if let Some ( annotation) = & parameter. annotation {
419
- expression_to_ast ( vm, annotation)
409
+ expression_to_ast ( vm, annotation) . into_object ( )
420
410
} else {
421
411
vm. ctx . none ( )
422
412
} ;
@@ -427,15 +417,15 @@ fn parameter_to_ast(vm: &VirtualMachine, parameter: &ast::Parameter) -> PyObject
427
417
} )
428
418
}
429
419
430
- fn comprehension_to_ast ( vm : & VirtualMachine , comprehension : & ast:: Comprehension ) -> PyObjectRef {
420
+ fn comprehension_to_ast ( vm : & VirtualMachine , comprehension : & ast:: Comprehension ) -> AstNodeRef {
431
421
node ! ( vm, comprehension, {
432
422
target => expression_to_ast( vm, & comprehension. target) ,
433
423
iter => expression_to_ast( vm, & comprehension. iter) ,
434
424
ifs => expressions_to_ast( vm, & comprehension. ifs) ,
435
425
} )
436
426
}
437
427
438
- fn string_to_ast ( vm : & VirtualMachine , string : & ast:: StringGroup ) -> PyObjectRef {
428
+ fn string_to_ast ( vm : & VirtualMachine , string : & ast:: StringGroup ) -> AstNodeRef {
439
429
match string {
440
430
ast:: StringGroup :: Constant { value } => {
441
431
node ! ( vm, Str , { s => vm. ctx. new_str( value. clone( ) ) } )
@@ -447,23 +437,19 @@ fn string_to_ast(vm: &VirtualMachine, string: &ast::StringGroup) -> PyObjectRef
447
437
let py_values = vm. ctx . new_list (
448
438
values
449
439
. iter ( )
450
- . map ( |value| string_to_ast ( vm, value) )
440
+ . map ( |value| string_to_ast ( vm, value) . into_object ( ) )
451
441
. collect ( ) ,
452
442
) ;
453
443
node ! ( vm, JoinedStr , { values => py_values } )
454
444
}
455
445
}
456
446
}
457
447
458
- fn ast_parse ( vm : & VirtualMachine , args : PyFuncArgs ) -> PyResult {
459
- arg_check ! ( vm, args, required = [ ( source, Some ( vm. ctx. str_type( ) ) ) ] ) ;
460
-
461
- let source_string = objstr:: get_value ( source) ;
462
- let internal_ast = parser:: parse_program ( & source_string)
448
+ fn ast_parse ( source : PyStringRef , vm : & VirtualMachine ) -> PyResult < AstNodeRef > {
449
+ let internal_ast = parser:: parse_program ( & source. value )
463
450
. map_err ( |err| vm. new_value_error ( format ! ( "{}" , err) ) ) ?;
464
451
// source.clone();
465
- let ast_node = program_to_ast ( & vm, & internal_ast) ;
466
- Ok ( ast_node)
452
+ Ok ( program_to_ast ( & vm, & internal_ast) )
467
453
}
468
454
469
455
pub fn make_module ( vm : & VirtualMachine ) -> PyObjectRef {
0 commit comments