X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=src%2Fcommon_stub.hpp;h=47b6dcd7e5ba98d7ac1d2836128039b84dd20c58;hb=8a31bd5c0847ca9c45627cb808a57d9c07c7b0dc;hp=bfacdace195ea46944cf6b9cbf884b5db95743af;hpb=ff13d22656fdbdffb2d909192bd17ba135606224;p=SXSI%2Fxpathcomp.git diff --git a/src/common_stub.hpp b/src/common_stub.hpp index bfacdac..47b6dcd 100644 --- a/src/common_stub.hpp +++ b/src/common_stub.hpp @@ -3,7 +3,7 @@ extern "C" { #define CAML_NAME_SPACE -#include + #include #include #include @@ -11,48 +11,49 @@ extern "C" { #include #include #include -#include } -#include #include + void register_custom_(char* name, size_t size, void (*finalize)(value v)); value alloc_custom_(char* name); +template X& Obj_val(value v) +{ + return * (X*) Data_custom_val(v); +} + +template void sxsi_finalize_obj(X) { +} + +template void sxsi_finalize_obj(X* x){ + delete x; +} template void sxsi_finalize_custom(value v) { - X * obj = * ((X **) Data_custom_val(v)); - std::cerr << "Finalizing object: " << typeid(X).name() << std::endl; - std::cerr.flush(); - delete obj; + sxsi_finalize_obj(Obj_val(v)); } -template value sxsi_alloc_custom() +template value sxsi_alloc_custom(void (*finalize)(value) = sxsi_finalize_custom) { char * name = const_cast(typeid(X).name()); + value v = alloc_custom_(name); if (v == Val_unit) { - register_custom_(name, sizeof(X*), sxsi_finalize_custom); + register_custom_(name, sizeof(X), finalize); v = alloc_custom_(name); }; return v; } -template X*& Obj_val(value v) -{ - //Cannot use Data_custom_val here, it is not a correct lvalue. :-( - return (X*&) Field(v,1); -} - void sxsi_raise_msg(char * msg); -extern "C" { -value sxsi_cpp_init(value unit); -} +extern "C" value sxsi_cpp_init(value unit); + #endif