From 53606de6344fca63c40fde37056910b72a3c4f8d Mon Sep 17 00:00:00 2001 From: Divy Srivastava Date: Mon, 27 May 2024 21:01:09 -0700 Subject: BREAKING(ffi/unstable): always return u64 as bigint (#23981) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The mixed `number | bigint` representation was useful optimization for pointers. Now, pointers are represented as V8 externals. As part of the FFI stabilization effort we want to make `bigint` the only representation for `u64` and `i64`. BigInt representation performance is almost on par with mixed representation with the added benefit that its less confusing and users don't need manual checks and conversions for doing operations on the value. ``` cpu: AMD Ryzen 5 7530U with Radeon Graphics runtime: deno 1.43.6+92a8d09 (x86_64-unknown-linux-gnu) file:///home/divy/gh/ffi/main.ts benchmark time (avg) iter/s (min … max) p75 p99 p995 -------------------------------------------------------------------------- ----------------------------- nop 4.01 ns/iter 249,533,690.5 (3.97 ns … 10.8 ns) 3.97 ns 4.36 ns 9.03 ns ret bigint 7.74 ns/iter 129,127,186.8 (7.72 ns … 10.46 ns) 7.72 ns 8.11 ns 8.82 ns ret i32 7.81 ns/iter 128,087,100.5 (7.77 ns … 12.72 ns) 7.78 ns 8.57 ns 9.75 ns ret bigint (add op) 15.02 ns/iter 66,588,253.2 (14.64 ns … 24.99 ns) 14.76 ns 19.13 ns 19.44 ns ret i32 (add op) 12.02 ns/iter 83,209,131.8 (11.95 ns … 18.18 ns) 11.98 ns 13.11 ns 14.5 ns ``` --- tests/ffi/tests/ffi_types.ts | 4 ++-- tests/ffi/tests/integration_tests.rs | 10 +++++----- tests/ffi/tests/test.js | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) (limited to 'tests/ffi') diff --git a/tests/ffi/tests/ffi_types.ts b/tests/ffi/tests/ffi_types.ts index 596662873..93ac98d92 100644 --- a/tests/ffi/tests/ffi_types.ts +++ b/tests/ffi/tests/ffi_types.ts @@ -160,7 +160,7 @@ let r_1: number | bigint = result; const result2 = remote.symbols.method17(); // @ts-expect-error: Invalid argument result2.then((_0: string) => {}); -result2.then((_1: number | bigint) => {}); +result2.then((_1: bigint) => {}); const result3 = remote.symbols.method18(); // @ts-expect-error: Invalid argument @@ -430,7 +430,7 @@ type __Tests__ = [ symbols: { foo: ( ...args: (number | Deno.PointerValue | null)[] - ) => number | bigint; + ) => bigint; }; close(): void; }, diff --git a/tests/ffi/tests/integration_tests.rs b/tests/ffi/tests/integration_tests.rs index d0ac6e104..2235405a8 100644 --- a/tests/ffi/tests/integration_tests.rs +++ b/tests/ffi/tests/integration_tests.rs @@ -76,10 +76,10 @@ fn basic() { 5\n\ 5\n\ 579\n\ - 8589934590\n\ - -8589934590\n\ - 8589934590\n\ - -8589934590\n\ + 8589934590n\n\ + -8589934590n\n\ + 8589934590n\n\ + -8589934590n\n\ 9007199254740992n\n\ 9007199254740992n\n\ -9007199254740992n\n\ @@ -110,7 +110,7 @@ fn basic() { Before\n\ After\n\ logCallback\n\ - 1 -1 2 -2 3 -3 4 -4 0.5 -0.5 1 2 3 4 5 6 7 8\n\ + 1 -1 2 -2 3 -3 4n -4n 0.5 -0.5 1 2 3 4 5 6 7 8\n\ u8: 8\n\ buf: [1, 2, 3, 4, 5, 6, 7, 8]\n\ logCallback\n\ diff --git a/tests/ffi/tests/test.js b/tests/ffi/tests/test.js index 6b8e509c0..fccf6b35e 100644 --- a/tests/ffi/tests/test.js +++ b/tests/ffi/tests/test.js @@ -637,7 +637,7 @@ await dylib.symbols.call_fn_ptr_return_u8_thread_safe(returnU8Callback.pointer); // Test statics assertEquals(dylib.symbols.static_u32, 42); -assertEquals(dylib.symbols.static_i64, -1242464576485); +assertEquals(dylib.symbols.static_i64, -1242464576485n); assert( typeof dylib.symbols.static_ptr === "object" ); -- cgit v1.2.3