Add test for double-pointers
This commit is contained in:
parent
306a6fb7fb
commit
c61090cbea
2 changed files with 42 additions and 0 deletions
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)))))))
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue