X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=src%2Fcommon_stub.hpp;fp=src%2Fcommon_stub.hpp;h=5655a309cef9402872b4acac19d67d7399e33360;hb=813b239795aac1844eb233dab7f8f98d8dba845e;hp=bfacdace195ea46944cf6b9cbf884b5db95743af;hpb=ba65a1b770d860132fbb04be4ca931b983dcb915;p=SXSI%2Fxpathcomp.git diff --git a/src/common_stub.hpp b/src/common_stub.hpp index bfacdac..5655a30 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,50 @@ 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() { 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), sxsi_finalize_custom); 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