The detail you're missing is how an lvalue sub returns. An ordinary sub uses the leavesub op, while an lvalue sub uses leavesublv. The main difference between the two is that (oversimplifying a bit), the former makes copies of all the return items on the stack.