File tree Expand file tree Collapse file tree 1 file changed +51
-0
lines changed
Expand file tree Collapse file tree 1 file changed +51
-0
lines changed Original file line number Diff line number Diff line change 1+ use rustpython_vm as vm;
2+ use vm:: {
3+ builtins:: PyIntRef ,
4+ protocol:: { PyIter , PyIterReturn } ,
5+ Interpreter , PyResult ,
6+ } ;
7+
8+ fn py_main ( interp : & Interpreter ) -> vm:: PyResult < ( ) > {
9+ let generator = interp. enter ( |vm| {
10+ let scope = vm. new_scope_with_builtins ( ) ;
11+ let _ = vm. run_code_string (
12+ scope. clone ( ) ,
13+ r#"
14+ def gen():
15+ for i in range(10):
16+ yield i
17+
18+ generator = gen()
19+ "# ,
20+ "" . to_owned ( ) ,
21+ ) ?;
22+ let generator = scope. globals . get_item ( "generator" , vm) ?;
23+ Ok ( generator)
24+ } ) ?;
25+
26+ loop {
27+ let r = interp. enter ( |vm| {
28+ let v = match PyIter :: new ( generator. clone ( ) ) . next ( vm) ? {
29+ PyIterReturn :: Return ( obj) => {
30+ PyIterReturn :: Return ( obj. try_into_value :: < PyIntRef > ( vm) ?)
31+ }
32+ PyIterReturn :: StopIteration ( x) => PyIterReturn :: StopIteration ( x) ,
33+ } ;
34+ PyResult :: Ok ( v)
35+ } ) ?;
36+ match r {
37+ PyIterReturn :: Return ( value) => println ! ( "{}" , value) ,
38+ PyIterReturn :: StopIteration ( _) => break ,
39+ }
40+ }
41+
42+ Ok ( ( ) )
43+ }
44+
45+ fn main ( ) {
46+ let interp = vm:: Interpreter :: with_init ( Default :: default ( ) , |vm| {
47+ vm. add_native_modules ( rustpython_stdlib:: get_module_inits ( ) ) ;
48+ } ) ;
49+ let result = py_main ( & interp) ;
50+ std:: process:: exit ( interp. run ( |_vm| result) ) ;
51+ }
You can’t perform that action at this time.
0 commit comments