Add test for double-pointers

This commit is contained in:
Joshua Suskalo 2024-10-04 11:43:01 -04:00
parent 306a6fb7fb
commit c61090cbea
No known key found for this signature in database
GPG key ID: 9B6BA586EFF1B9F0
2 changed files with 42 additions and 0 deletions

View file

@ -1,4 +1,5 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
int add_numbers(int a, int b) { int add_numbers(int a, int b) {
return a + b; return a + b;
@ -78,3 +79,20 @@ void test_call_with_trailing_string_arg(int a, int b, char* text) {
return; return;
} }
int freed = 0;
int get_variable_length_array(float **arr) {
freed = 0;
*arr = malloc(sizeof(float) * 7);
for (int i = 0; i < 7; ++i) {
(*arr)[i] = 1.5f * i;
}
return 7;
}
void free_variable_length_array(float *arr) {
freed = 1;
free(arr);
}

View file

@ -70,3 +70,27 @@
(catch Throwable _t (catch Throwable _t
:err)) :err))
:ok))) :ok)))
(ffi/defvar freed? "freed" ::mem/int)
(def get-variable-length-array* (ffi/make-downcall "get_variable_length_array" [::mem/pointer] ::mem/int))
(def free-variable-length-array* (ffi/make-downcall "free_variable_length_array" [::mem/pointer] ::mem/void))
(t/deftest get-variable-length-array
(let [floats
(with-open [stack (mem/confined-arena)]
(let [out-floats (mem/alloc mem/pointer-size stack)
num-floats (get-variable-length-array* out-floats)
floats-addr (mem/read-address out-floats)
floats-slice (mem/reinterpret floats-addr (unchecked-multiply-int mem/float-size num-floats))]
(try
(loop [floats (transient [])
index 0]
(if (>= index num-floats)
(persistent! floats)
(recur (conj! floats (mem/read-float floats-slice (unchecked-multiply-int index mem/float-size)))
(unchecked-inc-int index))))
(finally
(free-variable-length-array* floats-addr)))))]
(t/is (not (zero? @freed?)))
(t/is (= floats (mapv #(* (float 1.5) %) (range (count floats)))))))