Skip to content

Commit 049e9cc

Browse files
committed
[emval] Simplify dynamic invoker creation. NFC
1 parent 65d8310 commit 049e9cc

File tree

6 files changed

+39
-48
lines changed

6 files changed

+39
-48
lines changed

src/lib/libembind.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -668,7 +668,7 @@ var LibraryEmbind = {
668668
// TODO: Remove this completely once all function invokers are being dynamically generated.
669669
var needsDestructorStack = usesDestructorStack(argTypes);
670670

671-
var returns = (argTypes[0].name !== 'void');
671+
var returns = !argTypes[0].isVoid;
672672

673673
var expectedArgCount = argCount - 2;
674674
#if ASSERTIONS
@@ -766,8 +766,8 @@ var LibraryEmbind = {
766766
var invokerFn = InvokerFunctions[signature](...closureArgs);
767767
#else
768768

769-
let [args, invokerFnBody] = createJsInvoker(argTypes, isClassMethodFunc, returns, isAsync);
770-
var invokerFn = new Function(...args, invokerFnBody)(...closureArgs);
769+
let invokerFactory = createJsInvoker(argTypes, isClassMethodFunc, returns, isAsync);
770+
var invokerFn = invokerFactory(...closureArgs);
771771
#endif
772772
#endif
773773
return createNamedFunction(humanName, invokerFn);

src/lib/libembind_gen.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,13 +134,13 @@ var LibraryEmbind = {
134134
for (const argType of this.argumentTypes) {
135135
argTypes.push(this.convertToEmbindType(argType.type));
136136
}
137-
const signature = createJsInvokerSignature(argTypes, !!this.thisType, this.returnType.name !== 'void', this.isAsync)
137+
const signature = createJsInvokerSignature(argTypes, !!this.thisType, !this.returnType.isVoid, this.isAsync)
138138
if (emittedFunctions.has(signature)) {
139139
return;
140140
}
141141
emittedFunctions.add(signature);
142-
let [args, body] = createJsInvoker(argTypes, !!this.thisType, this.returnType.name !== 'void', this.isAsync);
143-
out.push(`'${signature}': function(${args.join(',')}) {\n${body}},`);
142+
let invokerFactory = createJsInvoker(argTypes, !!this.thisType, !this.returnType.isVoid, this.isAsync);
143+
out.push(`'${signature}': ${invokerFactory},`);
144144
}
145145
},
146146
$PointerDefinition: class {
@@ -528,7 +528,9 @@ var LibraryEmbind = {
528528
},
529529
_embind_register_void__deps: ['$registerPrimitiveType'],
530530
_embind_register_void: (rawType, name) => {
531-
registerPrimitiveType(rawType, name, 'none');
531+
const voidType = new PrimitiveType(rawType, 'void', 'none');
532+
voidType.isVoid = true; // Match the marker property from the non-AOT mode.
533+
registerType(rawType, voidType);
532534
},
533535
_embind_register_bool__deps: ['$registerPrimitiveType'],
534536
_embind_register_bool: (rawType, name, trueValue, falseValue) => {

src/lib/libembind_shared.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ var LibraryEmbindShared = {
293293
args1.push('checkArgCount', 'minArgs', 'maxArgs');
294294
invokerFnBody = `if (arguments.length !== ${args1.length}){ throw new Error(humanName + "Expected ${args1.length} closure arguments " + arguments.length + " given."); }\n${invokerFnBody}`;
295295
#endif
296-
return [args1, invokerFnBody];
296+
return new Function(args1, invokerFnBody);
297297
}
298298
};
299299

src/lib/libemval.js

Lines changed: 21 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -297,52 +297,41 @@ var LibraryEmVal = {
297297
return emval_returnValue(toReturnWire, destructorsRef, rv);
298298
};
299299
#else
300-
var functionBody =
301-
`return function (handle, methodName, destructorsRef, args) {\n`;
302-
303-
var offset = 0;
304-
var argsList = []; // 'arg0, arg1, arg2, ... , argN'
305-
var params = ['toValue'];
306-
var args = [Emval.toValue];
307-
for (var i = 0; i < argCount; ++i) {
308-
argsList.push(`arg${i}`);
309-
params.push(`argFromPtr${i}`);
310-
args.push(argFromPtr[i]);
311-
functionBody +=
312-
` var arg${i} = argFromPtr${i}(args${offset ? '+' + offset : ''});\n`;
313-
offset += GenericWireTypeSize;
314-
}
315-
var invoker;
300+
var captures = {'toValue': Emval.toValue};
301+
var args = argFromPtr.map((argFromPtr, i) => {
302+
var captureName = `argFromPtr${i}`;
303+
captures[captureName] = argFromPtr;
304+
return `${captureName}(args${i ? '+' + i * GenericWireTypeSize : ''})`;
305+
});
306+
var functionBody;
316307
switch (kind){
317308
case {{{ cDefs['internal::EM_INVOKER_KIND::FUNCTION'] }}}:
318-
invoker = 'toValue(handle)';
309+
functionBody = 'toValue(handle)';
319310
break;
320311
case {{{ cDefs['internal::EM_INVOKER_KIND::CONSTRUCTOR'] }}}:
321-
invoker = 'new (toValue(handle))';
312+
functionBody = 'new (toValue(handle))';
322313
break;
323314
case {{{ cDefs['internal::EM_INVOKER_KIND::CAST'] }}}:
324-
invoker = '';
315+
functionBody = '';
325316
break;
326317
case {{{ cDefs['internal::EM_INVOKER_KIND::METHOD'] }}}:
327-
params.push('getStringOrSymbol');
328-
args.push(getStringOrSymbol);
329-
invoker = 'toValue(handle)[getStringOrSymbol(methodName)]';
318+
captures['getStringOrSymbol'] = getStringOrSymbol;
319+
functionBody = 'toValue(handle)[getStringOrSymbol(methodName)]';
330320
break;
331321
}
332-
functionBody +=
333-
` var rv = ${invoker}(${argsList.join(', ')});\n`;
322+
functionBody += `(${args})`;
334323
if (!retType.isVoid) {
335-
params.push('toReturnWire', 'emval_returnValue');
336-
args.push(toReturnWire, emval_returnValue);
337-
functionBody +=
338-
' return emval_returnValue(toReturnWire, destructorsRef, rv);\n';
324+
captures['toReturnWire'] = toReturnWire;
325+
captures['emval_returnValue'] = emval_returnValue;
326+
functionBody = `return emval_returnValue(toReturnWire, destructorsRef, ${functionBody})`;
339327
}
340-
functionBody +=
341-
"};\n";
328+
functionBody = `return function (handle, methodName, destructorsRef, args) {
329+
${functionBody}
330+
}`;
342331
343-
var invokerFunction = new Function(...params, functionBody)(...args);
332+
var invokerFunction = new Function(Object.keys(captures), functionBody)(...Object.values(captures));
344333
#endif
345-
var functionName = `methodCaller<(${argTypes.map(t => t.name).join(', ')}) => ${retType.name}>`;
334+
var functionName = `methodCaller<(${argTypes.map(t => t.name)}) => ${retType.name}>`;
346335
return emval_addMethodCaller(createNamedFunction(functionName, invokerFunction));
347336
},
348337

test/code_size/embind_hello_wasm.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
22
"a.html": 552,
33
"a.html.gz": 380,
4-
"a.js": 7266,
5-
"a.js.gz": 3321,
4+
"a.js": 7255,
5+
"a.js.gz": 3318,
66
"a.wasm": 7294,
77
"a.wasm.gz": 3346,
8-
"total": 15112,
9-
"total_gz": 7047
8+
"total": 15101,
9+
"total_gz": 7044
1010
}

test/code_size/embind_val_wasm.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
22
"a.html": 552,
33
"a.html.gz": 380,
4-
"a.js": 5367,
5-
"a.js.gz": 2540,
4+
"a.js": 5356,
5+
"a.js.gz": 2531,
66
"a.wasm": 9092,
77
"a.wasm.gz": 4699,
8-
"total": 15011,
9-
"total_gz": 7619
8+
"total": 15000,
9+
"total_gz": 7610
1010
}

0 commit comments

Comments
 (0)