aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChad Austin <chad@imvu.com>2013-02-25 18:29:41 -0800
committerJukka Jylänki <jujjyl@gmail.com>2013-04-12 14:24:09 +0300
commit07cd277b4df9308db695d8a96ab570b4205b9622 (patch)
tree443734b86214c8c6101cd1b542ce4490523202ff
parent176000557d9d25d6eb14511413e23321ea94e0aa (diff)
Use standard method machinery for array access.
-rwxr-xr-xsrc/embind/embind.js67
-rwxr-xr-xsystem/include/emscripten/bind.h72
2 files changed, 19 insertions, 120 deletions
diff --git a/src/embind/embind.js b/src/embind/embind.js
index 21eca35e..c7848d9c 100755
--- a/src/embind/embind.js
+++ b/src/embind/embind.js
@@ -863,73 +863,6 @@ function __embind_register_class_classmethod(
});
}
-function __embind_register_class_operator_array_get(
- rawClassType,
- elementType,
- indexType,
- rawInvoker
-) {
- rawInvoker = FUNCTION_TABLE[rawInvoker];
- requestDeferredRegistration(function() {
- var classType = requireRegisteredType(rawClassType, 'class');
- indexType = requireRegisteredType(indexType, 'array access index ' + classType.name);
- elementType = requireRegisteredType(elementType, 'array access element' + classType.name);
- var humanName = classType.name + '.' + 'operator_array_get';
- classType.Handle.prototype.array_get = function() {
- if (!this.$$.ptr) {
- throw new BindingError('cannot call emscripten binding method ' + humanName + ' on deleted object');
- }
-
- if (arguments.length !== 1) {
- throw new BindingError('emscripten binding method ' + humanName + ' called with ' + arguments.length + ' arguments, expected ' + 1);
- }
-
- var destructors = [];
- var args = new Array(2);
- args[0] = this.$$.ptr;
- args[1] = indexType.toWireType(destructors, arguments[0]);
-
- var rv = elementType.fromWireType(rawInvoker.apply(null, args));
- runDestructors(destructors);
- return rv;
- };
- });
-}
-
-function __embind_register_class_operator_array_set(
- rawClassType,
- elementType,
- rawIndexType,
- rawInvoker
-) {
- rawInvoker = FUNCTION_TABLE[rawInvoker];
- requestDeferredRegistration(function() {
- var classType = requireRegisteredType(rawClassType, 'class');
- var indexType = requireRegisteredType(rawIndexType, 'array access index ' + classType.name);
- elementType = requireRegisteredType(elementType, 'array access element ' + classType.name);
- var humanName = classType.name + '.' + 'operator_array_get';
- classType.Handle.prototype.array_set = function() {
- if (!this.$$.ptr) {
- throw new BindingError('cannot call emscripten binding method ' + humanName + ' on deleted object');
- }
-
- if (arguments.length !== 2) {
- throw new BindingError('emscripten binding method ' + humanName + ' called with ' + arguments.length + ' arguments, expected ' + 2);
- }
-
- var destructors = [];
- var args = new Array(2);
- args[0] = this.$$.ptr;
- args[1] = indexType.toWireType(destructors, arguments[0]);
- args[2] = elementType.toWireType(destructors, arguments[1]);
-
- var rv = elementType.fromWireType(rawInvoker.apply(null, args));
- runDestructors(destructors);
- return rv;
- };
- });
-}
-
function __embind_register_class_field(
rawClassType,
fieldName,
diff --git a/system/include/emscripten/bind.h b/system/include/emscripten/bind.h
index c83512c7..d99dd763 100755
--- a/system/include/emscripten/bind.h
+++ b/system/include/emscripten/bind.h
@@ -141,18 +141,6 @@ namespace emscripten {
GenericFunction invoker,
GenericFunction method);
- void _embind_register_class_operator_array_get(
- TYPEID classType,
- TYPEID elementType,
- TYPEID indexType,
- GenericFunction invoker);
-
- void _embind_register_class_operator_array_set(
- TYPEID classType,
- TYPEID elementType,
- TYPEID indexType,
- GenericFunction invoker);
-
void _embind_register_enum(
TYPEID enumType,
const char* name);
@@ -325,29 +313,6 @@ namespace emscripten {
}
};
- template<typename ClassType, typename ElementType, typename IndexType>
- struct ArrayAccessGetInvoker {
- static typename internal::BindingType<ElementType>::WireType invoke(
- ClassType* ptr,
- typename internal::BindingType<IndexType>::WireType index
- ) {
- return internal::BindingType<ElementType>::toWireType(
- (*ptr)[internal::BindingType<IndexType>::fromWireType(index)]
- );
- }
- };
-
- template<typename ClassType, typename ElementType, typename IndexType>
- struct ArrayAccessSetInvoker {
- static void invoke(
- ClassType* ptr,
- typename internal::BindingType<IndexType>::WireType index,
- typename internal::BindingType<ElementType>::WireType item
- ) {
- (*ptr)[internal::BindingType<IndexType>::fromWireType(index)] = internal::BindingType<ElementType>::fromWireType(item);
- }
- };
-
template<typename ClassType, typename ReturnType, typename... Args>
struct FunctionInvoker {
typedef ReturnType (FunctionPointer)(ClassType& ct, Args...);
@@ -357,7 +322,7 @@ namespace emscripten {
typename internal::BindingType<Args>::WireType... args
) {
return internal::BindingType<ReturnType>::toWireType(
- (*function)(*ptr, internal::BindingType<Args>::toWireType(args)...)
+ (*function)(*ptr, internal::BindingType<Args>::fromWireType(args)...)
);
}
};
@@ -370,7 +335,7 @@ namespace emscripten {
FunctionPointer** function,
typename internal::BindingType<Args>::WireType... args
) {
- (*function)(*ptr, internal::BindingType<Args>::toWireType(args)...);
+ (*function)(*ptr, internal::BindingType<Args>::fromWireType(args)...);
}
};
@@ -472,6 +437,17 @@ namespace emscripten {
setter(ptr, FieldBinding::fromWireType(value));
}
};
+
+ template<typename ClassType, typename ElementType, typename IndexType>
+ struct ArrayAccess {
+ static ElementType get(ClassType& ptr, IndexType index) {
+ return ptr[index];
+ }
+
+ static void set(ClassType& ptr, IndexType index, const ElementType& value) {
+ ptr[index] = value;
+ }
+ };
}
////////////////////////////////////////////////////////////////////////////////
@@ -796,26 +772,16 @@ namespace emscripten {
template<typename ElementType, typename IndexType>
class_& arrayoperatorget() {
- using namespace internal;
-
- _embind_register_class_operator_array_get(
- TypeID<ClassType>::get(),
- TypeID<ElementType>::get(),
- TypeID<IndexType>::get(),
- reinterpret_cast<internal::GenericFunction>(&internal::ArrayAccessGetInvoker<ClassType, ElementType, IndexType>::invoke));
- return *this;
+ return method(
+ "array_get",
+ internal::ArrayAccess<ClassType, ElementType, IndexType>::get);
}
template<typename ElementType, typename IndexType>
class_& arrayoperatorset() {
- using namespace internal;
-
- _embind_register_class_operator_array_set(
- TypeID<ClassType>::get(),
- TypeID<ElementType>::get(),
- TypeID<IndexType>::get(),
- reinterpret_cast<internal::GenericFunction>(&internal::ArrayAccessSetInvoker<ClassType, ElementType, IndexType>::invoke));
- return *this;
+ return method(
+ "array_set",
+ internal::ArrayAccess<ClassType, ElementType, IndexType>::set);
}
};