Merge pull request #3667 from youknowone/canister

complex embedding and generator example
This commit is contained in:
Jeong YunWon
2022-06-16 01:37:32 +09:00
committed by GitHub
3 changed files with 100 additions and 0 deletions

49
examples/generator.rs Normal file
View File

@@ -0,0 +1,49 @@
use rustpython_vm as vm;
use vm::{
builtins::PyIntRef,
protocol::{PyIter, PyIterReturn},
Interpreter, PyResult,
};
fn py_main(interp: &Interpreter) -> vm::PyResult<()> {
let generator = interp.enter(|vm| {
let scope = vm.new_scope_with_builtins();
let generator = vm.run_block_expr(
scope.clone(),
r#"
def gen():
for i in range(10):
yield i
gen()
"#,
)?;
Ok(generator)
})?;
loop {
let r = interp.enter(|vm| {
let v = match PyIter::new(generator.clone()).next(vm)? {
PyIterReturn::Return(obj) => {
PyIterReturn::Return(obj.try_into_value::<PyIntRef>(vm)?)
}
PyIterReturn::StopIteration(x) => PyIterReturn::StopIteration(x),
};
PyResult::Ok(v)
})?;
match r {
PyIterReturn::Return(value) => println!("{}", value),
PyIterReturn::StopIteration(_) => break,
}
}
Ok(())
}
fn main() {
let interp = vm::Interpreter::with_init(Default::default(), |vm| {
vm.add_native_modules(rustpython_stdlib::get_module_inits());
});
let result = py_main(&interp);
std::process::exit(interp.run(|_vm| result));
}

24
examples/package_embed.py Normal file
View File

@@ -0,0 +1,24 @@
from dataclasses import dataclass
from typing import Any
__all__ = ["context"]
@dataclass
class Context:
name: str
something: Any
_context = Context(
name="test name",
something=None,
)
def context() -> Context:
return _context
if __name__ == "__main__":
print(context().name)

27
examples/package_embed.rs Normal file
View File

@@ -0,0 +1,27 @@
use rustpython_vm as vm;
use vm::{builtins::PyStrRef, Interpreter};
fn py_main(interp: &Interpreter) -> vm::PyResult<PyStrRef> {
interp.enter(|vm| {
vm.insert_sys_path(vm.new_pyobj("examples"))
.expect("add path");
let module = vm.import("package_embed", None, 0)?;
let name_func = module.get_attr("context", vm)?;
let result = vm.invoke(&name_func, ())?;
let result: PyStrRef = result.get_attr("name", vm)?.try_into_value(vm)?;
vm::PyResult::Ok(result)
})
}
fn main() -> vm::PyResult<()> {
let interp = vm::Interpreter::with_init(Default::default(), |vm| {
vm.add_native_modules(rustpython_stdlib::get_module_inits());
});
let result = py_main(&interp);
let result = result.and_then(|result| {
println!("name: {}", result);
Ok(())
});
let exit_code = interp.run(|_vm| result);
std::process::exit(exit_code);
}