From 8b1924f6c2bfdc7f199e95e6564a8a51e4312ef5 Mon Sep 17 00:00:00 2001 From: Jarred Sumner Date: Tue, 3 May 2022 01:25:46 -0700 Subject: [PATCH] Add docs for FFI --- Makefile | 9 +- README.md | 335 ++++++++++++++++++++ bench/ffi/ffi-overhead.js | 106 +++---- bench/ffi/noop.c | 6 +- bench/ffi/noop.dylib | Bin 16759 -> 16759 bytes bench/ffi/noop.js | 5 +- bench/ffi/plus100/.gitignore | 1 + bench/ffi/plus100/README.md | 27 ++ bench/ffi/plus100/download-napi-plus100.sh | 7 + bench/ffi/plus100/libadd.dylib | Bin 0 -> 396768 bytes bench/ffi/plus100/package.json | 12 + bench/ffi/plus100/plus100.bun.js | 19 ++ bench/ffi/plus100/plus100.c | 6 + bench/ffi/plus100/plus100.deno.js | 18 ++ bench/ffi/plus100/plus100.dylib | Bin 0 -> 16778 bytes bench/ffi/plus100/plus100.napi.mjs | 10 + examples/add.rs | 7 + examples/add.ts | 12 + examples/add.zig | 6 + integration/bunjs-only-snippets/ffi.test.js | 132 ++++---- src/javascript/jsc/ffi.exports.js | 4 +- src/javascript/jsc/javascript.zig | 11 +- types/bun/ffi.d.ts | 39 ++- 23 files changed, 629 insertions(+), 143 deletions(-) create mode 100644 bench/ffi/plus100/.gitignore create mode 100644 bench/ffi/plus100/README.md create mode 100644 bench/ffi/plus100/download-napi-plus100.sh create mode 100755 bench/ffi/plus100/libadd.dylib create mode 100644 bench/ffi/plus100/package.json create mode 100644 bench/ffi/plus100/plus100.bun.js create mode 100644 bench/ffi/plus100/plus100.c create mode 100644 bench/ffi/plus100/plus100.deno.js create mode 100755 bench/ffi/plus100/plus100.dylib create mode 100644 bench/ffi/plus100/plus100.napi.mjs create mode 100644 examples/add.rs create mode 100644 examples/add.ts create mode 100644 examples/add.zig diff --git a/Makefile b/Makefile index 0e19242cc1..02353a5b00 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ endif MIN_MACOS_VERSION = 10.14 -MARCH_NATIVE = +MARCH_NATIVE = -mtune=native ARCH_NAME := DOCKER_BUILDARCH = @@ -21,11 +21,12 @@ ifeq ($(ARCH_NAME_RAW),arm64) DOCKER_BUILDARCH = arm64 BREW_PREFIX_PATH = /opt/homebrew MIN_MACOS_VERSION = 11.0 + MARCH_NATIVE = -mtune=native else ARCH_NAME = x64 DOCKER_BUILDARCH = amd64 BREW_PREFIX_PATH = /usr/local - MARCH_NATIVE = -march=native + MARCH_NATIVE = -march=native -mtune=native endif AR= @@ -102,7 +103,7 @@ LIBICONV_PATH = AR=llvm-ar-13 endif -OPTIMIZATION_LEVEL=-O3 +OPTIMIZATION_LEVEL=-O3 $(MARCH_NATIVE) CFLAGS = $(MACOS_MIN_FLAG) $(MARCH_NATIVE) $(BITCODE_OR_SECTIONS) -g $(OPTIMIZATION_LEVEL) -fno-exceptions -fvisibility=hidden -fvisibility-inlines-hidden BUN_TMP_DIR := /tmp/make-bun BUN_DEPLOY_DIR = /tmp/bun-v$(PACKAGE_JSON_VERSION)/$(PACKAGE_NAME) @@ -416,7 +417,7 @@ boringssl: boringssl-build boringssl-copy boringssl-debug: boringssl-build-debug boringssl-copy compile-ffi-test: - clang -O3 -shared -undefined dynamic_lookup -o /tmp/bun-ffi-test$(SHARED_LIB_EXTENSION) ./integration/bunjs-only-snippets/ffi-test.c + clang $(OPTIMIZATION_LEVEL) -shared -undefined dynamic_lookup -o /tmp/bun-ffi-test$(SHARED_LIB_EXTENSION) ./integration/bunjs-only-snippets/ffi-test.c libbacktrace: cd $(BUN_DEPS_DIR)/libbacktrace && \ diff --git a/README.md b/README.md index 5733a2aa89..f03b99a564 100644 --- a/README.md +++ b/README.md @@ -1549,6 +1549,341 @@ await Bun.write(Bun.file("index.html"), await fetch("http://example.com")); await Bun.write("output.txt", Bun.file("input.txt")); ``` +### `bun:ffi` (Foreign Functions Interface) + +`bun:ffi` lets you efficiently call native libraries from JavaScript. It works with languages that support the C ABI (Zig, Rust, C/C++, C#, Nim, Kotlin, etc). + +Note: this is available in the next version of Bun (v0.0.79), which is not released yet. + +This snippet prints sqlite3's version number: + +```ts +import { dlopen, FFIType, suffix } from "bun:ffi"; + +// `suffix` is either "dylib", "so", or "dll" depending on the platform +// you don't have to use "suffix", it's just there for convenience +const path = `libsqlite3.${suffix}`; + +const { + symbols: { + // sqlite3_libversion is the function we will call + sqlite3_libversion, + }, +} = + // dlopen() expects: + // 1. a library name or file path + // 2. a map of symbols + dlopen(path, { + // `sqlite3_libversion` is a function that returns a string + sqlite3_libversion: { + // sqlite3_libversion takes no arguments + args: [], + // sqlite3_libversion returns a pointer to a string + returns: FFIType.cstring, + }, + }); + +console.log(`SQLite 3 version: ${sqlite3_libversion()}`); +``` + +#### Low-overhead FFI + +7ns to go from JavaScript <> native code with `bun:ffi` (on my machine, an M1X) + +- 2x faster than napi (Node v17.7.1) +- 75x faster than Deno v1.21.1 + +As measured in [this simple benchmark](./bench/ffi/plus100) + +image + +
+ +Why is bun:ffi fast? + +Bun generates & just-in-time compiles C bindings that efficiently convert values between JavaScript types and native types. + +To compile C, Bun embeds [TinyCC](https://github.com/TinyCC/tinycc) a small and fast C compiler. + +
+ +#### Usage + +With Zig: + +```zig +// add.zig +pub export fn add(a: i32, b: i32) i32 { + return a + b; +} +``` + +To compile: + +```bash +zig build-lib add.zig -dynamic -OReleaseFast +``` + +Pass `dlopen` the path to the shared library and the list of symbols you want to import. + +```ts +import { dlopen, FFIType, suffix } from "bun:ffi"; + +const path = `libadd.${suffix}`; + +const lib = dlopen(path, { + add: { + args: [FFIType.i32, FFIType.i32], + returns: FFIType.i32, + }, +}); + +lib.symbols.add(1, 2); +``` + +With Rust: + +```rust +// add.rs +#[no_mangle] +pub extern "C" fn add(a: isize, b: isize) -> isize { + a + b +} +``` + +To compile: + +```bash +rustc --crate-type cdylib add.rs +``` + +#### Supported FFI types (`FFIType`) + +| `FFIType` | C Type | Aliases | +| --------- | ---------- | --------------------------- | +| cstring | `char*` | | +| ptr | `void*` | `pointer`, `void*`, `char*` | +| i8 | `int8_t` | `int8_t` | +| i16 | `int16_t` | `int16_t` | +| i32 | `int32_t` | `int32_t`, `int` | +| i64 | `int64_t` | `int32_t` | +| u8 | `uint8_t` | `uint8_t` | +| u16 | `uint16_t` | `uint16_t` | +| u32 | `uint32_t` | `uint32_t` | +| u64 | `uint64_t` | `uint32_t` | +| f32 | `float` | `float` | +| f64 | `double` | `double` | +| bool | `bool` | | +| char | `char` | | + +#### Strings (`CString`) + +JavaScript strings and C-like strings are different, and that complicates using strings with native libraries. + +
+How are JavaScript strings and C strings different? + +JavaScript strings: + +- UTF16 (2 bytes per letter) or potentially latin1, depending on the JavaScript engine & what characters are used +- `length` stored separately +- Immutable + +C strings: + +- UTF8 (1 byte per letter), usually +- The length is not stored. Instead, the string is null-terminated which means the length is the index of the first `\0` it finds +- Mutable + +
+ +To help with that, `bun:ffi` exports `CString` which extends JavaScript's builtin `String` with a few extras: + +```ts +class CString extends String { + /** + * Given a `ptr`, this will automatically search for the closing `\0` character and transcode from UTF-8 to UTF-16 if necessary. + */ + constructor(ptr: number, byteOffset?: number, byteLength?: number): string; + + /** + * The ptr to the C string + * + * This `CString` instance is a clone of the string, so it + * is safe to continue using this instance after the `ptr` has been + * freed. + */ + ptr: number; + byteOffset?: number; + byteLength?: number; +} +``` + +To convert from a 0-terminated pointer to a JavaScript string: + +```ts +const myString = new CString(ptr); +``` + +To convert from a pointer with a known length to a JavaScript string: + +```ts +const myString = new CString(ptr, 0, byteLength); +``` + +`new CString` clones the C string, so it is safe to continue using `myString` after `ptr` has been freed. + +```ts +my_library_free(myString.ptr); + +// this is safe because myString is a clone +console.log(myString); +``` + +##### Returning a string + +When used in `returns`, `FFIType.cstring` coerces the pointer to a JavaScript `string`. When used in `args`, `cstring` is identical to `ptr`. + +#### Pointers + +Bun represents [pointers]() as a `number` in JavaScript. + +
+ +How does a 64 bit pointer fit in a JavaScript number? + +64-bit processors support up to [52 bits of addressible space](https://en.wikipedia.org/wiki/64-bit_computing#Limits_of_processors). + +[JavaScript numbers](https://en.wikipedia.org/wiki/Double-precision_floating-point_format#IEEE_754_double-precision_binary_floating-point_format:_binary64) support 63 bits of usable space, so that leaves us with about 11 bits of extra space. + +Why not `BigInt`? + +`BigInt` is slower. JavaScript engines allocate a separate `BigInt` which means they can't just fit in a regular javascript value. + +If you pass a `BigInt` to a function, it will be converted to a `number` + +
+ +**To convert from a TypedArray to a pointer**: + +```ts +import { ptr } from "bun:ffi"; +var myTypedArray = new Uint8Array(32); +const myPtr = ptr(myTypedArray); +``` + +**To convert from a pointer to an ArrayBuffer**: + +```ts +import { ptr, toArrayBuffer } from "bun:ffi"; +var myTypedArray = new Uint8Array(32); +const myPtr = ptr(myTypedArray); + +// toTypedArray accepts a `byteOffset` and `byteLength` +// if `byteLength` is not provided, it is assumed to be a null-terminated pointer +myTypedArray = new Uint8Array(toArrayBuffer(myPtr, 0, 32), 0, 32); +``` + +**Pointers & memory safety** + +Using raw pointers outside of FFI is extremely not recommended. + +A future version of bun may add a CLI flag to disable `bun:ffi` (or potentially a separate build of bun). + +**Pointer alignment** + +If an API expects a pointer sized to something other than `char` or `u8`, make sure the typed array is also that size. + +A `u64*` is not exactly the same as `[8]u8*` due to alignment + +##### Passing a pointer + +Where FFI functions expect a pointer, pass a TypedArray of equivalent size + +Easymode: + +```ts +import { dlopen, FFIType } from "bun:ffi"; + +const { + symbols: { encode_png }, +} = dlopen(myLibraryPath, { + encode_png: { + // FFIType's can be specified as strings too + args: ["ptr", "uint32_t"], + returns: FFIType.ptr, + }, +}); + +const pixels = new Uint8ClampedArray(128 * 128 * 4); +pixels.fill(254); +pixels.subarray(0, 32 * 32 * 2).fill(0); + +const out = encode_png( + // pixels will be passed as a pointer + pixels, + + pixels.byteLength +); +``` + +The [generated wrapper](https://github.com/Jarred-Sumner/bun/blob/c6d732eee2721cd6191672cbe2c57fb17c3fffe4/src/javascript/jsc/ffi.exports.js#L146-L148) will automatically convert the pointer to a TypedArray. + +
+ +Hardmode + +If you don't want the automatic conversion or you want a pointer to a specific byte offset within the TypedArray, you can also directly get the pointer to the TypedArray: + +```ts +import { dlopen, FFIType, ptr } from "bun:ffi"; + +const { + symbols: { encode_png }, +} = dlopen(myLibraryPath, { + encode_png: { + // FFIType's can be specified as strings too + args: ["ptr", "u32", "u32"], + returns: FFIType.ptr, + }, +}); + +const pixels = new Uint8ClampedArray(128 * 128 * 4); +pixels.fill(254); + +// this returns a number! not a BigInt! +const myPtr = ptr(pixels); + +const out = encode_png( + myPtr, + + // dimensions: + 128, + 128 +); +``` + +
+ +##### Reading pointers + +```ts +const out = encode_png( + // pixels will be passed as a pointer + pixels, + + // dimensions: + 128, + 128 +); + +// assuming it is 0-terminated, it can be read like this: +var png = new Uint8Array(toArrayBuffer(out)); + +// save it to disk: +await Bun.write("out.png", png); +``` + ### `Bun.Transpiler` `Bun.Transpiler` lets you use Bun's transpiler from JavaScript (available in Bun.js) diff --git a/bench/ffi/ffi-overhead.js b/bench/ffi/ffi-overhead.js index 841c599925..4f63cebe5d 100644 --- a/bench/ffi/ffi-overhead.js +++ b/bench/ffi/ffi-overhead.js @@ -12,221 +12,221 @@ import { bench, group, run } from "mitata"; const types = { returns_true: { - return_type: "bool", + returns: "bool", args: [], }, returns_false: { - return_type: "bool", + returns: "bool", args: [], }, returns_42_char: { - return_type: "char", + returns: "char", args: [], }, // returns_42_float: { - // return_type: "float", + // returns: "float", // args: [], // }, // returns_42_double: { - // return_type: "double", + // returns: "double", // args: [], // }, returns_42_uint8_t: { - return_type: "uint8_t", + returns: "uint8_t", args: [], }, returns_neg_42_int8_t: { - return_type: "int8_t", + returns: "int8_t", args: [], }, returns_42_uint16_t: { - return_type: "uint16_t", + returns: "uint16_t", args: [], }, returns_42_uint32_t: { - return_type: "uint32_t", + returns: "uint32_t", args: [], }, // // returns_42_uint64_t: { - // // return_type: "uint64_t", + // // returns: "uint64_t", // // args: [], // // }, returns_neg_42_int16_t: { - return_type: "int16_t", + returns: "int16_t", args: [], }, returns_neg_42_int32_t: { - return_type: "int32_t", + returns: "int32_t", args: [], }, // returns_neg_42_int64_t: { - // return_type: "int64_t", + // returns: "int64_t", // args: [], // }, identity_char: { - return_type: "char", + returns: "char", args: ["char"], }, // identity_float: { - // return_type: "float", + // returns: "float", // args: ["float"], // }, identity_bool: { - return_type: "bool", + returns: "bool", args: ["bool"], }, // identity_double: { - // return_type: "double", + // returns: "double", // args: ["double"], // }, identity_int8_t: { - return_type: "int8_t", + returns: "int8_t", args: ["int8_t"], }, identity_int16_t: { - return_type: "int16_t", + returns: "int16_t", args: ["int16_t"], }, identity_int32_t: { - return_type: "int32_t", + returns: "int32_t", args: ["int32_t"], }, // identity_int64_t: { - // return_type: "int64_t", + // returns: "int64_t", // args: ["int64_t"], // }, identity_uint8_t: { - return_type: "uint8_t", + returns: "uint8_t", args: ["uint8_t"], }, identity_uint16_t: { - return_type: "uint16_t", + returns: "uint16_t", args: ["uint16_t"], }, identity_uint32_t: { - return_type: "uint32_t", + returns: "uint32_t", args: ["uint32_t"], }, // identity_uint64_t: { - // return_type: "uint64_t", + // returns: "uint64_t", // args: ["uint64_t"], // }, add_char: { - return_type: "char", + returns: "char", args: ["char", "char"], }, add_float: { - return_type: "float", + returns: "float", args: ["float", "float"], }, add_double: { - return_type: "double", + returns: "double", args: ["double", "double"], }, add_int8_t: { - return_type: "int8_t", + returns: "int8_t", args: ["int8_t", "int8_t"], }, add_int16_t: { - return_type: "int16_t", + returns: "int16_t", args: ["int16_t", "int16_t"], }, add_int32_t: { - return_type: "int32_t", + returns: "int32_t", args: ["int32_t", "int32_t"], }, // add_int64_t: { - // return_type: "int64_t", + // returns: "int64_t", // args: ["int64_t", "int64_t"], // }, add_uint8_t: { - return_type: "uint8_t", + returns: "uint8_t", args: ["uint8_t", "uint8_t"], }, add_uint16_t: { - return_type: "uint16_t", + returns: "uint16_t", args: ["uint16_t", "uint16_t"], }, add_uint32_t: { - return_type: "uint32_t", + returns: "uint32_t", args: ["uint32_t", "uint32_t"], }, does_pointer_equal_42_as_int32_t: { - return_type: "bool", + returns: "bool", args: ["ptr"], }, ptr_should_point_to_42_as_int32_t: { - return_type: "ptr", + returns: "ptr", args: [], }, identity_ptr: { - return_type: "ptr", + returns: "ptr", args: ["ptr"], }, // add_uint64_t: { - // return_type: "uint64_t", + // returns: "uint64_t", // args: ["uint64_t", "uint64_t"], // }, cb_identity_true: { - return_type: "bool", + returns: "bool", args: ["ptr"], }, cb_identity_false: { - return_type: "bool", + returns: "bool", args: ["ptr"], }, cb_identity_42_char: { - return_type: "char", + returns: "char", args: ["ptr"], }, // cb_identity_42_float: { - // return_type: "float", + // returns: "float", // args: ["ptr"], // }, // cb_identity_42_double: { - // return_type: "double", + // returns: "double", // args: ["ptr"], // }, cb_identity_42_uint8_t: { - return_type: "uint8_t", + returns: "uint8_t", args: ["ptr"], }, cb_identity_neg_42_int8_t: { - return_type: "int8_t", + returns: "int8_t", args: ["ptr"], }, cb_identity_42_uint16_t: { - return_type: "uint16_t", + returns: "uint16_t", args: ["ptr"], }, cb_identity_42_uint32_t: { - return_type: "uint32_t", + returns: "uint32_t", args: ["ptr"], }, // cb_identity_42_uint64_t: { - // return_type: "uint64_t", + // returns: "uint64_t", // args: ["ptr"], // }, cb_identity_neg_42_int16_t: { - return_type: "int16_t", + returns: "int16_t", args: ["ptr"], }, cb_identity_neg_42_int32_t: { - return_type: "int32_t", + returns: "int32_t", args: ["ptr"], }, // cb_identity_neg_42_int64_t: { - // return_type: "int64_t", + // returns: "int64_t", // args: ["ptr"], // }, return_a_function_ptr_to_function_that_returns_true: { - return_type: "ptr", + returns: "ptr", args: [], }, }; diff --git a/bench/ffi/noop.c b/bench/ffi/noop.c index 6b93beeafc..de15eb5e0c 100644 --- a/bench/ffi/noop.c +++ b/bench/ffi/noop.c @@ -1,5 +1,5 @@ -// clang -O3 -shared -undefined dynamic_lookup ./noop.c -o noop.dylib +// clang -O3 -shared -mtune=native ./noop.c -o noop.dylib -int noop(); +void noop(); -int noop() { return 1; } \ No newline at end of file +void noop() {} \ No newline at end of file diff --git a/bench/ffi/noop.dylib b/bench/ffi/noop.dylib index 74a1d3155346bf170a131eab03da1803db8eaf53..66c00c17cf98c0caf1c2128b2c8208e23b498801 100755 GIT binary patch delta 194 zcmey~#Q435aYBdS7JCLTV1ZB!TQ<(jXB3b=rFZqFnq~j8yBp+p6>0@+mSCD;JBg8H z@)mmq#x0Yt+NX(asR!x+6F`~?i1`_T{KH!l#nhA*c8G-!Cfevj7dCNc7ww@4s^!((Oa1L$$pGOk) z*Kj_X{#|?R=A>;lW)~-acW`i!j { - raw(); + noop(); }); run({ collect: false, percentiles: true }); diff --git a/bench/ffi/plus100/.gitignore b/bench/ffi/plus100/.gitignore new file mode 100644 index 0000000000..8911651eda --- /dev/null +++ b/bench/ffi/plus100/.gitignore @@ -0,0 +1 @@ +./napi-plus100 diff --git a/bench/ffi/plus100/README.md b/bench/ffi/plus100/README.md new file mode 100644 index 0000000000..418e7bd343 --- /dev/null +++ b/bench/ffi/plus100/README.md @@ -0,0 +1,27 @@ +## FFI overhead comparison + +This compares the cost of a simple function call going from JavaScript to native code and back in: + +- Bun v0.0.79 +- napi.rs (Node v17.7.1) +- Deno v1.21.1 + +To set up: + +```bash +bun setup +``` + +To run the benchmark: + +```bash +bun bench +``` + +| Overhead | Using | Version | Platform | +| -------- | ------- | ------- | --------------- | +| 7ns | bun:ffi | 0.0.79 | macOS (aarch64) | +| 18ns | napi.rs | 17.7.1 | macOS (aarch64) | +| 580ns | Deno | 1.21.1 | macOS (aarch64) | + +The native [function](./plus100.c) called in Deno & Bun are the same. The function called with napi.rs is from napi's official [package-template](https://github.com/napi-rs/package-template) diff --git a/bench/ffi/plus100/download-napi-plus100.sh b/bench/ffi/plus100/download-napi-plus100.sh new file mode 100644 index 0000000000..9cd2268570 --- /dev/null +++ b/bench/ffi/plus100/download-napi-plus100.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +rm -rf plus100-napi +git clone https://github.com/napi-rs/package-template plus100-napi --depth=1 +cd plus100-napi +npm install +npm run build diff --git a/bench/ffi/plus100/libadd.dylib b/bench/ffi/plus100/libadd.dylib new file mode 100755 index 0000000000000000000000000000000000000000..a2a1039eeca180f97a1188374ef7f1708029cb6a GIT binary patch literal 396768 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 R@v;7q|5EdoXV-AE`hSnw@#X*k literal 0 HcmV?d00001 diff --git a/bench/ffi/plus100/package.json b/bench/ffi/plus100/package.json new file mode 100644 index 0000000000..ba7ef1fd72 --- /dev/null +++ b/bench/ffi/plus100/package.json @@ -0,0 +1,12 @@ +{ + "name": "plus100", + "scripts": { + "setup": "bun run napi-setup && bun run compile", + "bench-deno": "deno run --allow-ffi --unstable -A plus100.deno.js", + "napi-setup": "bash download-napi-plus100.sh", + "bench-napi": "node plus100.napi.mjs", + "bench-bun": "bun run ./plus100.bun.js", + "compile": "clang -mtune=native -O3 -shared ./plus100.c -o plus100.dylib", + "bench": "echo -e '\n--- Bun:\n' && bun run bench-bun && echo -e '\n--- Node:\n' && bun run bench-napi && echo -e '\n--- Deno:\n' && bun run bench-deno" + } +} diff --git a/bench/ffi/plus100/plus100.bun.js b/bench/ffi/plus100/plus100.bun.js new file mode 100644 index 0000000000..ca4bf0f643 --- /dev/null +++ b/bench/ffi/plus100/plus100.bun.js @@ -0,0 +1,19 @@ +import { run, bench, group, baseline } from "mitata"; +import { dlopen } from "bun:ffi"; + +const { + symbols: { plus100: plus100 }, + close, +} = dlopen("./plus100.dylib", { + plus100: { + params: ["int32_t"], + returns: "int32_t", + }, +}); +bench("plus100(1) (Bun FFI)", () => { + plus100(1); +}); + +// collect option collects benchmark returned values into array +// prevents gc and can help with jit optimizing out functions +run({ collect: false, percentiles: true }); diff --git a/bench/ffi/plus100/plus100.c b/bench/ffi/plus100/plus100.c new file mode 100644 index 0000000000..c5b7933ea8 --- /dev/null +++ b/bench/ffi/plus100/plus100.c @@ -0,0 +1,6 @@ +// clang -mtune=native -O3 -shared ./plus100.c -o plus100.dylib +#include + +int32_t plus100(int32_t a); + +int32_t plus100(int32_t a) { return a + 100; } diff --git a/bench/ffi/plus100/plus100.deno.js b/bench/ffi/plus100/plus100.deno.js new file mode 100644 index 0000000000..e6104efdd5 --- /dev/null +++ b/bench/ffi/plus100/plus100.deno.js @@ -0,0 +1,18 @@ +import { run, bench, group, baseline } from "https://esm.sh/mitata"; + +const { + symbols: { plus100: plus100 }, + close, +} = Deno.dlopen("./plus100.dylib", { + plus100: { + parameters: ["i32"], + result: "i32", + }, +}); +bench("plus100(1) (Deno FFI)", () => { + plus100(1); +}); + +// collect option collects benchmark returned values into array +// prevents gc and can help with jit optimizing out functions +run({ collect: false, percentiles: true }); diff --git a/bench/ffi/plus100/plus100.dylib b/bench/ffi/plus100/plus100.dylib new file mode 100755 index 0000000000000000000000000000000000000000..030d1afef2060b383ea3af0d80cb090cdf8bab5e GIT binary patch literal 16778 zcmeI3Ur5tY6vxjtwXm5+J=9bj1Y#w+bPs_+za()(X;un*`-N=6Q0H`xZ6PRu_Rqk4 z2`YNb2Ma8MCQK0QV%{Dfjt!TQm~*p=kE6#KP3{P$M1#jz4!dN=l7lY#Z92?NWA&xRe^YJ|0eu8wM}i>n)us z#C97gVw-1`tAwVEkXm#-5lu#-Aw3cu7-7%$dKsgh&p0IZmU`A=yq9-MuC90c&vtd3 z@tbee*eOF(b8)?{h!wyYTa{43a|7!j%j%B}CE~|Do~BTGDALa{FVU1DtPy$GZZ&KV z+j3UERn{K1rOriOC4UdAhh-fSx87xq?X<7v1i9z!y8l@F$=0v8ua=+t_T_v-3;W!x zLS6ockW=j)yd%onkMgX(U)d5RI>9o(-4UwepWjB!iTGGEKUs7k9Ul)5H?i9Gw`R$Jww!B+LElc7tjmY({kL2?hAOHd&00JNY0w4eaAOHd&00JNY0w4eaAOHd& z00JNY0w4eaAOHd&00JNY0w4eaAOHd&00JNY0w4eaAOHd&00JNY0w4eaAOHd&00JNY z0w4eaAOHd&@ZSl{+4f}}dQMuQYmDO7Rr { + plus100(1); +}); +run({ collect: false, percentiles: true }); diff --git a/examples/add.rs b/examples/add.rs new file mode 100644 index 0000000000..8ff8676cce --- /dev/null +++ b/examples/add.rs @@ -0,0 +1,7 @@ +#[no_mangle] +pub extern "C" fn add(a: isize, b: isize) -> isize { + a + b +} + +// to compile: +// rustc --crate-type cdylib add.rs diff --git a/examples/add.ts b/examples/add.ts new file mode 100644 index 0000000000..e975b122e0 --- /dev/null +++ b/examples/add.ts @@ -0,0 +1,12 @@ +import { dlopen, suffix } from "bun:ffi"; + +const { + symbols: { add }, +} = dlopen(`./libadd.${suffix}`, { + add: { + args: ["i32", "i32"], + returns: "i32", + }, +}); + +console.log(add(1, 2)); diff --git a/examples/add.zig b/examples/add.zig new file mode 100644 index 0000000000..24b78bec74 --- /dev/null +++ b/examples/add.zig @@ -0,0 +1,6 @@ +pub export fn add(a: i32, b: i32) i32 { + return a + b; +} + +// to compile: +// zig build-lib -OReleaseFast ./add.zig -dynamic --name add diff --git a/integration/bunjs-only-snippets/ffi.test.js b/integration/bunjs-only-snippets/ffi.test.js index 56e36d6e0c..258ee93ec0 100644 --- a/integration/bunjs-only-snippets/ffi.test.js +++ b/integration/bunjs-only-snippets/ffi.test.js @@ -18,7 +18,7 @@ it("ffi print", async () => { import.meta.dir + "/ffi.test.fixture.callback.c", viewSource( { - return_type: "bool", + returns: "bool", args: ["ptr"], }, true @@ -29,7 +29,7 @@ it("ffi print", async () => { viewSource( { not_a_callback: { - return_type: "float", + returns: "float", args: ["float"], }, }, @@ -39,7 +39,7 @@ it("ffi print", async () => { expect( viewSource( { - return_type: "int8_t", + returns: "int8_t", args: [], }, true @@ -49,7 +49,7 @@ it("ffi print", async () => { viewSource( { a: { - return_type: "int8_t", + returns: "int8_t", args: [], }, }, @@ -61,221 +61,221 @@ it("ffi print", async () => { it("ffi run", () => { const types = { returns_true: { - return_type: "bool", + returns: "bool", args: [], }, returns_false: { - return_type: "bool", + returns: "bool", args: [], }, returns_42_char: { - return_type: "char", + returns: "char", args: [], }, returns_42_float: { - return_type: "float", + returns: "float", args: [], }, returns_42_double: { - return_type: "double", + returns: "double", args: [], }, returns_42_uint8_t: { - return_type: "uint8_t", + returns: "uint8_t", args: [], }, returns_neg_42_int8_t: { - return_type: "int8_t", + returns: "int8_t", args: [], }, returns_42_uint16_t: { - return_type: "uint16_t", + returns: "uint16_t", args: [], }, returns_42_uint32_t: { - return_type: "uint32_t", + returns: "uint32_t", args: [], }, returns_42_uint64_t: { - return_type: "uint64_t", + returns: "uint64_t", args: [], }, returns_neg_42_int16_t: { - return_type: "int16_t", + returns: "int16_t", args: [], }, returns_neg_42_int32_t: { - return_type: "int32_t", + returns: "int32_t", args: [], }, returns_neg_42_int64_t: { - return_type: "int64_t", + returns: "int64_t", args: [], }, identity_char: { - return_type: "char", + returns: "char", args: ["char"], }, identity_float: { - return_type: "float", + returns: "float", args: ["float"], }, identity_bool: { - return_type: "bool", + returns: "bool", args: ["bool"], }, identity_double: { - return_type: "double", + returns: "double", args: ["double"], }, identity_int8_t: { - return_type: "int8_t", + returns: "int8_t", args: ["int8_t"], }, identity_int16_t: { - return_type: "int16_t", + returns: "int16_t", args: ["int16_t"], }, identity_int32_t: { - return_type: "int32_t", + returns: "int32_t", args: ["int32_t"], }, identity_int64_t: { - return_type: "int64_t", + returns: "int64_t", args: ["int64_t"], }, identity_uint8_t: { - return_type: "uint8_t", + returns: "uint8_t", args: ["uint8_t"], }, identity_uint16_t: { - return_type: "uint16_t", + returns: "uint16_t", args: ["uint16_t"], }, identity_uint32_t: { - return_type: "uint32_t", + returns: "uint32_t", args: ["uint32_t"], }, identity_uint64_t: { - return_type: "uint64_t", + returns: "uint64_t", args: ["uint64_t"], }, add_char: { - return_type: "char", + returns: "char", args: ["char", "char"], }, add_float: { - return_type: "float", + returns: "float", args: ["float", "float"], }, add_double: { - return_type: "double", + returns: "double", args: ["double", "double"], }, add_int8_t: { - return_type: "int8_t", + returns: "int8_t", args: ["int8_t", "int8_t"], }, add_int16_t: { - return_type: "int16_t", + returns: "int16_t", args: ["int16_t", "int16_t"], }, add_int32_t: { - return_type: "int32_t", + returns: "int32_t", args: ["int32_t", "int32_t"], }, add_int64_t: { - return_type: "int64_t", + returns: "int64_t", args: ["int64_t", "int64_t"], }, add_uint8_t: { - return_type: "uint8_t", + returns: "uint8_t", args: ["uint8_t", "uint8_t"], }, add_uint16_t: { - return_type: "uint16_t", + returns: "uint16_t", args: ["uint16_t", "uint16_t"], }, add_uint32_t: { - return_type: "uint32_t", + returns: "uint32_t", args: ["uint32_t", "uint32_t"], }, does_pointer_equal_42_as_int32_t: { - return_type: "bool", + returns: "bool", args: ["ptr"], }, ptr_should_point_to_42_as_int32_t: { - return_type: "ptr", + returns: "ptr", args: [], }, identity_ptr: { - return_type: "ptr", + returns: "ptr", args: ["ptr"], }, add_uint64_t: { - return_type: "uint64_t", + returns: "uint64_t", args: ["uint64_t", "uint64_t"], }, cb_identity_true: { - return_type: "bool", + returns: "bool", args: ["ptr"], }, cb_identity_false: { - return_type: "bool", + returns: "bool", args: ["ptr"], }, cb_identity_42_char: { - return_type: "char", + returns: "char", args: ["ptr"], }, cb_identity_42_float: { - return_type: "float", + returns: "float", args: ["ptr"], }, cb_identity_42_double: { - return_type: "double", + returns: "double", args: ["ptr"], }, cb_identity_42_uint8_t: { - return_type: "uint8_t", + returns: "uint8_t", args: ["ptr"], }, cb_identity_neg_42_int8_t: { - return_type: "int8_t", + returns: "int8_t", args: ["ptr"], }, cb_identity_42_uint16_t: { - return_type: "uint16_t", + returns: "uint16_t", args: ["ptr"], }, cb_identity_42_uint32_t: { - return_type: "uint32_t", + returns: "uint32_t", args: ["ptr"], }, cb_identity_42_uint64_t: { - return_type: "uint64_t", + returns: "uint64_t", args: ["ptr"], }, cb_identity_neg_42_int16_t: { - return_type: "int16_t", + returns: "int16_t", args: ["ptr"], }, cb_identity_neg_42_int32_t: { - return_type: "int32_t", + returns: "int32_t", args: ["ptr"], }, cb_identity_neg_42_int64_t: { - return_type: "int64_t", + returns: "int64_t", args: ["ptr"], }, return_a_function_ptr_to_function_that_returns_true: { - return_type: "ptr", + returns: "ptr", args: [], }, }; @@ -426,7 +426,7 @@ it("ffi run", () => { // const first = native.callback( // { - // return_type: "bool", + // returns: "bool", // }, // identityBool // ); @@ -440,7 +440,7 @@ it("ffi run", () => { // cb_identity_false( // callback( // { - // return_type: "bool", + // returns: "bool", // }, // () => false // ) @@ -451,7 +451,7 @@ it("ffi run", () => { // cb_identity_42_char( // callback( // { - // return_type: "char", + // returns: "char", // }, // () => 42 // ) @@ -461,7 +461,7 @@ it("ffi run", () => { // cb_identity_42_uint8_t( // callback( // { - // return_type: "uint8_t", + // returns: "uint8_t", // }, // () => 42 // ) @@ -471,7 +471,7 @@ it("ffi run", () => { // cb_identity_neg_42_int8_t( // callback( // { - // return_type: "int8_t", + // returns: "int8_t", // }, // () => -42 // ) @@ -480,7 +480,7 @@ it("ffi run", () => { // cb_identity_42_uint16_t( // callback( // { - // return_type: "uint16_t", + // returns: "uint16_t", // }, // () => 42 // ) @@ -489,7 +489,7 @@ it("ffi run", () => { // cb_identity_42_uint32_t( // callback( // { - // return_type: "uint32_t", + // returns: "uint32_t", // }, // () => 42 // ) @@ -498,7 +498,7 @@ it("ffi run", () => { // cb_identity_neg_42_int16_t( // callback( // { - // return_type: "int16_t", + // returns: "int16_t", // }, // () => -42 // ) @@ -507,7 +507,7 @@ it("ffi run", () => { // cb_identity_neg_42_int32_t( // callback( // { - // return_type: "int32_t", + // returns: "int32_t", // }, // () => -42 // ) diff --git a/src/javascript/jsc/ffi.exports.js b/src/javascript/jsc/ffi.exports.js index 9492264364..fea92e0cd8 100644 --- a/src/javascript/jsc/ffi.exports.js +++ b/src/javascript/jsc/ffi.exports.js @@ -214,11 +214,11 @@ export function dlopen(path, options) { var symbol = result.symbols[key]; if ( options[key]?.args?.length || - FFIType[options[key]?.return_type] === FFIType.cstring + FFIType[options[key]?.returns] === FFIType.cstring ) { result.symbols[key] = FFIBuilder( options[key].args ?? [], - options[key].return_type ?? FFIType.void, + options[key].returns ?? FFIType.void, symbol, // in stacktraces: // instead of diff --git a/src/javascript/jsc/javascript.zig b/src/javascript/jsc/javascript.zig index efb0481f73..894b7bea53 100644 --- a/src/javascript/jsc/javascript.zig +++ b/src/javascript/jsc/javascript.zig @@ -937,6 +937,8 @@ pub const VirtualMachine = struct { this.resolved_count = 0; } + const shared_library_suffix = if (Environment.isMac) "dylib" else if (Environment.isLinux) "so" else ""; + inline fn _fetch( _: *JSGlobalObject, _specifier: string, @@ -1081,7 +1083,14 @@ pub const VirtualMachine = struct { } else if (strings.eqlComptime(_specifier, "bun:ffi")) { return ResolvedSource{ .allocator = null, - .source_code = ZigString.init("export const FFIType = " ++ JSC.FFI.ABIType.map_to_js_object ++ ";\n\n" ++ @embedFile("ffi.exports.js") ++ "\n"), + .source_code = ZigString.init( + "export const FFIType = " ++ + JSC.FFI.ABIType.map_to_js_object ++ + ";\n\n" ++ + "export const suffix = '" ++ shared_library_suffix ++ "';\n\n" ++ + @embedFile("ffi.exports.js") ++ + "\n", + ), .specifier = ZigString.init("bun:ffi"), .source_url = ZigString.init("bun:ffi"), .hash = 0, diff --git a/types/bun/ffi.d.ts b/types/bun/ffi.d.ts index afd75103ba..67cbfb5933 100644 --- a/types/bun/ffi.d.ts +++ b/types/bun/ffi.d.ts @@ -314,7 +314,7 @@ declare module "bun:ffi" { void = 13, /** - * When used as a `return_type`, this will automatically become a {@link CString}. + * When used as a `returns`, this will automatically become a {@link CString}. * * When used in `args` it is equivalent to {@link FFIType.pointer} * @@ -365,7 +365,7 @@ declare module "bun:ffi" { * const lib = dlopen('add', { * // FFIType can be used or you can pass string labels. * args: [FFIType.i32, "i32"], - * return_type: "i32", + * returns: "i32", * }); * lib.symbols.add(1, 2) * ``` @@ -389,7 +389,7 @@ declare module "bun:ffi" { * ```js * const lib = dlopen('z', { * version: { - * return_type: "ptr", + * returns: "ptr", * } * }); * console.log(new CString(lib.symbols.version())); @@ -402,18 +402,18 @@ declare module "bun:ffi" { * } * ``` */ - return_type?: FFITypeOrString; + returns?: FFITypeOrString; } type Symbols = Record; - /** - * Compile a callback function - * - * Returns a function pointer - * - */ - export function callback(ffi: FFIFunction, cb: Function): number; + // /** + // * Compile a callback function + // * + // * Returns a function pointer + // * + // */ + // export function callback(ffi: FFIFunction, cb: Function): number; export interface Library { symbols: Record; @@ -583,4 +583,21 @@ declare module "bun:ffi" { */ export function viewSource(symbols: Symbols, is_callback?: false): string[]; export function viewSource(callback: FFIFunction, is_callback: true): string; + + /** + * Platform-specific file extension name for dynamic libraries + * + * "." is not included + * + * @example + * ```js + * "dylib" // macOS + * ``` + * + * @example + * ```js + * "so" // linux + * ``` + */ + export const suffix: string; }