diff --git a/examples/generator.rs b/examples/generator.rs new file mode 100644 index 000000000..49c37f52e --- /dev/null +++ b/examples/generator.rs @@ -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::(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)); +} diff --git a/examples/package_embed.py b/examples/package_embed.py new file mode 100644 index 000000000..6aeb723ac --- /dev/null +++ b/examples/package_embed.py @@ -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) diff --git a/examples/package_embed.rs b/examples/package_embed.rs new file mode 100644 index 000000000..664ea6d3c --- /dev/null +++ b/examples/package_embed.rs @@ -0,0 +1,27 @@ +use rustpython_vm as vm; +use vm::{builtins::PyStrRef, Interpreter}; + +fn py_main(interp: &Interpreter) -> vm::PyResult { + 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); +}