diff --git a/lang/src/vec.asm b/lang/src/vec.asm index 2523cf4..e9f6748 100644 --- a/lang/src/vec.asm +++ b/lang/src/vec.asm @@ -244,3 +244,36 @@ vec_try_grow: xor rax, rax ret +;; rdi: pointer to Vec struct +vec_drop: + push r12 + push r13 + push r14 + push rdi + ; if let Some(drop) = vec.drop { + mov r12, [rdi + 32] + test r12, r12 + je .ret + ; for i in 0..vec.len { + xor r13, r13 + mov r14, [rdi + 8] ; len +.loop: + cmp r13, r14 + jge .ret + mov rdi, [rsp] + ; drop(&mut vec.data[i * vec.item_size..(i + 1) * vec.item_size]); + imul r13, [rdi + 24] ; i * item_size + mov rdi, [rdi] ; data + add rdi, rax + call r12 + inc r13 + jmp .loop + ; } + ; } + ; free(vec.data); +.ret: + pop rdi + pop r14 + pop r13 + pop r12 + ret