diff options
-rw-r--r-- | cli/tsc/dts/lib.deno.unstable.d.ts | 6 | ||||
-rw-r--r-- | ext/ffi/00_ffi.js | 17 | ||||
-rw-r--r-- | ext/ffi/callback.rs | 15 | ||||
-rw-r--r-- | ext/ffi/ir.rs | 43 | ||||
-rw-r--r-- | ext/ffi/lib.rs | 3 | ||||
-rw-r--r-- | ext/ffi/static.rs | 32 | ||||
-rw-r--r-- | tests/ffi/tests/ffi_types.ts | 4 | ||||
-rw-r--r-- | tests/ffi/tests/integration_tests.rs | 10 | ||||
-rw-r--r-- | tests/ffi/tests/test.js | 2 |
9 files changed, 25 insertions, 107 deletions
diff --git a/cli/tsc/dts/lib.deno.unstable.d.ts b/cli/tsc/dts/lib.deno.unstable.d.ts index f4588a23c..a3e0d2eb0 100644 --- a/cli/tsc/dts/lib.deno.unstable.d.ts +++ b/cli/tsc/dts/lib.deno.unstable.d.ts @@ -247,7 +247,7 @@ declare namespace Deno { : T extends NativeU32Enum<infer U> ? U : T extends NativeI32Enum<infer U> ? U : number - : T extends NativeBigIntType ? number | bigint + : T extends NativeBigIntType ? bigint : T extends NativeBooleanType ? boolean : T extends NativePointerType ? T extends NativeTypedPointer<infer U> ? U | null : PointerValue @@ -292,7 +292,7 @@ declare namespace Deno { : T extends NativeU32Enum<infer U> ? U : T extends NativeI32Enum<infer U> ? U : number - : T extends NativeBigIntType ? number | bigint + : T extends NativeBigIntType ? bigint : T extends NativeBooleanType ? boolean : T extends NativePointerType ? T extends NativeTypedPointer<infer U> ? U | null : PointerValue @@ -319,7 +319,7 @@ declare namespace Deno { : T extends NativeU32Enum<infer U> ? U : T extends NativeI32Enum<infer U> ? U : number - : T extends NativeBigIntType ? number | bigint + : T extends NativeBigIntType ? bigint : T extends NativeBooleanType ? boolean : T extends NativePointerType ? T extends NativeTypedPointer<infer U> ? U | null : PointerValue diff --git a/ext/ffi/00_ffi.js b/ext/ffi/00_ffi.js index 19d62dfdd..7f39db13e 100644 --- a/ext/ffi/00_ffi.js +++ b/ext/ffi/00_ffi.js @@ -46,7 +46,6 @@ const { ObjectDefineProperty, ObjectHasOwn, ObjectPrototypeIsPrototypeOf, - Number, NumberIsSafeInteger, TypedArrayPrototypeGetBuffer, TypedArrayPrototypeGetByteLength, @@ -348,10 +347,6 @@ function isReturnedAsBigInt(type) { type === "usize" || type === "isize"; } -function isI64(type) { - return type === "i64" || type === "isize"; -} - function isStruct(type) { return typeof type === "object" && type !== null && typeof type.struct === "object"; @@ -562,7 +557,6 @@ class DynamicLibrary { const call = this.symbols[symbol]; const parameters = symbols[symbol].parameters; const vi = new Int32Array(2); - const vui = new Uint32Array(TypedArrayPrototypeGetBuffer(vi)); const b = new BigInt64Array(TypedArrayPrototypeGetBuffer(vi)); const params = ArrayPrototypeJoin( @@ -572,22 +566,13 @@ class DynamicLibrary { // Make sure V8 has no excuse to not optimize this function. this.symbols[symbol] = new Function( "vi", - "vui", "b", "call", - "NumberIsSafeInteger", - "Number", `return function (${params}) { call(${params}${parameters.length > 0 ? ", " : ""}vi); - ${ - isI64(resultType) - ? `const n1 = Number(b[0])` - : `const n1 = vui[0] + 2 ** 32 * vui[1]` // Faster path for u64 - }; - if (NumberIsSafeInteger(n1)) return n1; return b[0]; }`, - )(vi, vui, b, call, NumberIsSafeInteger, Number); + )(vi, b, call); } else if (isStructResult && !isNonBlocking) { const call = this.symbols[symbol]; const parameters = symbols[symbol].parameters; diff --git a/ext/ffi/callback.rs b/ext/ffi/callback.rs index 55f38c602..1ddb1fff5 100644 --- a/ext/ffi/callback.rs +++ b/ext/ffi/callback.rs @@ -4,8 +4,6 @@ use crate::check_unstable; use crate::symbol::NativeType; use crate::FfiPermissions; use crate::ForeignFunction; -use crate::MAX_SAFE_INTEGER; -use crate::MIN_SAFE_INTEGER; use deno_core::error::AnyError; use deno_core::op2; use deno_core::v8; @@ -243,20 +241,11 @@ unsafe fn do_ffi_callback( } NativeType::I64 | NativeType::ISize => { let result = *((*val) as *const i64); - if result > MAX_SAFE_INTEGER as i64 || result < MIN_SAFE_INTEGER as i64 - { - v8::BigInt::new_from_i64(scope, result).into() - } else { - v8::Number::new(scope, result as f64).into() - } + v8::BigInt::new_from_i64(scope, result).into() } NativeType::U64 | NativeType::USize => { let result = *((*val) as *const u64); - if result > MAX_SAFE_INTEGER as u64 { - v8::BigInt::new_from_u64(scope, result).into() - } else { - v8::Number::new(scope, result as f64).into() - } + v8::BigInt::new_from_u64(scope, result).into() } NativeType::Pointer | NativeType::Buffer | NativeType::Function => { let result = *((*val) as *const *mut c_void); diff --git a/ext/ffi/ir.rs b/ext/ffi/ir.rs index 6fd1f53ea..520ead92e 100644 --- a/ext/ffi/ir.rs +++ b/ext/ffi/ir.rs @@ -1,8 +1,6 @@ // Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. use crate::symbol::NativeType; -use crate::MAX_SAFE_INTEGER; -use crate::MIN_SAFE_INTEGER; use deno_core::error::type_error; use deno_core::error::AnyError; use deno_core::v8; @@ -100,46 +98,13 @@ impl NativeValue { v8::Integer::new_from_unsigned(scope, self.u32_value).into() } NativeType::I32 => v8::Integer::new(scope, self.i32_value).into(), - NativeType::U64 => { - let value = self.u64_value; - let local_value: v8::Local<v8::Value> = - if value > MAX_SAFE_INTEGER as u64 { - v8::BigInt::new_from_u64(scope, value).into() - } else { - v8::Number::new(scope, value as f64).into() - }; - local_value - } - NativeType::I64 => { - let value = self.i64_value; - let local_value: v8::Local<v8::Value> = - if value > MAX_SAFE_INTEGER as i64 || value < MIN_SAFE_INTEGER as i64 - { - v8::BigInt::new_from_i64(scope, self.i64_value).into() - } else { - v8::Number::new(scope, value as f64).into() - }; - local_value - } + NativeType::U64 => v8::BigInt::new_from_u64(scope, self.u64_value).into(), + NativeType::I64 => v8::BigInt::new_from_i64(scope, self.i64_value).into(), NativeType::USize => { - let value = self.usize_value; - let local_value: v8::Local<v8::Value> = - if value > MAX_SAFE_INTEGER as usize { - v8::BigInt::new_from_u64(scope, value as u64).into() - } else { - v8::Number::new(scope, value as f64).into() - }; - local_value + v8::BigInt::new_from_u64(scope, self.usize_value as u64).into() } NativeType::ISize => { - let value = self.isize_value; - let local_value: v8::Local<v8::Value> = - if !(MIN_SAFE_INTEGER..=MAX_SAFE_INTEGER).contains(&value) { - v8::BigInt::new_from_i64(scope, self.isize_value as i64).into() - } else { - v8::Number::new(scope, value as f64).into() - }; - local_value + v8::BigInt::new_from_i64(scope, self.isize_value as i64).into() } NativeType::F32 => v8::Number::new(scope, self.f32_value as f64).into(), NativeType::F64 => v8::Number::new(scope, self.f64_value).into(), diff --git a/ext/ffi/lib.rs b/ext/ffi/lib.rs index c678a10b5..4e8129240 100644 --- a/ext/ffi/lib.rs +++ b/ext/ffi/lib.rs @@ -39,9 +39,6 @@ const _: () = { assert!(size_of::<*const ()>() == 8); }; -pub(crate) const MAX_SAFE_INTEGER: isize = 9007199254740991; -pub(crate) const MIN_SAFE_INTEGER: isize = -9007199254740991; - pub const UNSTABLE_FEATURE_NAME: &str = "ffi"; fn check_unstable(state: &OpState, api_name: &str) { diff --git a/ext/ffi/static.rs b/ext/ffi/static.rs index 3920d885e..f08605754 100644 --- a/ext/ffi/static.rs +++ b/ext/ffi/static.rs @@ -2,8 +2,6 @@ use crate::dlfcn::DynamicLibraryResource; use crate::symbol::NativeType; -use crate::MAX_SAFE_INTEGER; -use crate::MIN_SAFE_INTEGER; use deno_core::error::type_error; use deno_core::error::AnyError; use deno_core::op2; @@ -90,45 +88,29 @@ pub fn op_ffi_get_static<'scope>( NativeType::U64 => { // SAFETY: ptr is user provided let result = unsafe { ptr::read_unaligned(data_ptr as *const u64) }; - let integer: v8::Local<v8::Value> = if result > MAX_SAFE_INTEGER as u64 { - v8::BigInt::new_from_u64(scope, result).into() - } else { - v8::Number::new(scope, result as f64).into() - }; + let integer: v8::Local<v8::Value> = + v8::BigInt::new_from_u64(scope, result).into(); integer } NativeType::I64 => { // SAFETY: ptr is user provided let result = unsafe { ptr::read_unaligned(data_ptr as *const i64) }; - let integer: v8::Local<v8::Value> = if result > MAX_SAFE_INTEGER as i64 - || result < MIN_SAFE_INTEGER as i64 - { - v8::BigInt::new_from_i64(scope, result).into() - } else { - v8::Number::new(scope, result as f64).into() - }; + let integer: v8::Local<v8::Value> = + v8::BigInt::new_from_i64(scope, result).into(); integer } NativeType::USize => { // SAFETY: ptr is user provided let result = unsafe { ptr::read_unaligned(data_ptr as *const usize) }; - let integer: v8::Local<v8::Value> = if result > MAX_SAFE_INTEGER as usize - { - v8::BigInt::new_from_u64(scope, result as u64).into() - } else { - v8::Number::new(scope, result as f64).into() - }; + let integer: v8::Local<v8::Value> = + v8::BigInt::new_from_u64(scope, result as u64).into(); integer } NativeType::ISize => { // SAFETY: ptr is user provided let result = unsafe { ptr::read_unaligned(data_ptr as *const isize) }; let integer: v8::Local<v8::Value> = - if !(MIN_SAFE_INTEGER..=MAX_SAFE_INTEGER).contains(&result) { - v8::BigInt::new_from_i64(scope, result as i64).into() - } else { - v8::Number::new(scope, result as f64).into() - }; + v8::BigInt::new_from_i64(scope, result as i64).into(); integer } NativeType::F32 => { 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" ); |