aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChad Austin <chad@chadaustin.me>2012-10-30 14:01:52 -0700
committerJukka Jylänki <jujjyl@gmail.com>2013-04-12 14:21:21 +0300
commit1c0c7be7aaf6f231bd29d8b9db68506be6a0a5b1 (patch)
tree698e653c42c72324a444eb97eab5b9077400feee
parentf91f1ddf374b4f881cd5cf2ba35263cfbe965224 (diff)
Some minor generated code size reductions.
-rw-r--r--src/embind/emval.js46
-rw-r--r--system/include/emscripten/bind.h2
-rw-r--r--system/include/emscripten/val.h24
3 files changed, 56 insertions, 16 deletions
diff --git a/src/embind/emval.js b/src/embind/emval.js
index 26ceaf46..b2adb89a 100644
--- a/src/embind/emval.js
+++ b/src/embind/emval.js
@@ -16,7 +16,8 @@ Module.count_emval_handles = function() {
Module.reset_emval_handles = function() {
_emval_handle_array = [];
_emval_free_list = [];
-}
+};
+
// Private C++ API
function __emval_register(value) {
@@ -86,31 +87,46 @@ function __emval_as(handle, returnType) {
return returnType.toWireType(destructors, _emval_handle_array[handle].value);
}
-function __emval_call(handle, argCount, argTypes) {
- var args = Array.prototype.slice.call(arguments, 3);
- var fn = _emval_handle_array[handle].value;
+function parseParameters(argCount, argTypes, argWireTypes) {
var a = new Array(argCount);
for (var i = 0; i < argCount; ++i) {
var argType = requireRegisteredType(
HEAP32[(argTypes >> 2) + i],
"parameter " + i);
- a[i] = argType.fromWireType(args[i]);
+ a[i] = argType.fromWireType(argWireTypes[i]);
}
- var rv = fn.apply(undefined, a);
+ return a;
+}
+
+function __emval_call(handle, argCount, argTypes) {
+ var fn = _emval_handle_array[handle].value;
+ var args = parseParameters(
+ argCount,
+ argTypes,
+ Array.prototype.slice.call(arguments, 3));
+ var rv = fn.apply(undefined, args);
return __emval_register(rv);
}
function __emval_call_method(handle, name, argCount, argTypes) {
name = Pointer_stringify(name);
- var args = Array.prototype.slice.call(arguments, 4);
+
+ var args = parseParameters(
+ argCount,
+ argTypes,
+ Array.prototype.slice.call(arguments, 4));
var obj = _emval_handle_array[handle].value;
- var a = new Array(argCount);
- for (var i = 0; i < argCount; ++i) {
- var argType = requireRegisteredType(
- HEAP32[(argTypes >> 2) + i],
- "parameter " + i);
- a[i] = argType.fromWireType(args[i]);
- }
- var rv = obj[name].apply(obj, a);
+ var rv = obj[name].apply(obj, args);
return __emval_register(rv);
}
+
+function __emval_call_void_method(handle, name, argCount, argTypes) {
+ name = Pointer_stringify(name);
+
+ var args = parseParameters(
+ argCount,
+ argTypes,
+ Array.prototype.slice.call(arguments, 4));
+ var obj = _emval_handle_array[handle].value;
+ obj[name].apply(obj, args);
+}
diff --git a/system/include/emscripten/bind.h b/system/include/emscripten/bind.h
index b8858284..2de14fab 100644
--- a/system/include/emscripten/bind.h
+++ b/system/include/emscripten/bind.h
@@ -632,7 +632,7 @@ namespace emscripten {
template<typename... Args>
struct Caller<void, Args...> {
static void call(val& v, const char* name, Args... args) {
- v.call(name, args...);
+ v.call_void(name, args...);
}
};
diff --git a/system/include/emscripten/val.h b/system/include/emscripten/val.h
index 6dd4021c..ada89638 100644
--- a/system/include/emscripten/val.h
+++ b/system/include/emscripten/val.h
@@ -31,6 +31,12 @@ namespace emscripten {
unsigned argCount,
internal::TYPEID argTypes[]
/*, ... */);
+ void _emval_call_void_method(
+ EM_VAL value,
+ const char* methodName,
+ unsigned argCount,
+ internal::TYPEID argTypes[]
+ /*, ...*/);
}
}
@@ -136,6 +142,24 @@ namespace emscripten {
internal::toWireType(args)...));
}
+ template<typename ...Args>
+ void call_void(const char* name, Args... args) {
+ internal::ArgTypeList<Args...> argList;
+ typedef void (*TypedCall)(
+ internal::EM_VAL,
+ const char* name,
+ unsigned,
+ internal::TYPEID argTypes[],
+ typename internal::BindingType<Args>::WireType...);
+ TypedCall typedCall = reinterpret_cast<TypedCall>(&internal::_emval_call_void_method);
+ return typedCall(
+ handle,
+ name,
+ argList.count,
+ argList.types,
+ internal::toWireType(args)...);
+ }
+
template<typename T>
T as() const {
typedef internal::BindingType<T> BT;