move-stackless-bytecode 0.3.2

Move stackless bytecode
Documentation
module 0x42::TestBorrow {
    struct R has copy, drop {
        x: u64,
        y: u64
    }

    fun test1() : R {
        let r = R {x: 3, y: 4};
        let r_ref = &mut r;
        let x_ref = &mut r_ref.x;
        *x_ref = 0;
        r
    }

    fun test2(x_ref: &mut u64, v: u64) {
        *x_ref = v
    }

    public fun test3(r_ref: &mut R, v: u64) {
        let x_ref = &mut r_ref.x;
        test2(x_ref, v)
    }

    fun test4() : R {
        let r = R {x: 3, y: 4};
        let r_ref = &mut r;
        test3(r_ref, 0);
        r
    }

    public fun test5(r_ref: &mut R) : &mut u64 {
        &mut r_ref.x
    }

    fun test6() : R {
        let r = R {x: 3, y: 4};
        let r_ref = &mut r;
        let x_ref = test5(r_ref);
        test2(x_ref, 0);
        r
    }

    fun test7(b: bool) {
        let r1 = R {x: 3, y: 4};
        let r2 = R {x: 4, y: 5};
        let r_ref = &mut r1;
        if (b) {
            r_ref = &mut r2;
        };
        test3(r_ref, 0)
    }

    fun test8(b: bool, n: u64, r_ref: &mut R) {
        let r1 = R {x: 3, y: 4};
        let r2 = R {x: 4, y: 5};
        let t_ref = &mut r2;
        while (0 < n) {
            if (n/2 == 0) {
                t_ref = &mut r1
            } else {
                t_ref = &mut r2;
            };
            n = n - 1
        };
        if (b) {
            test3(r_ref, 0);
        } else {
            test3(t_ref, 0);
        }
    }

    fun test9(b : bool, r_ref: &mut R) : &mut u64 {
        let r_field = &mut r_ref.x;
        if(b) {
            r_field = &mut r_ref.y;
        };
        *r_field = 0;
        r_field
    }

    fun test10(b : bool) : R {
        let r = R {x: 3, y: 4};
        let r_ref = &mut r;
        let r_field = &mut r_ref.x;
        if(b) {
            r_field = test9(b, r_ref);
        };
        *r_field = 0;
        r
    }
}