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
use bytevm::prelude::*;
#[test]
fn test_jumps() {
let target = 1_000;
let mut program = Program::builder();
program.add_function(FunctionBuilder::default()
.name("main")
.arity(0)
.body(
BlockEncoder::default()
// create a variable to hold the result
.declare_local("i")
.push_integer(0)
.set_local("i")
// create a variable to hold the target value
.declare_local("target")
.push_integer(target)
.set_local("target")
// start of the loop
.add_label("start")
// check if i < target
.get_local("i")
.get_local("target")
.less_than()
.jump_if_false("end")
// increment i
.get_local("i")
.push_integer(1)
.add()
.set_local("i")
// jump to the start of the loop
.jump("start")
// end of the loop
.add_label("end")
// return the result
.get_local("i")
.return_value()
)
.build()
);
let mut vm = Vm::default();
vm.load_program(program.build());
let result = vm.run(None, None).unwrap();
assert_eq!(result.result.unwrap(), Variant::Integer(target));
println!("Elapsed time: {:?}", result.run_time.as_secs_f64());
}