|
1 |
| -#include <emscripten/bind.h> |
2 |
| -#ifdef USE_CXA_DEMANGLE |
3 |
| -#include <../lib/libcxxabi/include/cxxabi.h> |
4 |
| -#endif |
5 |
| -#include <list> |
6 |
| -#include <vector> |
7 |
| -#include <typeinfo> |
8 |
| -#include <algorithm> |
9 |
| -#include <emscripten/emscripten.h> |
10 |
| -#include <emscripten/wire.h> |
11 |
| -#include <climits> |
12 |
| -#include <limits> |
13 |
| - |
14 |
| -using namespace emscripten; |
15 |
| - |
16 |
| -extern "C" { |
17 |
| - const char* __attribute__((used)) __getTypeName(const std::type_info* ti) { |
18 |
| - if (has_unbound_type_names) { |
19 |
| -#ifdef USE_CXA_DEMANGLE |
20 |
| - int stat; |
21 |
| - char* demangled = abi::__cxa_demangle(ti->name(), NULL, NULL, &stat); |
22 |
| - if (stat == 0 && demangled) { |
23 |
| - return demangled; |
24 |
| - } |
25 |
| - |
26 |
| - switch (stat) { |
27 |
| - case -1: |
28 |
| - return strdup("<allocation failure>"); |
29 |
| - case -2: |
30 |
| - return strdup("<invalid C++ symbol>"); |
31 |
| - case -3: |
32 |
| - return strdup("<invalid argument>"); |
33 |
| - default: |
34 |
| - return strdup("<unknown error>"); |
35 |
| - } |
36 |
| -#else |
37 |
| - return strdup(ti->name()); |
38 |
| -#endif |
39 |
| - } else { |
40 |
| - char str[80]; |
41 |
| - sprintf(str, "%p", reinterpret_cast<const void*>(ti)); |
42 |
| - return strdup(str); |
43 |
| - } |
44 |
| - } |
45 |
| -} |
46 |
| - |
47 |
| -namespace { |
48 |
| - template<typename T> |
49 |
| - static void register_integer(const char* name) { |
50 |
| - using namespace internal; |
51 |
| - _embind_register_integer(TypeID<T>::get(), name, sizeof(T), std::numeric_limits<T>::min(), std::numeric_limits<T>::max()); |
52 |
| - } |
53 |
| - |
54 |
| - template<typename T> |
55 |
| - static void register_float(const char* name) { |
56 |
| - using namespace internal; |
57 |
| - _embind_register_float(TypeID<T>::get(), name, sizeof(T)); |
58 |
| - } |
59 |
| - |
60 |
| - |
61 |
| - // matches typeMapping in embind.js |
62 |
| - enum TypedArrayIndex { |
63 |
| - Int8Array, |
64 |
| - Uint8Array, |
65 |
| - Int16Array, |
66 |
| - Uint16Array, |
67 |
| - Int32Array, |
68 |
| - Uint32Array, |
69 |
| - Float32Array, |
70 |
| - Float64Array, |
71 |
| - }; |
72 |
| - |
73 |
| - template<typename T> |
74 |
| - constexpr TypedArrayIndex getTypedArrayIndex() { |
75 |
| - static_assert(internal::typeSupportsMemoryView<T>(), |
76 |
| - "type does not map to a typed array"); |
77 |
| - return std::is_floating_point<T>::value |
78 |
| - ? (sizeof(T) == 4 |
79 |
| - ? Float32Array |
80 |
| - : Float64Array) |
81 |
| - : (sizeof(T) == 1 |
82 |
| - ? (std::is_signed<T>::value ? Int8Array : Uint8Array) |
83 |
| - : (sizeof(T) == 2 |
84 |
| - ? (std::is_signed<T>::value ? Int16Array : Uint16Array) |
85 |
| - : (std::is_signed<T>::value ? Int32Array : Uint32Array))); |
86 |
| - } |
87 |
| - |
88 |
| - template<typename T> |
89 |
| - static void register_memory_view(const char* name) { |
90 |
| - using namespace internal; |
91 |
| - _embind_register_memory_view(TypeID<memory_view<T>>::get(), getTypedArrayIndex<T>(), name); |
92 |
| - } |
93 |
| -} |
94 |
| - |
95 |
| -EMSCRIPTEN_BINDINGS(native_and_builtin_types) { |
96 |
| - using namespace emscripten::internal; |
97 |
| - |
98 |
| - _embind_register_void(TypeID<void>::get(), "void"); |
99 |
| - |
100 |
| - _embind_register_bool(TypeID<bool>::get(), "bool", sizeof(bool), true, false); |
101 |
| - |
102 |
| - register_integer<char>("char"); |
103 |
| - register_integer<signed char>("signed char"); |
104 |
| - register_integer<unsigned char>("unsigned char"); |
105 |
| - register_integer<signed short>("short"); |
106 |
| - register_integer<unsigned short>("unsigned short"); |
107 |
| - register_integer<signed int>("int"); |
108 |
| - register_integer<unsigned int>("unsigned int"); |
109 |
| - register_integer<signed long>("long"); |
110 |
| - register_integer<unsigned long>("unsigned long"); |
111 |
| - |
112 |
| - register_float<float>("float"); |
113 |
| - register_float<double>("double"); |
114 |
| - |
115 |
| - _embind_register_std_string(TypeID<std::string>::get(), "std::string"); |
116 |
| - _embind_register_std_string(TypeID<std::basic_string<unsigned char> >::get(), "std::basic_string<unsigned char>"); |
117 |
| - _embind_register_std_wstring(TypeID<std::wstring>::get(), sizeof(wchar_t), "std::wstring"); |
118 |
| - _embind_register_emval(TypeID<val>::get(), "emscripten::val"); |
119 |
| - |
120 |
| - // Some of these types are aliases for each other. Luckily, |
121 |
| - // embind.js's _embind_register_memory_view ignores duplicate |
122 |
| - // registrations rather than asserting, so the first |
123 |
| - // register_memory_view call for a particular type will take |
124 |
| - // precedence. |
125 |
| - |
126 |
| - register_memory_view<char>("emscripten::memory_view<char>"); |
127 |
| - register_memory_view<signed char>("emscripten::memory_view<signed char>"); |
128 |
| - register_memory_view<unsigned char>("emscripten::memory_view<unsigned char>"); |
129 |
| - |
130 |
| - register_memory_view<short>("emscripten::memory_view<short>"); |
131 |
| - register_memory_view<unsigned short>("emscripten::memory_view<unsigned short>"); |
132 |
| - register_memory_view<int>("emscripten::memory_view<int>"); |
133 |
| - register_memory_view<unsigned int>("emscripten::memory_view<unsigned int>"); |
134 |
| - register_memory_view<long>("emscripten::memory_view<long>"); |
135 |
| - register_memory_view<unsigned long>("emscripten::memory_view<unsigned long>"); |
136 |
| - |
137 |
| - register_memory_view<int8_t>("emscripten::memory_view<int8_t>"); |
138 |
| - register_memory_view<uint8_t>("emscripten::memory_view<uint8_t>"); |
139 |
| - register_memory_view<int16_t>("emscripten::memory_view<int16_t>"); |
140 |
| - register_memory_view<uint16_t>("emscripten::memory_view<uint16_t>"); |
141 |
| - register_memory_view<int32_t>("emscripten::memory_view<int32_t>"); |
142 |
| - register_memory_view<uint32_t>("emscripten::memory_view<uint32_t>"); |
143 |
| - |
144 |
| - register_memory_view<float>("emscripten::memory_view<float>"); |
145 |
| - register_memory_view<double>("emscripten::memory_view<double>"); |
146 |
| -#if __SIZEOF_LONG_DOUBLE__ == __SIZEOF_DOUBLE__ |
147 |
| - register_memory_view<long double>("emscripten::memory_view<long double>"); |
148 |
| -#endif |
149 |
| -} |
| 1 | +#include <emscripten/bind.h> |
| 2 | +#ifdef USE_CXA_DEMANGLE |
| 3 | +#include <../lib/libcxxabi/include/cxxabi.h> |
| 4 | +#endif |
| 5 | +#include <list> |
| 6 | +#include <vector> |
| 7 | +#include <typeinfo> |
| 8 | +#include <algorithm> |
| 9 | +#include <emscripten/emscripten.h> |
| 10 | +#include <emscripten/wire.h> |
| 11 | +#include <climits> |
| 12 | +#include <limits> |
| 13 | + |
| 14 | +using namespace emscripten; |
| 15 | + |
| 16 | +extern "C" { |
| 17 | + const char* __attribute__((used)) __getTypeName(const std::type_info* ti) { |
| 18 | + if (has_unbound_type_names) { |
| 19 | +#ifdef USE_CXA_DEMANGLE |
| 20 | + int stat; |
| 21 | + char* demangled = abi::__cxa_demangle(ti->name(), NULL, NULL, &stat); |
| 22 | + if (stat == 0 && demangled) { |
| 23 | + return demangled; |
| 24 | + } |
| 25 | + |
| 26 | + switch (stat) { |
| 27 | + case -1: |
| 28 | + return strdup("<allocation failure>"); |
| 29 | + case -2: |
| 30 | + return strdup("<invalid C++ symbol>"); |
| 31 | + case -3: |
| 32 | + return strdup("<invalid argument>"); |
| 33 | + default: |
| 34 | + return strdup("<unknown error>"); |
| 35 | + } |
| 36 | +#else |
| 37 | + return strdup(ti->name()); |
| 38 | +#endif |
| 39 | + } else { |
| 40 | + char str[80]; |
| 41 | + sprintf(str, "%p", reinterpret_cast<const void*>(ti)); |
| 42 | + return strdup(str); |
| 43 | + } |
| 44 | + } |
| 45 | +} |
| 46 | + |
| 47 | +namespace { |
| 48 | + template<typename T> |
| 49 | + static void register_integer(const char* name) { |
| 50 | + using namespace internal; |
| 51 | + _embind_register_integer(TypeID<T>::get(), name, sizeof(T), std::numeric_limits<T>::min(), std::numeric_limits<T>::max()); |
| 52 | + } |
| 53 | + |
| 54 | + template<typename T> |
| 55 | + static void register_float(const char* name) { |
| 56 | + using namespace internal; |
| 57 | + _embind_register_float(TypeID<T>::get(), name, sizeof(T)); |
| 58 | + } |
| 59 | + |
| 60 | + |
| 61 | + // matches typeMapping in embind.js |
| 62 | + enum TypedArrayIndex { |
| 63 | + Int8Array, |
| 64 | + Uint8Array, |
| 65 | + Int16Array, |
| 66 | + Uint16Array, |
| 67 | + Int32Array, |
| 68 | + Uint32Array, |
| 69 | + Float32Array, |
| 70 | + Float64Array, |
| 71 | + }; |
| 72 | + |
| 73 | + template<typename T> |
| 74 | + constexpr TypedArrayIndex getTypedArrayIndex() { |
| 75 | + static_assert(internal::typeSupportsMemoryView<T>(), |
| 76 | + "type does not map to a typed array"); |
| 77 | + return std::is_floating_point<T>::value |
| 78 | + ? (sizeof(T) == 4 |
| 79 | + ? Float32Array |
| 80 | + : Float64Array) |
| 81 | + : (sizeof(T) == 1 |
| 82 | + ? (std::is_signed<T>::value ? Int8Array : Uint8Array) |
| 83 | + : (sizeof(T) == 2 |
| 84 | + ? (std::is_signed<T>::value ? Int16Array : Uint16Array) |
| 85 | + : (std::is_signed<T>::value ? Int32Array : Uint32Array))); |
| 86 | + } |
| 87 | + |
| 88 | + template<typename T> |
| 89 | + static void register_memory_view(const char* name) { |
| 90 | + using namespace internal; |
| 91 | + _embind_register_memory_view(TypeID<memory_view<T>>::get(), getTypedArrayIndex<T>(), name); |
| 92 | + } |
| 93 | +} |
| 94 | + |
| 95 | +EMSCRIPTEN_BINDINGS(native_and_builtin_types) { |
| 96 | + using namespace emscripten::internal; |
| 97 | + |
| 98 | + _embind_register_void(TypeID<void>::get(), "void"); |
| 99 | + |
| 100 | + _embind_register_bool(TypeID<bool>::get(), "bool", sizeof(bool), true, false); |
| 101 | + |
| 102 | + register_integer<char>("char"); |
| 103 | + register_integer<signed char>("signed char"); |
| 104 | + register_integer<unsigned char>("unsigned char"); |
| 105 | + register_integer<signed short>("short"); |
| 106 | + register_integer<unsigned short>("unsigned short"); |
| 107 | + register_integer<signed int>("int"); |
| 108 | + register_integer<unsigned int>("unsigned int"); |
| 109 | + register_integer<signed long>("long"); |
| 110 | + register_integer<unsigned long>("unsigned long"); |
| 111 | + |
| 112 | + register_float<float>("float"); |
| 113 | + register_float<double>("double"); |
| 114 | + |
| 115 | + _embind_register_std_string(TypeID<std::string>::get(), "std::string"); |
| 116 | + _embind_register_std_string(TypeID<std::basic_string<unsigned char> >::get(), "std::basic_string<unsigned char>"); |
| 117 | + _embind_register_std_wstring(TypeID<std::wstring>::get(), sizeof(wchar_t), "std::wstring"); |
| 118 | + _embind_register_emval(TypeID<val>::get(), "emscripten::val"); |
| 119 | + |
| 120 | + // Some of these types are aliases for each other. Luckily, |
| 121 | + // embind.js's _embind_register_memory_view ignores duplicate |
| 122 | + // registrations rather than asserting, so the first |
| 123 | + // register_memory_view call for a particular type will take |
| 124 | + // precedence. |
| 125 | + |
| 126 | + register_memory_view<char>("emscripten::memory_view<char>"); |
| 127 | + register_memory_view<signed char>("emscripten::memory_view<signed char>"); |
| 128 | + register_memory_view<unsigned char>("emscripten::memory_view<unsigned char>"); |
| 129 | + |
| 130 | + register_memory_view<short>("emscripten::memory_view<short>"); |
| 131 | + register_memory_view<unsigned short>("emscripten::memory_view<unsigned short>"); |
| 132 | + register_memory_view<int>("emscripten::memory_view<int>"); |
| 133 | + register_memory_view<unsigned int>("emscripten::memory_view<unsigned int>"); |
| 134 | + register_memory_view<long>("emscripten::memory_view<long>"); |
| 135 | + register_memory_view<unsigned long>("emscripten::memory_view<unsigned long>"); |
| 136 | + |
| 137 | + register_memory_view<int8_t>("emscripten::memory_view<int8_t>"); |
| 138 | + register_memory_view<uint8_t>("emscripten::memory_view<uint8_t>"); |
| 139 | + register_memory_view<int16_t>("emscripten::memory_view<int16_t>"); |
| 140 | + register_memory_view<uint16_t>("emscripten::memory_view<uint16_t>"); |
| 141 | + register_memory_view<int32_t>("emscripten::memory_view<int32_t>"); |
| 142 | + register_memory_view<uint32_t>("emscripten::memory_view<uint32_t>"); |
| 143 | + |
| 144 | + register_memory_view<float>("emscripten::memory_view<float>"); |
| 145 | + register_memory_view<double>("emscripten::memory_view<double>"); |
| 146 | +#if __SIZEOF_LONG_DOUBLE__ == __SIZEOF_DOUBLE__ |
| 147 | + register_memory_view<long double>("emscripten::memory_view<long double>"); |
| 148 | +#endif |
| 149 | +} |
0 commit comments