X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=src%2Fcommon_stub.hpp;h=45aa0caedb58613b858c66f86bd1a974ffc552a1;hb=cb728132e1c5cb0a171ee09e9b3ced16da08f796;hp=bfacdace195ea46944cf6b9cbf884b5db95743af;hpb=ff13d22656fdbdffb2d909192bd17ba135606224;p=SXSI%2Fxpathcomp.git diff --git a/src/common_stub.hpp b/src/common_stub.hpp index bfacdac..45aa0ca 100644 --- a/src/common_stub.hpp +++ b/src/common_stub.hpp @@ -1,9 +1,9 @@ -#ifndef COMMON_STUB_H_ -#define COMMON_STUB_H_ +#ifndef COMMON_STUB_HPP_ +#define COMMON_STUB_HPP_ extern "C" { #define CAML_NAME_SPACE -#include + #include #include #include @@ -11,10 +11,13 @@ extern "C" { #include #include #include -#include } -#include #include +#include +#include + +#define NoAlloc + void register_custom_(char* name, size_t size, @@ -22,37 +25,41 @@ void register_custom_(char* name, value alloc_custom_(char* name); +template X& Obj_val(value v) +{ + assert(Tag_val(v) == Custom_tag); + 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(const char * msg); -void sxsi_raise_msg(char * msg); +extern "C" value sxsi_cpp_init(value unit); -extern "C" { -value sxsi_cpp_init(value unit); -} #endif