diff options
author | Chad Austin <chad@chadaustin.me> | 2012-10-30 14:01:52 -0700 |
---|---|---|
committer | Jukka Jylänki <jujjyl@gmail.com> | 2013-04-12 14:21:21 +0300 |
commit | 1c0c7be7aaf6f231bd29d8b9db68506be6a0a5b1 (patch) | |
tree | 698e653c42c72324a444eb97eab5b9077400feee | |
parent | f91f1ddf374b4f881cd5cf2ba35263cfbe965224 (diff) |
Some minor generated code size reductions.
-rw-r--r-- | src/embind/emval.js | 46 | ||||
-rw-r--r-- | system/include/emscripten/bind.h | 2 | ||||
-rw-r--r-- | system/include/emscripten/val.h | 24 |
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; |