aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChad Austin <chad@imvu.com>2013-04-01 17:42:50 -0700
committerJukka Jylänki <jujjyl@gmail.com>2013-04-12 14:26:59 +0300
commite30dd3017a318d1f5862bd3688679c687c66d621 (patch)
tree182a7adedcfa827133912a7d61a105d1e2cb81c1
parent8b1b35d8e34496a81967b2d08e2f7900111bba5e (diff)
Restructure and generalize tuple accessors.
-rwxr-xr-xsrc/embind/embind.js28
-rwxr-xr-xsystem/include/emscripten/bind.h60
2 files changed, 31 insertions, 57 deletions
diff --git a/src/embind/embind.js b/src/embind/embind.js
index f850c73f..845bf98b 100755
--- a/src/embind/embind.js
+++ b/src/embind/embind.js
@@ -419,30 +419,34 @@ function __embind_register_tuple_element(
function __embind_register_tuple_element_accessor(
rawTupleType,
- rawElementType,
- rawStaticGetter,
+ getterReturnType,
+ getter,
getterContext,
- rawStaticSetter,
+ setterArgumentType,
+ setter,
setterContext
) {
var tupleType = requireRegisteredType(rawTupleType, 'tuple');
- rawStaticGetter = FUNCTION_TABLE[rawStaticGetter];
- rawStaticSetter = FUNCTION_TABLE[rawStaticSetter];
+ getter = FUNCTION_TABLE[getter];
+ setter = FUNCTION_TABLE[setter];
- whenDependentTypesAreResolved([], [rawElementType], function(elementType) {
- elementType = elementType[0];
+ // TODO: test incomplete registration of value tuples
+ whenDependentTypesAreResolved([], [getterReturnType, setterArgumentType], function(types) {
+ var getterReturnType = types[0];
+ var setterArgumentType = types[1];
tupleType.elements.push({
read: function(ptr) {
- return elementType.fromWireType(rawStaticGetter(
- getterContext,
- ptr));
+ return getterReturnType.fromWireType(
+ getter(
+ getterContext,
+ ptr));
},
write: function(ptr, o) {
var destructors = [];
- rawStaticSetter(
+ setter(
setterContext,
ptr,
- elementType.toWireType(destructors, o));
+ setterArgumentType.toWireType(destructors, o));
runDestructors(destructors);
}
});
diff --git a/system/include/emscripten/bind.h b/system/include/emscripten/bind.h
index 947f0b30..a002ca23 100755
--- a/system/include/emscripten/bind.h
+++ b/system/include/emscripten/bind.h
@@ -77,9 +77,10 @@ namespace emscripten {
void _embind_register_tuple_element_accessor(
TYPEID tupleType,
- TYPEID elementType,
+ TYPEID getterReturnType,
GenericFunction staticGetter,
void* getterContext,
+ TYPEID setterArgumentType,
GenericFunction staticSetter,
void* setterContext);
@@ -419,54 +420,23 @@ namespace emscripten {
return *this;
}
- template<typename ElementType>
- value_tuple& element(ElementType (*getter)(const ClassType&), void (*setter)(ClassType&, ElementType)) {
- using namespace internal;
- _embind_register_tuple_element_accessor(
- TypeID<ClassType>::get(),
- TypeID<ElementType>::get(),
- reinterpret_cast<GenericFunction>(&MemberAccess<ClassType, ElementType>::template propertyGet<ElementType(*)(const ClassType&)>),
- getContext(getter),
- reinterpret_cast<GenericFunction>(&MemberAccess<ClassType, ElementType>::template propertySet<void(*)(ClassType&, ElementType)>),
- getContext(setter));
- return *this;
- }
-
- template<typename ElementType>
- value_tuple& element(ElementType (*getter)(const ClassType&), void (*setter)(ClassType&, const ElementType&)) {
- using namespace internal;
- _embind_register_tuple_element_accessor(
- TypeID<ClassType>::get(),
- TypeID<ElementType>::get(),
- reinterpret_cast<GenericFunction>(&MemberAccess<ClassType, ElementType>::template propertyGet<ElementType(*)(const ClassType&)>),
- getContext(getter),
- reinterpret_cast<GenericFunction>(&MemberAccess<ClassType, ElementType>::template propertySet<void(*)(ClassType&, ElementType)>),
- getContext(setter));
- return *this;
- }
-
- template<typename ElementType>
- value_tuple& element(ElementType (*getter)(const ClassType&), void (*setter)(ClassType&, const ElementType&&)) {
- using namespace internal;
- _embind_register_tuple_element_accessor(
- TypeID<ClassType>::get(),
- TypeID<ElementType>::get(),
- reinterpret_cast<GenericFunction>(&MemberAccess<ClassType, ElementType>::template propertyGet<ElementType(*)(const ClassType&)>),
- getContext(getter),
- reinterpret_cast<GenericFunction>(&MemberAccess<ClassType, ElementType>::template propertySet<void(*)(ClassType&, ElementType)>),
- getContext(setter));
- return *this;
- }
-
- template<typename ElementType>
- value_tuple& element(ElementType (*getter)(const ClassType&), void (*setter)(ClassType&, ElementType&)) {
+ template<typename GetterReturnType, typename SetterArgumentType>
+ value_tuple& element(
+ GetterReturnType (*getter)(const ClassType&),
+ void (*setter)(ClassType&, SetterArgumentType)
+ ) {
using namespace internal;
_embind_register_tuple_element_accessor(
TypeID<ClassType>::get(),
- TypeID<ElementType>::get(),
- reinterpret_cast<GenericFunction>(&MemberAccess<ClassType, ElementType>::template propertyGet<ElementType(*)(const ClassType&)>),
+ TypeID<GetterReturnType>::get(),
+ reinterpret_cast<GenericFunction>(
+ &MemberAccess<ClassType, GetterReturnType>
+ ::template propertyGet<GetterReturnType(*)(const ClassType&)>),
getContext(getter),
- reinterpret_cast<GenericFunction>(&MemberAccess<ClassType, ElementType>::template propertySet<void(*)(ClassType&, ElementType)>),
+ TypeID<SetterArgumentType>::get(),
+ reinterpret_cast<GenericFunction>(
+ &MemberAccess<ClassType, SetterArgumentType>
+ ::template propertySet<void(*)(ClassType&, SetterArgumentType)>),
getContext(setter));
return *this;
}