1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
use std::slice; use binding::vm::init; use class::any_object::AnyObject; use types::{Argc, Value}; /// Virtual Machine and helpers pub struct VM; impl VM { /// Initializes Ruby virtual machine. /// /// This function should **ONLY** be used if you write a standalone application which calls /// Ruby itself, for example: /// /// - Sidekiq-like background processing /// /// - Unicorn-like web server /// /// In these cases it should be called before any interaction with Ruby. /// /// If you write a library which is being connected to Ruby in runtime (e.g. some gem), this /// function should not be used. /// /// # Examples /// /// ``` /// use ruru::{Class, VM}; /// /// VM::init(); /// /// // VM started, able to use Ruby now /// // ... /// /// Class::new("SomeClass"); // etc /// ``` pub fn init() { init(); } // TODO: Move to other struct /// Converts a pointer `AnyObject` array to `Vec<AnyObject>`. /// /// This function is a helper for callbacks. /// /// Later it will be moved to other struct, because it is not related to VM itself. /// /// # Examples /// /// ```no_run /// use ruru::types::Argc; /// use ruru::{AnyObject, Boolean, Class, RString, VM}; /// /// #[no_mangle] /// pub extern fn string_eq(argc: Argc, argv: *const AnyObject, itself: RString) -> Boolean { /// let argv = VM::parse_arguments(argc, argv); /// let other_string = argv[0].as_string(); /// /// Boolean::new(itself.to_string() == other_string.to_string()) /// } /// /// fn main() { /// Class::from_existing("String").define_method("==", string_eq); /// } /// ``` pub fn parse_arguments(argc: Argc, arguments: *const AnyObject) -> Vec<AnyObject> { unsafe { slice::from_raw_parts(arguments, argc as usize).to_vec() } } }