aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-08-09 16:35:06 -0700
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-08-09 16:35:06 -0700
commit429abc12781aa6b93417ad6de8a69028900ad33d (patch)
treeb3dd00f04f641dc8ffdfce5586879ffcf8a236d1 /src
parent3dca3baaec4babf1521f57d46feff6d7c69229aa (diff)
downloadbun-429abc12781aa6b93417ad6de8a69028900ad33d.tar.gz
bun-429abc12781aa6b93417ad6de8a69028900ad33d.tar.zst
bun-429abc12781aa6b93417ad6de8a69028900ad33d.zip
[bun:ffi] ~30% perf improvement for wrapped functions
Diffstat (limited to 'src')
-rw-r--r--src/bun.js/ffi.exports.js61
1 files changed, 59 insertions, 2 deletions
diff --git a/src/bun.js/ffi.exports.js b/src/bun.js/ffi.exports.js
index 217e208b6..f24844155 100644
--- a/src/bun.js/ffi.exports.js
+++ b/src/bun.js/ffi.exports.js
@@ -226,9 +226,66 @@ function FFIBuilder(params, returnType, functionToCall, name) {
Object.defineProperty(func, "name", {
value: name,
});
- const wrap = (...args) => func(functionToCall, ...args);
- wrap.native = functionToCall;
+ // variadic arguments can be expensive
+ // most FFI functions are going to be < 5 arguments
+ // so we just inline it
+ var wrap;
+ switch (paramNames.length) {
+ case 0:
+ wrap = () => func(functionToCall);
+ break;
+ case 1:
+ wrap = (arg1) => func(functionToCall, arg1);
+ break;
+ case 2:
+ wrap = (arg1, arg2) => func(functionToCall, arg1, arg2);
+ break;
+ case 3:
+ wrap = (arg1, arg2, arg3) => func(functionToCall, arg1, arg2, arg3);
+ break;
+ case 4:
+ wrap = (arg1, arg2, arg3, arg4) =>
+ func(functionToCall, arg1, arg2, arg3, arg4);
+ break;
+ case 5:
+ wrap = (arg1, arg2, arg3, arg4, arg5) =>
+ func(functionToCall, arg1, arg2, arg3, arg4, arg5);
+ case 6:
+ wrap = (arg1, arg2, arg3, arg4, arg5, arg6) =>
+ func(functionToCall, arg1, arg2, arg3, arg4, arg5, arg6);
+ break;
+ case 7:
+ wrap = (arg1, arg2, arg3, arg4, arg5, arg6, arg7) =>
+ func(functionToCall, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
+ break;
+ case 8:
+ wrap = (arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) =>
+ func(functionToCall, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
+ break;
+ case 9:
+ wrap = (arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) =>
+ func(
+ functionToCall,
+ arg1,
+ arg2,
+ arg3,
+ arg4,
+ arg5,
+ arg6,
+ arg7,
+ arg8,
+ arg9
+ );
+ break;
+ default: {
+ wrap = (...args) => func(functionToCall, ...args);
+ break;
+ }
+ }
+
+ wrap.native = functionToCall;
+ wrap.ptr = functionToCall.ptr;
return wrap;
}