aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/embind/emval.js42
1 files changed, 30 insertions, 12 deletions
diff --git a/src/embind/emval.js b/src/embind/emval.js
index 96024269..c0b8f705 100644
--- a/src/embind/emval.js
+++ b/src/embind/emval.js
@@ -218,19 +218,37 @@ function lookupTypes(argCount, argTypes, argWireTypes) {
function __emval_get_method_caller(argCount, argTypes) {
var types = lookupTypes(argCount, argTypes);
- var signatureName = types[0].name + "_$" + types.slice(1).map(function(t){return t.name;}).join("_") + "$";
- return Runtime.addFunction(createNamedFunction(signatureName, function(handle, name) {
- requireHandle(handle);
- name = getStringOrSymbol(name);
-
- var args = new Array(argCount - 1);
- for (var i = 1; i < argCount; ++i) {
- args[i - 1] = types[i].fromWireType(arguments[1 + i]);
- }
+ var retType = types[0];
+ var signatureName = retType.name + "_$" + types.slice(1).map(function (t) { return t.name; }).join("_") + "$";
+
+ var args1 = ["requireHandle", "getStringOrSymbol", "_emval_handle_array", "retType"];
+ var args2 = [requireHandle, getStringOrSymbol, _emval_handle_array, retType];
+
+ var argsList = ""; // 'arg0, arg1, arg2, ... , argN'
+ var argsListWired = ""; // 'arg0Wired, ..., argNWired'
+ for (var i = 0; i < argCount - 1; ++i) {
+ argsList += (i !== 0 ? ", " : "") + "arg" + i;
+ argsListWired += ", arg" + i + "Wired";
+ args1.push("argType" + i);
+ args2.push(types[1 + i]);
+ }
- var obj = _emval_handle_array[handle].value;
- return types[0].toWireType([], obj[name].apply(obj, args));
- }));
+ var invokerFnBody =
+ "return Runtime.addFunction(createNamedFunction('" + signatureName + "', function (handle, name" + argsListWired + ") {\n" +
+ "requireHandle(handle);\n" +
+ "name = getStringOrSymbol(name);\n";
+
+ for (var i = 0; i < argCount - 1; ++i) {
+ invokerFnBody += "var arg" + i + " = argType" + i + ".fromWireType(arg" + i + "Wired);\n";
+ }
+ invokerFnBody +=
+ "var obj = _emval_handle_array[handle].value;\n" +
+ "return retType.toWireType(null, obj[name](" + argsList + "));\n" +
+ "}));\n";
+
+ args1.push(invokerFnBody);
+ var invokerFunction = new_(Function, args1).apply(null, args2);
+ return invokerFunction;
}
function __emval_has_function(handle, name) {