Struct mrubyedge::vm::VM

source ·
pub struct VM<'insn> {
    pub vm_id: u32,
    pub irep_arena: HashMap<usize, Rc<VMIrep<'insn>>>,
    pub top_irep: Rc<VMIrep<'insn>>,
    pub cur_irep: Rc<VMIrep<'insn>>,
    pub pc: usize,
    pub class_arena: HashMap<usize, Rc<RefCell<RClass<'insn>>>>,
    pub const_arena: HashMap<String, Rc<RObject>>,
    pub target_class: Option<usize>,
    pub callinfo_vec: Vec<CallInfo<'insn>>,
    pub exception: Option<Box<RObject>>,
    pub regs: HashMap<usize, Rc<RObject>>,
}

Fields§

§vm_id: u32§irep_arena: HashMap<usize, Rc<VMIrep<'insn>>>§top_irep: Rc<VMIrep<'insn>>§cur_irep: Rc<VMIrep<'insn>>§pc: usize§class_arena: HashMap<usize, Rc<RefCell<RClass<'insn>>>>§const_arena: HashMap<String, Rc<RObject>>§target_class: Option<usize>§callinfo_vec: Vec<CallInfo<'insn>>§exception: Option<Box<RObject>>§regs: HashMap<usize, Rc<RObject>>

Implementations§

source§

impl<'insn> VM<'insn>

source

pub fn open(rite: Rite<'insn>) -> VM<'insn>

Examples found in repository?
examples/eval1.rs (line 7)
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fn main() {
    let bin = include_bytes!("./simple.mrb");
    let rite = mrubyedge::rite::load(bin).unwrap();
    // dbg!(&rite);
    let mut vm = mrubyedge::vm::VM::open(rite);
    vm.prelude().unwrap();
    // dbg!(&vm);
    vm.eval_insn().unwrap();

    eprintln!("return value:");
    let top = 0 as usize;
    dbg!(vm.regs.get(&top).unwrap());

    // mrubyedge::eval::debug_eval_insn(irep.inst_head).unwrap();
    ()
}
More examples
Hide additional examples
examples/runscript.rs (line 27)
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
fn main() -> Result<(), std::io::Error> {
    let args: Vec<String> = env::args().skip(1).collect();
    let path = &args[0];

    let output = Command::new("mrbc")
        .arg("-v")
        .arg("-o")
        .arg("/tmp/__tmp__.mrb")
        .arg(path)
        .output()
        .expect("failed to compile mruby script");
    eprintln!("debug: {}", String::from_utf8_lossy(&output.stdout));

    let mut file = File::open("/tmp/__tmp__.mrb")?;
    let mut bin = Vec::<u8>::new();
    file.read_to_end(&mut bin)?;

    let rite = mrubyedge::rite::load(&bin).unwrap();
    // dbg!(&rite);
    let mut vm = mrubyedge::vm::VM::open(rite);
    vm.prelude().unwrap();
    // dbg!(&vm);
    vm.eval_insn().unwrap();

    remove_file("/tmp/__tmp__.mrb")?;

    eprintln!("return value:");
    let top = 0 as usize;
    match vm.regs.get(&top) {
        Some(v) => {
            eprintln!("{:?}", v);
            // eprintln!("{:?}", TryInto::<i32>::try_into(v.as_ref()).unwrap());
        }
        None => eprintln!("None"),
    }

    // dbg!(&vm);
    Ok(())
}
source

pub fn prelude(&mut self) -> Result<(), Error>

Examples found in repository?
examples/eval1.rs (line 8)
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fn main() {
    let bin = include_bytes!("./simple.mrb");
    let rite = mrubyedge::rite::load(bin).unwrap();
    // dbg!(&rite);
    let mut vm = mrubyedge::vm::VM::open(rite);
    vm.prelude().unwrap();
    // dbg!(&vm);
    vm.eval_insn().unwrap();

    eprintln!("return value:");
    let top = 0 as usize;
    dbg!(vm.regs.get(&top).unwrap());

    // mrubyedge::eval::debug_eval_insn(irep.inst_head).unwrap();
    ()
}
More examples
Hide additional examples
examples/runscript.rs (line 28)
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
fn main() -> Result<(), std::io::Error> {
    let args: Vec<String> = env::args().skip(1).collect();
    let path = &args[0];

    let output = Command::new("mrbc")
        .arg("-v")
        .arg("-o")
        .arg("/tmp/__tmp__.mrb")
        .arg(path)
        .output()
        .expect("failed to compile mruby script");
    eprintln!("debug: {}", String::from_utf8_lossy(&output.stdout));

    let mut file = File::open("/tmp/__tmp__.mrb")?;
    let mut bin = Vec::<u8>::new();
    file.read_to_end(&mut bin)?;

    let rite = mrubyedge::rite::load(&bin).unwrap();
    // dbg!(&rite);
    let mut vm = mrubyedge::vm::VM::open(rite);
    vm.prelude().unwrap();
    // dbg!(&vm);
    vm.eval_insn().unwrap();

    remove_file("/tmp/__tmp__.mrb")?;

    eprintln!("return value:");
    let top = 0 as usize;
    match vm.regs.get(&top) {
        Some(v) => {
            eprintln!("{:?}", v);
            // eprintln!("{:?}", TryInto::<i32>::try_into(v.as_ref()).unwrap());
        }
        None => eprintln!("None"),
    }

    // dbg!(&vm);
    Ok(())
}
source

pub fn eval_insn(&mut self) -> Result<(), Error>

Examples found in repository?
examples/eval1.rs (line 10)
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fn main() {
    let bin = include_bytes!("./simple.mrb");
    let rite = mrubyedge::rite::load(bin).unwrap();
    // dbg!(&rite);
    let mut vm = mrubyedge::vm::VM::open(rite);
    vm.prelude().unwrap();
    // dbg!(&vm);
    vm.eval_insn().unwrap();

    eprintln!("return value:");
    let top = 0 as usize;
    dbg!(vm.regs.get(&top).unwrap());

    // mrubyedge::eval::debug_eval_insn(irep.inst_head).unwrap();
    ()
}
More examples
Hide additional examples
examples/runscript.rs (line 30)
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
fn main() -> Result<(), std::io::Error> {
    let args: Vec<String> = env::args().skip(1).collect();
    let path = &args[0];

    let output = Command::new("mrbc")
        .arg("-v")
        .arg("-o")
        .arg("/tmp/__tmp__.mrb")
        .arg(path)
        .output()
        .expect("failed to compile mruby script");
    eprintln!("debug: {}", String::from_utf8_lossy(&output.stdout));

    let mut file = File::open("/tmp/__tmp__.mrb")?;
    let mut bin = Vec::<u8>::new();
    file.read_to_end(&mut bin)?;

    let rite = mrubyedge::rite::load(&bin).unwrap();
    // dbg!(&rite);
    let mut vm = mrubyedge::vm::VM::open(rite);
    vm.prelude().unwrap();
    // dbg!(&vm);
    vm.eval_insn().unwrap();

    remove_file("/tmp/__tmp__.mrb")?;

    eprintln!("return value:");
    let top = 0 as usize;
    match vm.regs.get(&top) {
        Some(v) => {
            eprintln!("{:?}", v);
            // eprintln!("{:?}", TryInto::<i32>::try_into(v.as_ref()).unwrap());
        }
        None => eprintln!("None"),
    }

    // dbg!(&vm);
    Ok(())
}

Trait Implementations§

source§

impl<'insn> Debug for VM<'insn>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'insn> Freeze for VM<'insn>

§

impl<'insn> !RefUnwindSafe for VM<'insn>

§

impl<'insn> !Send for VM<'insn>

§

impl<'insn> !Sync for VM<'insn>

§

impl<'insn> Unpin for VM<'insn>

§

impl<'insn> !UnwindSafe for VM<'insn>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.