diff options
-rw-r--r-- | system/include/emscripten/bind.h | 116 | ||||
-rw-r--r-- | system/include/emscripten/val.h | 14 | ||||
-rw-r--r-- | system/include/emscripten/wire.h | 34 | ||||
-rwxr-xr-x | system/lib/embind/bind.cpp | 30 |
4 files changed, 106 insertions, 88 deletions
diff --git a/system/include/emscripten/bind.h b/system/include/emscripten/bind.h index 55fda986..400a9472 100644 --- a/system/include/emscripten/bind.h +++ b/system/include/emscripten/bind.h @@ -19,56 +19,56 @@ namespace emscripten { const char* payload) __attribute__((noreturn)); void _embind_register_void( - TypeID voidType, + TYPEID voidType, const char* name); void _embind_register_bool( - TypeID boolType, + TYPEID boolType, const char* name, bool trueValue, bool falseValue); void _embind_register_integer( - TypeID integerType, + TYPEID integerType, const char* name); void _embind_register_float( - TypeID floatType, + TYPEID floatType, const char* name); void _embind_register_cstring( - TypeID stringType, + TYPEID stringType, const char* name); void _embind_register_emval( - TypeID emvalType, + TYPEID emvalType, const char* name); void _embind_register_function( const char* name, - TypeID returnType, + TYPEID returnType, unsigned argCount, - TypeID argTypes[], + TYPEID argTypes[], GenericFunction invoker, GenericFunction function); void _embind_register_tuple( - TypeID tupleType, + TYPEID tupleType, const char* name, GenericFunction constructor, GenericFunction destructor); void _embind_register_tuple_element( - TypeID tupleType, - TypeID elementType, + TYPEID tupleType, + TYPEID elementType, GenericFunction getter, GenericFunction setter, size_t memberPointerSize, void* memberPointer); void _embind_register_tuple_element_accessor( - TypeID tupleType, - TypeID elementType, + TYPEID tupleType, + TYPEID elementType, GenericFunction staticGetter, size_t getterSize, void* getter, @@ -77,69 +77,69 @@ namespace emscripten { void* setter); void _embind_register_struct( - TypeID structType, + TYPEID structType, const char* name, GenericFunction constructor, GenericFunction destructor); void _embind_register_struct_field( - TypeID structType, + TYPEID structType, const char* name, - TypeID fieldType, + TYPEID fieldType, GenericFunction getter, GenericFunction setter, size_t memberPointerSize, void* memberPointer); void _embind_register_class( - TypeID classType, + TYPEID classType, const char* className, GenericFunction destructor); void _embind_register_class_constructor( - TypeID classType, + TYPEID classType, unsigned argCount, - TypeID argTypes[], + TYPEID argTypes[], GenericFunction constructor); void _embind_register_class_method( - TypeID classType, + TYPEID classType, const char* methodName, - TypeID returnType, + TYPEID returnType, unsigned argCount, - TypeID argTypes[], + TYPEID argTypes[], GenericFunction invoker, size_t memberFunctionSize, void* memberFunction); void _embind_register_class_field( - TypeID classType, + TYPEID classType, const char* fieldName, - TypeID fieldType, + TYPEID fieldType, GenericFunction getter, GenericFunction setter, size_t memberPointerSize, void* memberPointer); void _embind_register_class_classmethod( - TypeID classType, + TYPEID classType, const char* methodName, - TypeID returnType, + TYPEID returnType, unsigned argCount, - TypeID argTypes[], + TYPEID argTypes[], GenericFunction method); void _embind_register_enum( - TypeID enumType, + TYPEID enumType, const char* name); void _embind_register_enum_value( - TypeID enumType, + TYPEID enumType, const char* valueName, GenericEnumValue value); void _embind_register_interface( - TypeID interfaceType, + TYPEID interfaceType, const char* name, GenericFunction constructor, GenericFunction destructor); @@ -193,7 +193,7 @@ namespace emscripten { internal::ArgTypeList<Args...> args; internal::_embind_register_function( name, - internal::getTypeID<ReturnType>(), + internal::TypeID<ReturnType>::get(), args.count, args.types, reinterpret_cast<internal::GenericFunction>(&internal::Invoker<ReturnType, Args...>::invoke), @@ -321,7 +321,7 @@ namespace emscripten { value_tuple(const char* name) { internal::registerStandardTypes(); internal::_embind_register_tuple( - internal::getTypeID<ClassType>(), + internal::TypeID<ClassType>::get(), name, reinterpret_cast<internal::GenericFunction>(&internal::raw_constructor<ClassType>), reinterpret_cast<internal::GenericFunction>(&internal::raw_destructor<ClassType>)); @@ -330,8 +330,8 @@ namespace emscripten { template<typename ElementType> value_tuple& element(ElementType ClassType::*field) { internal::_embind_register_tuple_element( - internal::getTypeID<ClassType>(), - internal::getTypeID<ElementType>(), + internal::TypeID<ClassType>::get(), + internal::TypeID<ElementType>::get(), reinterpret_cast<internal::GenericFunction>(&internal::FieldAccess<ClassType, ElementType>::get), reinterpret_cast<internal::GenericFunction>(&internal::FieldAccess<ClassType, ElementType>::set), sizeof(field), @@ -343,8 +343,8 @@ namespace emscripten { template<typename ElementType> value_tuple& element(ElementType (*getter)(const ClassType&), void (*setter)(ClassType&, ElementType)) { internal::_embind_register_tuple_element_accessor( - internal::getTypeID<ClassType>(), - internal::getTypeID<ElementType>(), + internal::TypeID<ClassType>::get(), + internal::TypeID<ElementType>::get(), reinterpret_cast<internal::GenericFunction>(&internal::FieldAccess<ClassType, ElementType>::template propertyGet<ElementType(const ClassType&)>), sizeof(getter), &getter, @@ -357,8 +357,8 @@ namespace emscripten { template<typename ElementType> value_tuple& element(ElementType (*getter)(const ClassType&), void (*setter)(ClassType&, const ElementType&)) { internal::_embind_register_tuple_element_accessor( - internal::getTypeID<ClassType>(), - internal::getTypeID<ElementType>(), + internal::TypeID<ClassType>::get(), + internal::TypeID<ElementType>::get(), reinterpret_cast<internal::GenericFunction>(&internal::FieldAccess<ClassType, ElementType>::template propertyGet<ElementType(const ClassType&)>), sizeof(getter), &getter, @@ -371,8 +371,8 @@ namespace emscripten { template<typename ElementType> value_tuple& element(ElementType (*getter)(const ClassType&), void (*setter)(ClassType&, const ElementType&&)) { internal::_embind_register_tuple_element_accessor( - internal::getTypeID<ClassType>(), - internal::getTypeID<ElementType>(), + internal::TypeID<ClassType>::get(), + internal::TypeID<ElementType>::get(), reinterpret_cast<internal::GenericFunction>(&internal::FieldAccess<ClassType, ElementType>::template propertyGet<ElementType(const ClassType&)>), sizeof(getter), &getter, @@ -385,8 +385,8 @@ namespace emscripten { template<typename ElementType> value_tuple& element(ElementType (*getter)(const ClassType&), void (*setter)(ClassType&, ElementType&)) { internal::_embind_register_tuple_element_accessor( - internal::getTypeID<ClassType>(), - internal::getTypeID<ElementType>(), + internal::TypeID<ClassType>::get(), + internal::TypeID<ElementType>::get(), reinterpret_cast<internal::GenericFunction>(&internal::FieldAccess<ClassType, ElementType>::template propertyGet<ElementType(const ClassType&)>), sizeof(getter), &getter, @@ -403,7 +403,7 @@ namespace emscripten { value_struct(const char* name) { internal::registerStandardTypes(); internal::_embind_register_struct( - internal::getTypeID<ClassType>(), + internal::TypeID<ClassType>::get(), name, reinterpret_cast<internal::GenericFunction>(&internal::raw_constructor<ClassType>), reinterpret_cast<internal::GenericFunction>(&internal::raw_destructor<ClassType>)); @@ -412,9 +412,9 @@ namespace emscripten { template<typename FieldType> value_struct& field(const char* fieldName, FieldType ClassType::*field) { internal::_embind_register_struct_field( - internal::getTypeID<ClassType>(), + internal::TypeID<ClassType>::get(), fieldName, - internal::getTypeID<FieldType>(), + internal::TypeID<FieldType>::get(), reinterpret_cast<internal::GenericFunction>(&internal::FieldAccess<ClassType, FieldType>::get), reinterpret_cast<internal::GenericFunction>(&internal::FieldAccess<ClassType, FieldType>::set), sizeof(field), @@ -432,7 +432,7 @@ namespace emscripten { class_(const char* name) { internal::registerStandardTypes(); internal::_embind_register_class( - internal::getTypeID<ClassType>(), + internal::TypeID<ClassType>::get(), name, reinterpret_cast<internal::GenericFunction>(&internal::raw_destructor<ClassType>)); } @@ -441,7 +441,7 @@ namespace emscripten { class_& constructor() { internal::ArgTypeList<ConstructorArgs...> args; internal::_embind_register_class_constructor( - internal::getTypeID<ClassType>(), + internal::TypeID<ClassType>::get(), args.count, args.types, reinterpret_cast<internal::GenericFunction>(&internal::raw_constructor<ClassType, ConstructorArgs...>)); @@ -452,9 +452,9 @@ namespace emscripten { class_& method(const char* methodName, ReturnType (ClassType::*memberFunction)(Args...)) { internal::ArgTypeList<Args...> args; internal::_embind_register_class_method( - internal::getTypeID<ClassType>(), + internal::TypeID<ClassType>::get(), methodName, - internal::getTypeID<ReturnType>(), + internal::TypeID<ReturnType>::get(), args.count, args.types, reinterpret_cast<internal::GenericFunction>(&internal::MethodInvoker<ClassType, ReturnType, Args...>::invoke), @@ -467,9 +467,9 @@ namespace emscripten { class_& method(const char* methodName, ReturnType (ClassType::*memberFunction)(Args...) const) { internal::ArgTypeList<Args...> args; internal::_embind_register_class_method( - internal::getTypeID<ClassType>(), + internal::TypeID<ClassType>::get(), methodName, - internal::getTypeID<ReturnType>(), + internal::TypeID<ReturnType>::get(), args.count, args.types, reinterpret_cast<internal::GenericFunction>(&internal::ConstMethodInvoker<ClassType, ReturnType, Args...>::invoke), @@ -481,9 +481,9 @@ namespace emscripten { template<typename FieldType> class_& field(const char* fieldName, FieldType ClassType::*field) { internal::_embind_register_class_field( - internal::getTypeID<ClassType>(), + internal::TypeID<ClassType>::get(), fieldName, - internal::getTypeID<FieldType>(), + internal::TypeID<FieldType>::get(), reinterpret_cast<internal::GenericFunction>(&internal::FieldAccess<ClassType, FieldType>::get), reinterpret_cast<internal::GenericFunction>(&internal::FieldAccess<ClassType, FieldType>::set), sizeof(field), @@ -495,9 +495,9 @@ namespace emscripten { class_& classmethod(const char* methodName, ReturnType (*classMethod)(Args...)) { internal::ArgTypeList<Args...> args; internal::_embind_register_class_classmethod( - internal::getTypeID<ClassType>(), + internal::TypeID<ClassType>::get(), methodName, - internal::getTypeID<ReturnType>(), + internal::TypeID<ReturnType>::get(), args.count, args.types, reinterpret_cast<internal::GenericFunction>(classMethod)); @@ -510,7 +510,7 @@ namespace emscripten { public: enum_(const char* name) { _embind_register_enum( - internal::getTypeID<EnumType>(), + internal::TypeID<EnumType>::get(), name); } @@ -520,7 +520,7 @@ namespace emscripten { static_assert(sizeof(value) <= sizeof(internal::GenericEnumValue), "enum type must fit in a GenericEnumValue"); _embind_register_enum_value( - internal::getTypeID<EnumType>(), + internal::TypeID<EnumType>::get(), name, static_cast<internal::GenericEnumValue>(value)); return *this; @@ -637,7 +637,7 @@ namespace emscripten { interface(const char* name) { _embind_register_interface( - internal::getTypeID<InterfaceType>(), + internal::TypeID<InterfaceType>::get(), name, reinterpret_cast<internal::GenericFunction>(&internal::create_interface_wrapper<WrapperType>), reinterpret_cast<internal::GenericFunction>(&internal::raw_destructor<WrapperType>)); diff --git a/system/include/emscripten/val.h b/system/include/emscripten/val.h index 96db9326..6dd4021c 100644 --- a/system/include/emscripten/val.h +++ b/system/include/emscripten/val.h @@ -19,17 +19,17 @@ namespace emscripten { EM_VAL _emval_get_property_by_unsigned_long(EM_VAL object, unsigned long key); void _emval_set_property(EM_VAL object, const char* key, EM_VAL value); void _emval_set_property_by_int(EM_VAL object, long key, EM_VAL value); - void _emval_as(EM_VAL value, emscripten::internal::TypeID returnType); + void _emval_as(EM_VAL value, emscripten::internal::TYPEID returnType); EM_VAL _emval_call( EM_VAL value, unsigned argCount, - internal::TypeID argTypes[] + internal::TYPEID argTypes[] /*, ... */); EM_VAL _emval_call_method( EM_VAL value, const char* methodName, unsigned argCount, - internal::TypeID argTypes[] + internal::TYPEID argTypes[] /*, ... */); } } @@ -106,7 +106,7 @@ namespace emscripten { typedef internal::EM_VAL (*TypedCall)( internal::EM_VAL, unsigned, - internal::TypeID argTypes[], + internal::TYPEID argTypes[], typename internal::BindingType<Args>::WireType...); TypedCall typedCall = reinterpret_cast<TypedCall>(&internal::_emval_call); return val( @@ -124,7 +124,7 @@ namespace emscripten { internal::EM_VAL, const char* name, unsigned, - internal::TypeID argTypes[], + internal::TYPEID argTypes[], typename internal::BindingType<Args>::WireType...); TypedCall typedCall = reinterpret_cast<TypedCall>(&internal::_emval_call_method); return val( @@ -142,10 +142,10 @@ namespace emscripten { typedef typename BT::WireType (*TypedAs)( internal::EM_VAL value, - emscripten::internal::TypeID returnType); + emscripten::internal::TYPEID returnType); TypedAs typedAs = reinterpret_cast<TypedAs>(&internal::_emval_as); - typename BT::WireType wt = typedAs(handle, internal::getTypeID<T>()); + typename BT::WireType wt = typedAs(handle, internal::TypeID<T>::get()); internal::WireDeleter<T> deleter(wt); return BT::fromWireType(wt); } diff --git a/system/include/emscripten/wire.h b/system/include/emscripten/wire.h index fbf0897d..dcfd09d0 100644 --- a/system/include/emscripten/wire.h +++ b/system/include/emscripten/wire.h @@ -9,7 +9,7 @@ namespace emscripten { namespace internal { - typedef const struct _TypeID* TypeID; + typedef const struct _TYPEID* TYPEID; // This implementation is technically not legal, as it's not // required that two calls to typeid produce the same exact @@ -18,9 +18,18 @@ namespace emscripten { // an int, and store all TypeInfo we see in a map, allocating // new TypeIDs as we add new items to the map. template<typename T> - inline TypeID getTypeID() { - return reinterpret_cast<TypeID>(&typeid(T)); - } + struct TypeID { + static TYPEID get() { + return reinterpret_cast<TYPEID>(&typeid(T)); + } + }; + + template<typename T> + struct TypeID<std::unique_ptr<T>> { + static TYPEID get() { + return TypeID<T>::get(); + } + }; // count<> @@ -44,14 +53,14 @@ namespace emscripten { template<> struct ArgTypes<> { - static void fill(TypeID* argTypes) { + static void fill(TYPEID* argTypes) { } }; template<typename T, typename... Args> struct ArgTypes<T, Args...> { - static void fill(TypeID* argTypes) { - *argTypes = getTypeID<T>(); + static void fill(TYPEID* argTypes) { + *argTypes = TypeID<T>::get(); return ArgTypes<Args...>::fill(argTypes + 1); } }; @@ -66,7 +75,7 @@ namespace emscripten { } unsigned count; - TypeID types[args_count]; + TYPEID types[args_count]; }; // BindingType<T> @@ -192,6 +201,15 @@ namespace emscripten { }; template<typename T> + struct GenericBindingType<std::unique_ptr<T>> { + typedef typename BindingType<T>::WireType WireType; + + static WireType toWireType(std::unique_ptr<T> p) { + return BindingType<T>::toWireType(*p); + } + }; + + template<typename T> struct WireDeleter { typedef typename BindingType<T>::WireType WireType; diff --git a/system/lib/embind/bind.cpp b/system/lib/embind/bind.cpp index b63a86aa..befce08b 100755 --- a/system/lib/embind/bind.cpp +++ b/system/lib/embind/bind.cpp @@ -9,25 +9,25 @@ namespace emscripten { if (first) {
first = false;
- _embind_register_void(getTypeID<void>(), "void");
+ _embind_register_void(TypeID<void>::get(), "void");
- _embind_register_bool(getTypeID<bool>(), "bool", true, false);
+ _embind_register_bool(TypeID<bool>::get(), "bool", true, false);
- _embind_register_integer(getTypeID<char>(), "char");
- _embind_register_integer(getTypeID<signed char>(), "signed char");
- _embind_register_integer(getTypeID<unsigned char>(), "unsigned char");
- _embind_register_integer(getTypeID<signed short>(), "short");
- _embind_register_integer(getTypeID<unsigned short>(), "unsigned short");
- _embind_register_integer(getTypeID<signed int>(), "int");
- _embind_register_integer(getTypeID<unsigned int>(), "unsigned int");
- _embind_register_integer(getTypeID<signed long>(), "long");
- _embind_register_integer(getTypeID<unsigned long>(), "unsigned long");
+ _embind_register_integer(TypeID<char>::get(), "char");
+ _embind_register_integer(TypeID<signed char>::get(), "signed char");
+ _embind_register_integer(TypeID<unsigned char>::get(), "unsigned char");
+ _embind_register_integer(TypeID<signed short>::get(), "short");
+ _embind_register_integer(TypeID<unsigned short>::get(), "unsigned short");
+ _embind_register_integer(TypeID<signed int>::get(), "int");
+ _embind_register_integer(TypeID<unsigned int>::get(), "unsigned int");
+ _embind_register_integer(TypeID<signed long>::get(), "long");
+ _embind_register_integer(TypeID<unsigned long>::get(), "unsigned long");
- _embind_register_float(getTypeID<float>(), "float");
- _embind_register_float(getTypeID<double>(), "double");
+ _embind_register_float(TypeID<float>::get(), "float");
+ _embind_register_float(TypeID<double>::get(), "double");
- _embind_register_cstring(getTypeID<std::string>(), "std::string");
- _embind_register_emval(getTypeID<val>(), "emscripten::val");
+ _embind_register_cstring(TypeID<std::string>::get(), "std::string");
+ _embind_register_emval(TypeID<val>::get(), "emscripten::val");
}
}
}
|