#include #ifdef USE_CXA_DEMANGLE #include <../lib/libcxxabi/include/cxxabi.h> #endif #include #include #include #include #include #include #include using namespace emscripten; extern "C" { const char* __attribute__((used)) __getTypeName(const std::type_info* ti) { if (has_unbound_type_names) { #ifdef USE_CXA_DEMANGLE int stat; char* demangled = abi::__cxa_demangle(ti->name(), NULL, NULL, &stat); if (stat == 0 && demangled) { return demangled; } switch (stat) { case -1: return strdup(""); case -2: return strdup(""); case -3: return strdup(""); default: return strdup(""); } #else return strdup(ti->name()); #endif } else { char str[80]; sprintf(str, "%p", ti); return strdup(str); } } } namespace { template static void register_integer(const char* name) { using namespace internal; _embind_register_integer(TypeID::get(), name, sizeof(T), std::numeric_limits::min(), std::numeric_limits::max()); } template static void register_float(const char* name) { using namespace internal; _embind_register_float(TypeID::get(), name, sizeof(T)); } } EMSCRIPTEN_BINDINGS(native_and_builtin_types) { using namespace emscripten::internal; _embind_register_void(TypeID::get(), "void"); _embind_register_bool(TypeID::get(), "bool", sizeof(bool), true, false); register_integer("char"); register_integer("signed char"); register_integer("unsigned char"); register_integer("short"); register_integer("unsigned short"); register_integer("int"); register_integer("unsigned int"); register_integer("long"); register_integer("unsigned long"); register_float("float"); register_float("double"); _embind_register_std_string(TypeID::get(), "std::string"); _embind_register_std_string(TypeID >::get(), "std::basic_string"); _embind_register_std_wstring(TypeID::get(), sizeof(wchar_t), "std::wstring"); _embind_register_emval(TypeID::get(), "emscripten::val"); _embind_register_memory_view(TypeID::get(), "emscripten::memory_view"); }