Skip to content

Commit ff50213

Browse files
authored
Merge pull request RustPython#3667 from youknowone/canister
complex embedding and generator example
2 parents ba8df41 + bae6887 commit ff50213

File tree

3 files changed

+100
-0
lines changed

3 files changed

+100
-0
lines changed

examples/generator.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
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 generator = vm.run_block_expr(
12+
scope.clone(),
13+
r#"
14+
def gen():
15+
for i in range(10):
16+
yield i
17+
18+
gen()
19+
"#,
20+
)?;
21+
Ok(generator)
22+
})?;
23+
24+
loop {
25+
let r = interp.enter(|vm| {
26+
let v = match PyIter::new(generator.clone()).next(vm)? {
27+
PyIterReturn::Return(obj) => {
28+
PyIterReturn::Return(obj.try_into_value::<PyIntRef>(vm)?)
29+
}
30+
PyIterReturn::StopIteration(x) => PyIterReturn::StopIteration(x),
31+
};
32+
PyResult::Ok(v)
33+
})?;
34+
match r {
35+
PyIterReturn::Return(value) => println!("{}", value),
36+
PyIterReturn::StopIteration(_) => break,
37+
}
38+
}
39+
40+
Ok(())
41+
}
42+
43+
fn main() {
44+
let interp = vm::Interpreter::with_init(Default::default(), |vm| {
45+
vm.add_native_modules(rustpython_stdlib::get_module_inits());
46+
});
47+
let result = py_main(&interp);
48+
std::process::exit(interp.run(|_vm| result));
49+
}

examples/package_embed.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from dataclasses import dataclass
2+
from typing import Any
3+
4+
__all__ = ["context"]
5+
6+
7+
@dataclass
8+
class Context:
9+
name: str
10+
something: Any
11+
12+
13+
_context = Context(
14+
name="test name",
15+
something=None,
16+
)
17+
18+
19+
def context() -> Context:
20+
return _context
21+
22+
23+
if __name__ == "__main__":
24+
print(context().name)

examples/package_embed.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
use rustpython_vm as vm;
2+
use vm::{builtins::PyStrRef, Interpreter};
3+
4+
fn py_main(interp: &Interpreter) -> vm::PyResult<PyStrRef> {
5+
interp.enter(|vm| {
6+
vm.insert_sys_path(vm.new_pyobj("examples"))
7+
.expect("add path");
8+
let module = vm.import("package_embed", None, 0)?;
9+
let name_func = module.get_attr("context", vm)?;
10+
let result = vm.invoke(&name_func, ())?;
11+
let result: PyStrRef = result.get_attr("name", vm)?.try_into_value(vm)?;
12+
vm::PyResult::Ok(result)
13+
})
14+
}
15+
16+
fn main() -> vm::PyResult<()> {
17+
let interp = vm::Interpreter::with_init(Default::default(), |vm| {
18+
vm.add_native_modules(rustpython_stdlib::get_module_inits());
19+
});
20+
let result = py_main(&interp);
21+
let result = result.and_then(|result| {
22+
println!("name: {}", result);
23+
Ok(())
24+
});
25+
let exit_code = interp.run(|_vm| result);
26+
std::process::exit(exit_code);
27+
}

0 commit comments

Comments
 (0)