История изменений
Исправление Silerus, (текущая версия) :
struct Data(usize);
impl Data{
pub fn print(&self){
println!("val is: {}",self.0);
}
}
fn test(key: &u8){
if key ==&1{
let xx = Box::new(Data(777));
xx.print();
}else{
let xx =Data(888);
xx.print();
}
}
pub fn main(){
test(&1);
test(&0);
}
прошло через оптимизатор
example::main:
sub rsp, 24
mov edi, 1
call example::test
xor edi, edi
call example::test
add rsp, 24
ret
example::test:
sub rsp, 24
cmp dil, 1
jne .LBB1_2
mov edi, 777
call <example::Data as example::print>::print
jmp .LBB1_3
.LBB1_2:
mov edi, 888
call <example::Data as example::print>::print
.LBB1_3:
add rsp, 24
ret
<example::Data as example::print>::print:
sub rsp, 24
mov esi, edi
lea rdi, [rip + .L__unnamed_1]
mov edx, 1
call qword ptr [rip + std::io::stdio::_print@GOTPCREL]
add rsp, 24
ret
.L__unnamed_1:
.asciz "\nval is: "
без
section .text
example::main:
push rbp
mov rbp, rsp
sub rsp, 16
mov byte ptr [rbp - 1], 1
lea rdi, [rbp - 1]
call example::test
mov byte ptr [rbp - 2], 0
lea rdi, [rbp - 2]
call example::test
add rsp, 16
pop rbp
ret
example::test:
push rbp
mov rbp, rsp
sub rsp, 48
mov qword ptr [rbp - 8], rdi
mov rax, qword ptr [rbp - 8]
mov al, byte ptr [rax]
cmp al, 1
jne .LBB1_2
mov edi, 4
call __rust_alloc
mov rcx, rax
mov qword ptr [rbp - 24], rcx ; Box allocation
mov dword ptr [rcx], 777 ; Store Data(777)
mov rax, qword ptr [rbp - 24]
mov qword ptr [rbp - 16], rax ; xx = Box
mov rdi, qword ptr [rbp - 16]
call example::Data::print
mov rdi, qword ptr [rbp - 16]
call <alloc::boxed::Box<example::Data> as core::ops::drop::Drop>::drop
jmp .LBB1_3
.LBB1_2:
mov dword ptr [rbp - 28], 888 ; Data(888) on stack
lea rdi, [rbp - 28]
call example::Data::print
.LBB1_3:
add rsp, 48
pop rbp
ret
example::Data::print:
push rbp
mov rbp, rsp
sub rsp, 16
mov qword ptr [rbp - 8], rdi
mov rax, qword ptr [rbp - 8]
mov eax, dword ptr [rax]
mov esi, eax
lea rdi, [rip + .L__unnamed_1]
mov al, 0
call printf
add rsp, 16
pop rbp
ret
<alloc::boxed::Box<example::Data> as core::ops::drop::Drop>::drop:
push rbp
mov rbp, rsp
sub rsp, 16
mov qword ptr [rbp - 8], rdi
mov rax, qword ptr [rbp - 8]
mov rdi, rax
mov esi, 4
mov edx, 4
call __rust_dealloc
add rsp, 16
pop rbp
ret
.L__unnamed_1:
.asciz "val is: %d\n"
Исходная версия Silerus, :
struct Data(usize);
impl Data{
pub fn print(&self){
println!("val is: {}",self.0);
}
}
fn test(key: &u8){
if key ==&1{
let xx = Box::new(Data(777));
xx.print();
}else{
let xx =Data(888);
xx.print();
}
}
pub fn main(){
test(&1);
test(&0);
}