Я пишу интерфейс к C-библиотеке, используя внешние объявления в OCaml. Я использовал ctypes для тестирования, но он включал 100% накладных расходов для быстрых вызовов (измеренных с помощью базового теста core_bench).Когда требуется CAMLparamX?
функции выглядят следующим образом:
/* external _create_var : float -> int -> int -> int -> _npnum = "ocaml_tnp_number_create_var" ;; */
value ocaml_tnp_number_create_var(value v, value nr, value p, value o) {
//CAMLparam4(v, nr, p, o);
const int params = Int_val(p);
const int order = Int_val(o);
const int number = Int_val(nr);
const double value = Double_val(v);
return CTYPES_FROM_PTR(tnp_number_create_variable(value, number, params, order));
}
/* external _delete : _npnum -> unit = "ocaml_tnp_number_delete" ;; */
value ocaml_tnp_number_delete(value num) {
//CAMLparam1(num);
struct tnp_number* n = CTYPES_TO_PTR(num);
tnp_number_delete(n);
return Val_unit;
}
Я позаимствовал CTYPES_ * макросы, так что я в основном перемещение указателей вокруг как значения Int64.
#define CTYPES_FROM_PTR(P) caml_copy_int64((intptr_t)P)
#define CTYPES_TO_PTR(I64) ((void *)Int64_val(I64))
#define CTYPES_PTR_PLUS(I64, I) caml_copy_int64(Int64_val(I64) + I)
AFAIK, эти значения представлены в виде прямоугольников, которые помечены как «обычай», которые должны быть оставлены нетронутыми ГМ.
Нужно ли раскомментировать макросы CAMLparamX
, чтобы уведомить GC о моем использовании или законно ли их опустить?
Недопустимые аргументы значения, такие как целые числа, не обязательно должны быть в CAMLparamN. См. Byterun/ints.c исходного кода компилятора OCaml для таких примеров. – camlspotter
@camlspotter Существует пробел между тем, что на самом деле безопасно, и тем, что указано как безопасное. Указанный вами ярлык и многие другие недокументированы. Документация приведена в этом ответе. Вопрос касается того, что является * юридическим *, а не тем, что происходит. –