Merge pull request #3667 from youknowone/canister

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

No files matched your search

+49
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
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
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);
}