diff --git a/lang/src/vec.asm b/lang/src/vec.asm index e9f6748..1714329 100644 --- a/lang/src/vec.asm +++ b/lang/src/vec.asm @@ -15,7 +15,7 @@ global vec_pop global vec_swap global vec_remove global vec_get -global vec_free +global vec_drop ;; Byte vector structure @@ -56,6 +56,25 @@ vec_init: mov qword [r15 + 32], rdx ; drop ret +;; rdi: pointer to Vec struct +;; rsi: index +;; fn vec_get(vec: *mut Vec, index: usize) -> *mut u8 +vec_get: + ; if (index >= vec.len) panic(); + mov rax, [rdi + 8] ; len + cmp rsi, rax + jge .panic + ; return &mut vec.data[index * vec.item_size]; + mov rax, [rdi + 24] ; item_size + imul rax, rsi ; index * item_size + mov rsi, [rdi] ; data + add rax, rsi ; data + index * item_size + ret +.panic: + call panic + ret + + ;; rdi: pointer to Vec struct ;; rsi: pointer to data to push ;; rdx: size of data to push