Skip to content

Commit 84daecc

Browse files
committed
zero copy ffi w/ unsafe-pointers (built for this purpose)
1 parent d8c58b6 commit 84daecc

File tree

13 files changed

+105
-154
lines changed

13 files changed

+105
-154
lines changed

bun.lock

Lines changed: 12 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"test:dist": "bun scripts/dist-test.ts --build packages/*/dist-test/*"
2424
},
2525
"devDependencies": {
26+
"commander": "^13.1.0",
2627
"oxfmt": "0.41.0",
2728
"oxlint": "1.56.0",
2829
"vitest": "4.1.3"

packages/core/bunfig.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[test]
2+
root = "src"

packages/core/package.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
"@types/bun": "latest",
3434
"@types/node": "^24.0.0",
3535
"@types/three": "0.177.0",
36-
"commander": "^13.1.0",
3736
"typescript": "^5",
3837
"web-tree-sitter": "0.25.10"
3938
},
@@ -51,16 +50,17 @@
5150
},
5251
"optionalDependencies": {
5352
"@dimforge/rapier2d-simd-compat": "^0.17.3",
54-
"koffi": "2.15.6",
55-
"bun-webgpu": "0.1.5",
56-
"planck": "^1.4.2",
57-
"three": "0.177.0",
58-
"@opentui/core-darwin-x64": "0.1.97",
5953
"@opentui/core-darwin-arm64": "0.1.97",
60-
"@opentui/core-linux-x64": "0.1.97",
54+
"@opentui/core-darwin-x64": "0.1.97",
6155
"@opentui/core-linux-arm64": "0.1.97",
56+
"@opentui/core-linux-x64": "0.1.97",
57+
"@opentui/core-win32-arm64": "0.1.97",
6258
"@opentui/core-win32-x64": "0.1.97",
63-
"@opentui/core-win32-arm64": "0.1.97"
59+
"bun-webgpu": "0.1.5",
60+
"koffi": "2.15.6",
61+
"planck": "^1.4.2",
62+
"three": "0.177.0",
63+
"unsafe-pointer": "0.2.0"
6464
},
6565
"exports": {
6666
".": {
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { describe, it, expect } from "bun:test"
2+
import * as ffi from "./ffi.js"
3+
4+
describe("ffi", () => {
5+
it("can round-trip a Uint8Array", () => {
6+
const array = new TextEncoder().encode("Hello, world!")
7+
const pointer = ffi.ptr(array)
8+
const newArrayBuffer = ffi.toArrayBuffer(pointer, 0, array.byteLength)
9+
const newArray = new Uint8Array(newArrayBuffer)
10+
11+
expect(newArray).toEqual(array)
12+
expect(new TextDecoder().decode(newArrayBuffer)).toBe("Hello, world!")
13+
})
14+
15+
it("aliases Pointer memory", () => {
16+
const array = new TextEncoder().encode("Hello, world!")
17+
const pointer = ffi.ptr(array)
18+
const newArrayBuffer = ffi.toArrayBuffer(pointer, 0, array.byteLength)
19+
const newArray = new Uint8Array(newArrayBuffer)
20+
21+
expect(array[0]).not.toBe(0)
22+
newArray[0] = 0
23+
expect(array[0]).toBe(0)
24+
})
25+
26+
it("returns stable address", () => {
27+
const array = new TextEncoder().encode("Hello, world!")
28+
const pointer = ffi.ptr(array)
29+
const newArrayBuffer = ffi.toArrayBuffer(pointer, 0, array.byteLength)
30+
const newArray = new Uint8Array(newArrayBuffer)
31+
32+
expect(pointer).toBe(ffi.ptr(newArray))
33+
expect(pointer).toBe(ffi.ptr(newArrayBuffer))
34+
})
35+
})

packages/core/src/compat/ffi.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -151,11 +151,7 @@ export interface JSCallbackConstructor {
151151

152152
export type DlopenFunction = <Fns extends Record<string, FFIFunction>>(name: string | URL, symbols: Fns) => Library<Fns>
153153
export type PtrFunction = (value: ArrayBufferLike | ArrayBufferView) => Pointer
154-
export type ToArrayBufferFunction = (
155-
pointer: Pointer | bigint | object | null,
156-
offset?: number,
157-
length?: number,
158-
) => ArrayBuffer
154+
export type ToArrayBufferFunction = (pointer: Pointer, offset: number | undefined, length: number) => ArrayBuffer
159155

160156
type FfiModule = {
161157
JSCallback: JSCallbackConstructor

0 commit comments

Comments
 (0)