move-stackless-bytecode 0.3.2

Move stackless bytecode
Documentation
============ initial translation from Move ================

[variant baseline]
public intrinsic fun vector::contains<#0>($t0|v: &vector<#0>, $t1|e: &#0): bool;


[variant baseline]
public intrinsic fun vector::index_of<#0>($t0|v: &vector<#0>, $t1|e: &#0): (bool, u64);


[variant baseline]
public intrinsic fun vector::append<#0>($t0|lhs: &mut vector<#0>, $t1|other: vector<#0>);


[variant baseline]
public native fun vector::borrow<#0>($t0|v: &vector<#0>, $t1|i: u64): &#0;


[variant baseline]
public native fun vector::borrow_mut<#0>($t0|v: &mut vector<#0>, $t1|i: u64): &mut #0;


[variant baseline]
public native fun vector::destroy_empty<#0>($t0|v: vector<#0>);


[variant baseline]
public native fun vector::empty<#0>(): vector<#0>;


[variant baseline]
public intrinsic fun vector::is_empty<#0>($t0|v: &vector<#0>): bool;


[variant baseline]
public native fun vector::length<#0>($t0|v: &vector<#0>): u64;


[variant baseline]
public native fun vector::pop_back<#0>($t0|v: &mut vector<#0>): #0;


[variant baseline]
public native fun vector::push_back<#0>($t0|v: &mut vector<#0>, $t1|e: #0);


[variant baseline]
public intrinsic fun vector::remove<#0>($t0|v: &mut vector<#0>, $t1|i: u64): #0;


[variant baseline]
public intrinsic fun vector::reverse<#0>($t0|v: &mut vector<#0>);


[variant baseline]
public fun vector::singleton<#0>($t0|e: #0): vector<#0> {
     var $t1|v: vector<#0>
     var $t2: vector<#0>
     var $t3: &mut vector<#0>
     var $t4: #0
     var $t5: vector<#0>
  0: $t2 := vector::empty<#0>()
  1: $t1 := $t2
  2: $t3 := borrow_local($t1)
  3: $t4 := move($t0)
  4: vector::push_back<#0>($t3, $t4)
  5: $t5 := move($t1)
  6: return $t5
}


[variant baseline]
public native fun vector::swap<#0>($t0|v: &mut vector<#0>, $t1|i: u64, $t2|j: u64);


[variant baseline]
public intrinsic fun vector::swap_remove<#0>($t0|v: &mut vector<#0>, $t1|i: u64): #0;


[variant baseline]
fun MultiLayerCalling::inner($t0|has_vector: &mut MultiLayerCalling::HasVector): &mut MultiLayerCalling::HasAnotherVector {
     var $t1: &mut MultiLayerCalling::HasVector
     var $t2: &mut vector<MultiLayerCalling::HasAnotherVector>
     var $t3: u64
     var $t4: &mut MultiLayerCalling::HasAnotherVector
  0: $t1 := move($t0)
  1: $t2 := borrow_field<MultiLayerCalling::HasVector>.v($t1)
  2: $t3 := 7
  3: $t4 := vector::borrow_mut<MultiLayerCalling::HasAnotherVector>($t2, $t3)
  4: return $t4
}


[variant baseline]
fun MultiLayerCalling::mid($t0|has_vector: &mut MultiLayerCalling::HasVector): &mut MultiLayerCalling::HasAnotherVector {
     var $t1: &mut MultiLayerCalling::HasVector
     var $t2: &mut MultiLayerCalling::HasAnotherVector
  0: $t1 := move($t0)
  1: $t2 := MultiLayerCalling::inner($t1)
  2: return $t2
}


[variant baseline]
fun MultiLayerCalling::outer($t0|has_vector: &mut MultiLayerCalling::HasVector) {
     var $t1|has_another_vector: &mut MultiLayerCalling::HasAnotherVector
     var $t2: &mut MultiLayerCalling::HasVector
     var $t3: &mut MultiLayerCalling::HasAnotherVector
     var $t4: &mut MultiLayerCalling::HasAnotherVector
     var $t5: &mut vector<u8>
     var $t6: u8
  0: $t2 := move($t0)
  1: $t3 := MultiLayerCalling::mid($t2)
  2: $t1 := $t3
  3: $t4 := move($t1)
  4: $t5 := borrow_field<MultiLayerCalling::HasAnotherVector>.v($t4)
  5: $t6 := 42
  6: vector::push_back<u8>($t5, $t6)
  7: return ()
}

============ after pipeline `borrow` ================

[variant baseline]
public intrinsic fun vector::contains<#0>($t0|v: vector<#0>, $t1|e: #0): bool;


[variant baseline]
public intrinsic fun vector::index_of<#0>($t0|v: vector<#0>, $t1|e: #0): (bool, u64);


[variant baseline]
public intrinsic fun vector::append<#0>($t0|lhs: &mut vector<#0>, $t1|other: vector<#0>);


[variant baseline]
public native fun vector::borrow<#0>($t0|v: vector<#0>, $t1|i: u64): #0;


[variant baseline]
public native fun vector::borrow_mut<#0>($t0|v: &mut vector<#0>, $t1|i: u64): &mut #0;


[variant baseline]
public native fun vector::destroy_empty<#0>($t0|v: vector<#0>);


[variant baseline]
public native fun vector::empty<#0>(): vector<#0>;


[variant baseline]
public intrinsic fun vector::is_empty<#0>($t0|v: vector<#0>): bool;


[variant baseline]
public native fun vector::length<#0>($t0|v: vector<#0>): u64;


[variant baseline]
public native fun vector::pop_back<#0>($t0|v: &mut vector<#0>): #0;


[variant baseline]
public native fun vector::push_back<#0>($t0|v: &mut vector<#0>, $t1|e: #0);


[variant baseline]
public intrinsic fun vector::remove<#0>($t0|v: &mut vector<#0>, $t1|i: u64): #0;


[variant baseline]
public intrinsic fun vector::reverse<#0>($t0|v: &mut vector<#0>);


[variant baseline]
public fun vector::singleton<#0>($t0|e: #0): vector<#0> {
     var $t1|v: vector<#0>
     var $t2: &mut vector<#0>
     var $t3: vector<#0>
     # live_nodes: LocalRoot($t0)
  0: $t1 := vector::empty<#0>()
     # live_nodes: LocalRoot($t0)
  1: $t2 := borrow_local($t1)
     # live_nodes: LocalRoot($t0), Reference($t2)
     # borrowed_by: LocalRoot($t1) -> {(@, Reference($t2))}
     # borrows_from: Reference($t2) -> {(@, LocalRoot($t1))}
  2: vector::push_back<#0>($t2, $t0)
     # live_nodes: LocalRoot($t0)
     # borrowed_by: LocalRoot($t1) -> {(@, Reference($t2))}
     # borrows_from: Reference($t2) -> {(@, LocalRoot($t1))}
  3: $t3 := move($t1)
     # live_nodes: LocalRoot($t0), LocalRoot($t3)
     # borrowed_by: LocalRoot($t1) -> {(@, Reference($t2))}
     # borrows_from: Reference($t2) -> {(@, LocalRoot($t1))}
  4: return $t3
}


[variant baseline]
public native fun vector::swap<#0>($t0|v: &mut vector<#0>, $t1|i: u64, $t2|j: u64);


[variant baseline]
public intrinsic fun vector::swap_remove<#0>($t0|v: &mut vector<#0>, $t1|i: u64): #0;


[variant baseline]
fun MultiLayerCalling::inner($t0|has_vector: &mut MultiLayerCalling::HasVector): &mut MultiLayerCalling::HasAnotherVector {
     var $t1: &mut vector<MultiLayerCalling::HasAnotherVector>
     var $t2: u64
     var $t3: &mut MultiLayerCalling::HasAnotherVector
     # live_nodes: Reference($t0)
  0: $t1 := borrow_field<MultiLayerCalling::HasVector>.v($t0)
     # live_nodes: Reference($t0), Reference($t1)
     # borrowed_by: Reference($t0) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>), Reference($t1))}
     # borrows_from: Reference($t1) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>), Reference($t0))}
  1: $t2 := 7
     # live_nodes: Reference($t0), Reference($t1)
     # borrowed_by: Reference($t0) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>), Reference($t1))}
     # borrows_from: Reference($t1) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>), Reference($t0))}
  2: $t3 := vector::borrow_mut<MultiLayerCalling::HasAnotherVector>($t1, $t2)
     # live_nodes: Reference($t0), Reference($t3)
     # borrowed_by: Reference($t0) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>), Reference($t1))}, Reference($t1) -> {([], Reference($t3))}
     # borrows_from: Reference($t1) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>), Reference($t0))}, Reference($t3) -> {([], Reference($t1))}
  3: trace_local[has_vector]($t0)
     # live_nodes: Reference($t3)
     # borrowed_by: Reference($t0) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>), Reference($t1))}, Reference($t1) -> {([], Reference($t3))}
     # borrows_from: Reference($t1) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>), Reference($t0))}, Reference($t3) -> {([], Reference($t1))}
  4: return $t3
}


[variant baseline]
fun MultiLayerCalling::mid($t0|has_vector: &mut MultiLayerCalling::HasVector): &mut MultiLayerCalling::HasAnotherVector {
     var $t1: &mut MultiLayerCalling::HasAnotherVector
     # live_nodes: Reference($t0)
  0: $t1 := MultiLayerCalling::inner($t0)
     # live_nodes: Reference($t0), Reference($t1)
     # borrowed_by: Reference($t0) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>)/[], Reference($t1))}
     # borrows_from: Reference($t1) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>)/[], Reference($t0))}
  1: trace_local[has_vector]($t0)
     # live_nodes: Reference($t1)
     # borrowed_by: Reference($t0) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>)/[], Reference($t1))}
     # borrows_from: Reference($t1) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>)/[], Reference($t0))}
  2: return $t1
}


[variant baseline]
fun MultiLayerCalling::outer($t0|has_vector: &mut MultiLayerCalling::HasVector) {
     var $t1|has_another_vector: &mut MultiLayerCalling::HasAnotherVector
     var $t2: &mut MultiLayerCalling::HasAnotherVector
     var $t3: &mut vector<u8>
     var $t4: u8
     # live_nodes: Reference($t0)
  0: $t2 := MultiLayerCalling::mid($t0)
     # live_nodes: Reference($t0), Reference($t2)
     # borrowed_by: Reference($t0) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>)/[], Reference($t2))}
     # borrows_from: Reference($t2) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>)/[], Reference($t0))}
  1: $t3 := borrow_field<MultiLayerCalling::HasAnotherVector>.v($t2)
     # live_nodes: Reference($t0), Reference($t3)
     # borrowed_by: Reference($t0) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>)/[], Reference($t2))}, Reference($t2) -> {(.v (vector<u8>), Reference($t3))}
     # borrows_from: Reference($t2) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>)/[], Reference($t0))}, Reference($t3) -> {(.v (vector<u8>), Reference($t2))}
  2: $t4 := 42
     # live_nodes: Reference($t0), Reference($t3)
     # borrowed_by: Reference($t0) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>)/[], Reference($t2))}, Reference($t2) -> {(.v (vector<u8>), Reference($t3))}
     # borrows_from: Reference($t2) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>)/[], Reference($t0))}, Reference($t3) -> {(.v (vector<u8>), Reference($t2))}
  3: vector::push_back<u8>($t3, $t4)
     # live_nodes: Reference($t0)
     # borrowed_by: Reference($t0) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>)/[], Reference($t2))}, Reference($t2) -> {(.v (vector<u8>), Reference($t3))}
     # borrows_from: Reference($t2) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>)/[], Reference($t0))}, Reference($t3) -> {(.v (vector<u8>), Reference($t2))}
  4: trace_local[has_vector]($t0)
     # borrowed_by: Reference($t0) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>)/[], Reference($t2))}, Reference($t2) -> {(.v (vector<u8>), Reference($t3))}
     # borrows_from: Reference($t2) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>)/[], Reference($t0))}, Reference($t3) -> {(.v (vector<u8>), Reference($t2))}
  5: return ()
}



==== borrow analysis summaries ====

fun vector::borrow_mut[baseline]
borrowed_by: Reference($t0) -> {([], Return(0))}
borrows_from: Return(0) -> {([], Reference($t0))}

fun MultiLayerCalling::inner[baseline]
borrowed_by: Reference($t0) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>)/[], Return(0))}
borrows_from: Return(0) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>)/[], Reference($t0))}

fun MultiLayerCalling::mid[baseline]
borrowed_by: Reference($t0) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>)/[], Return(0))}
borrows_from: Return(0) -> {(.v (vector<MultiLayerCalling::HasAnotherVector>)/[], Reference($t0))}