From f8547e2617a5bbef4931ac0df6e70db6b901927f Mon Sep 17 00:00:00 2001 From: Aapo Alasuutari Date: Mon, 16 Sep 2024 15:08:36 +0300 Subject: [PATCH] BREAKING(ext/ffi): remove deprecated `UnsafeFnPointer` constructor type with untyped `Deno.PointerObject` parameter (#25577) --- cli/tsc/dts/lib.deno.ns.d.ts | 87 +++++-------- tests/ffi/tests/ffi_types.ts | 234 ++++++++++++++++------------------- 2 files changed, 138 insertions(+), 183 deletions(-) diff --git a/cli/tsc/dts/lib.deno.ns.d.ts b/cli/tsc/dts/lib.deno.ns.d.ts index e287f7afc0..337baf4fe2 100644 --- a/cli/tsc/dts/lib.deno.ns.d.ts +++ b/cli/tsc/dts/lib.deno.ns.d.ts @@ -536,10 +536,7 @@ declare namespace Deno { * set of permissions to the test context. * * @category Permissions */ - export type PermissionOptions = - | "inherit" - | "none" - | PermissionOptionsObject; + export type PermissionOptions = "inherit" | "none" | PermissionOptionsObject; /** * A set of options which can define the permissions within a test or worker @@ -944,10 +941,7 @@ declare namespace Deno { * * @category Testing */ - ( - name: string, - fn: (t: TestContext) => void | Promise, - ): void; + (name: string, fn: (t: TestContext) => void | Promise): void; /** Register a test which will be run when `deno test` is used on the command * line and the containing module looks like a test module. @@ -1079,10 +1073,7 @@ declare namespace Deno { * * @category Testing */ - ignore( - name: string, - fn: (t: TestContext) => void | Promise, - ): void; + ignore(name: string, fn: (t: TestContext) => void | Promise): void; /** Shorthand property for ignoring a particular test case. * @@ -1128,10 +1119,7 @@ declare namespace Deno { * * @category Testing */ - only( - name: string, - fn: (t: TestContext) => void | Promise, - ): void; + only(name: string, fn: (t: TestContext) => void | Promise): void; /** Shorthand property for focusing a particular test case. * @@ -3964,10 +3952,7 @@ declare namespace Deno { * * @category Permissions */ - export type PermissionState = - | "granted" - | "denied" - | "prompt"; + export type PermissionState = "granted" | "denied" | "prompt"; /** The permission descriptor for the `allow-run` and `deny-run` permissions, which controls * access to what sub-processes can be executed by Deno. The option `command` @@ -4107,7 +4092,7 @@ declare namespace Deno { * * @category Permissions */ export interface PermissionStatusEventMap { - "change": Event; + change: Event; } /** An {@linkcode EventTarget} returned from the {@linkcode Deno.permissions} @@ -5311,9 +5296,7 @@ declare namespace Deno { * @category HTTP Server */ export function serve( - options: - | ServeTcpOptions - | (ServeTcpOptions & TlsCertifiedKeyPem), + options: ServeTcpOptions | (ServeTcpOptions & TlsCertifiedKeyPem), handler: ServeHandler, ): HttpServer; /** Serves HTTP requests with the given option bag. @@ -5392,11 +5375,7 @@ declare namespace Deno { * * @category FFI */ - export type NativeBigIntType = - | "u64" - | "i64" - | "usize" - | "isize"; + export type NativeBigIntType = "u64" | "i64" | "usize" | "isize"; /** The native boolean type for interfacing to foreign functions. * @@ -5512,7 +5491,8 @@ declare namespace Deno { : T extends NativeBigIntType ? bigint : T extends NativeBooleanType ? boolean : T extends NativePointerType - ? T extends NativeTypedPointer ? U | null : PointerValue + ? T extends NativeTypedPointer ? U | null + : PointerValue : T extends NativeFunctionType ? T extends NativeTypedFunction ? PointerValue | null : PointerValue @@ -5536,7 +5516,8 @@ declare namespace Deno { : T extends NativeBigIntType ? bigint : T extends NativeBooleanType ? boolean : T extends NativePointerType - ? T extends NativeTypedPointer ? U | null : PointerValue + ? T extends NativeTypedPointer ? U | null + : PointerValue : T extends NativeFunctionType ? T extends NativeTypedFunction ? PointerObject | null : PointerValue @@ -5550,9 +5531,8 @@ declare namespace Deno { */ export type ToNativeParameterTypes = // - [(T[number])[]] extends [T] ? ToNativeType[] - : [readonly (T[number])[]] extends [T] - ? readonly ToNativeType[] + [T[number][]] extends [T] ? ToNativeType[] + : [readonly T[number][]] extends [T] ? readonly ToNativeType[] : T extends readonly [...NativeType[]] ? { [K in keyof T]: ToNativeType; } @@ -5575,7 +5555,8 @@ declare namespace Deno { : T extends NativeBigIntType ? bigint : T extends NativeBooleanType ? boolean : T extends NativePointerType - ? T extends NativeTypedPointer ? U | null : PointerValue + ? T extends NativeTypedPointer ? U | null + : PointerValue : T extends NativeBufferType ? PointerValue : T extends NativeFunctionType ? T extends NativeTypedFunction ? PointerObject | null @@ -5599,7 +5580,8 @@ declare namespace Deno { : T extends NativeBigIntType ? bigint : T extends NativeBooleanType ? boolean : T extends NativePointerType - ? T extends NativeTypedPointer ? U | null : PointerValue + ? T extends NativeTypedPointer ? U | null + : PointerValue : T extends NativeBufferType ? PointerValue : T extends NativeFunctionType ? T extends NativeTypedFunction ? PointerObject | null @@ -5609,12 +5591,10 @@ declare namespace Deno { /** @category FFI */ - export type FromNativeParameterTypes< - T extends readonly NativeType[], - > = + export type FromNativeParameterTypes = // - [(T[number])[]] extends [T] ? FromNativeType[] - : [readonly (T[number])[]] extends [T] + [T[number][]] extends [T] ? FromNativeType[] + : [readonly T[number][]] extends [T] ? readonly FromNativeType[] : T extends readonly [...NativeType[]] ? { [K in keyof T]: FromNativeType; @@ -5695,8 +5675,10 @@ declare namespace Deno { /** @category FFI */ - export type ConditionalAsync = - IsAsync extends true ? Promise : T; + export type ConditionalAsync< + IsAsync extends boolean | undefined, + T, + > = IsAsync extends true ? Promise : T; /** A utility type that infers a foreign library interface. * @@ -5804,10 +5786,7 @@ declare namespace Deno { getCString(offset?: number): string; /** Gets a C string (`null` terminated string) at the specified byte offset * from the specified pointer. */ - static getCString( - pointer: PointerObject, - offset?: number, - ): string; + static getCString(pointer: PointerObject, offset?: number): string; /** Gets an `ArrayBuffer` of length `byteLength` at the specified byte * offset from the pointer. */ getArrayBuffer(byteLength: number, offset?: number): ArrayBuffer; @@ -5847,9 +5826,10 @@ declare namespace Deno { /** The definition of the function. */ definition: Fn; - constructor(pointer: PointerObject>, definition: Fn); - /** @deprecated Properly type {@linkcode pointer} using {@linkcode NativeTypedFunction} or {@linkcode UnsafeCallbackDefinition} types. */ - constructor(pointer: PointerObject, definition: Fn); + constructor( + pointer: PointerObject>>, + definition: Fn, + ); /** Call the foreign function. */ call: FromForeignFunction; @@ -5876,9 +5856,10 @@ declare namespace Deno { export type UnsafeCallbackFunction< Parameters extends readonly NativeType[] = readonly NativeType[], Result extends NativeResultType = NativeResultType, - > = Parameters extends readonly [] ? () => ToNativeResultType : ( - ...args: FromNativeParameterTypes - ) => ToNativeResultType; + > = Parameters extends readonly [] ? () => ToNativeResultType + : ( + ...args: FromNativeParameterTypes + ) => ToNativeResultType; /** An unsafe function pointer for passing JavaScript functions as C function * pointers to foreign function calls. diff --git a/tests/ffi/tests/ffi_types.ts b/tests/ffi/tests/ffi_types.ts index 590af9369a..de2f4e4059 100644 --- a/tests/ffi/tests/ffi_types.ts +++ b/tests/ffi/tests/ffi_types.ts @@ -2,86 +2,78 @@ // deno-lint-ignore-file // Only for testing types. Invoke with `deno cache` -const remote = Deno.dlopen( - "dummy_lib.so", - { - method1: { parameters: ["usize", "bool"], result: "void" }, - method2: { parameters: [], result: "void" }, - method3: { parameters: ["usize"], result: "void" }, - method4: { parameters: ["isize"], result: "void" }, - method5: { parameters: ["u8"], result: "void" }, - method6: { parameters: ["u16"], result: "void" }, - method7: { parameters: ["u32"], result: "void" }, - method8: { parameters: ["u64"], result: "void" }, - method9: { parameters: ["i8"], result: "void" }, - method10: { parameters: ["i16"], result: "void" }, - method11: { parameters: ["i32"], result: "void" }, - method12: { parameters: ["i64"], result: "void" }, - method13: { parameters: ["f32"], result: "void" }, - method14: { parameters: ["f64"], result: "void" }, - method15: { parameters: ["pointer"], result: "void" }, - method16: { parameters: [], result: "usize" }, - method17: { parameters: [], result: "usize", nonblocking: true }, - method18: { parameters: [], result: "pointer" }, - method19: { parameters: [], result: "pointer", nonblocking: true }, - method20: { - parameters: ["pointer"], - result: "void", - }, - method21: { - parameters: [ - "pointer", - ], - result: "void", - }, - method22: { - parameters: ["pointer"], - result: "void", - }, - method23: { - parameters: ["buffer"], - result: "void", - }, - method24: { - parameters: ["bool"], - result: "bool", - }, - method25: { - parameters: [], - result: "void", - optional: true, - }, - static1: { type: "usize" }, - static2: { type: "pointer" }, - static3: { type: "usize" }, - static4: { type: "isize" }, - static5: { type: "u8" }, - static6: { type: "u16" }, - static7: { type: "u32" }, - static8: { type: "u64" }, - static9: { type: "i8" }, - static10: { type: "i16" }, - static11: { type: "i32" }, - static12: { type: "i64" }, - static13: { type: "f32" }, - static14: { type: "f64" }, - static15: { type: "bool" }, - static16: { - type: "bool", - optional: true, - }, +const remote = Deno.dlopen("dummy_lib.so", { + method1: { parameters: ["usize", "bool"], result: "void" }, + method2: { parameters: [], result: "void" }, + method3: { parameters: ["usize"], result: "void" }, + method4: { parameters: ["isize"], result: "void" }, + method5: { parameters: ["u8"], result: "void" }, + method6: { parameters: ["u16"], result: "void" }, + method7: { parameters: ["u32"], result: "void" }, + method8: { parameters: ["u64"], result: "void" }, + method9: { parameters: ["i8"], result: "void" }, + method10: { parameters: ["i16"], result: "void" }, + method11: { parameters: ["i32"], result: "void" }, + method12: { parameters: ["i64"], result: "void" }, + method13: { parameters: ["f32"], result: "void" }, + method14: { parameters: ["f64"], result: "void" }, + method15: { parameters: ["pointer"], result: "void" }, + method16: { parameters: [], result: "usize" }, + method17: { parameters: [], result: "usize", nonblocking: true }, + method18: { parameters: [], result: "pointer" }, + method19: { parameters: [], result: "pointer", nonblocking: true }, + method20: { + parameters: ["pointer"], + result: "void", }, -); + method21: { + parameters: ["pointer"], + result: "void", + }, + method22: { + parameters: ["pointer"], + result: "void", + }, + method23: { + parameters: ["buffer"], + result: "void", + }, + method24: { + parameters: ["bool"], + result: "bool", + }, + method25: { + parameters: [], + result: "void", + optional: true, + }, + static1: { type: "usize" }, + static2: { type: "pointer" }, + static3: { type: "usize" }, + static4: { type: "isize" }, + static5: { type: "u8" }, + static6: { type: "u16" }, + static7: { type: "u32" }, + static8: { type: "u64" }, + static9: { type: "i8" }, + static10: { type: "i16" }, + static11: { type: "i32" }, + static12: { type: "i64" }, + static13: { type: "f32" }, + static14: { type: "f64" }, + static15: { type: "bool" }, + static16: { + type: "bool", + optional: true, + }, +}); -Deno.dlopen( - "dummy_lib_2.so", - { - wrong_method1: { - parameters: [], - result: "function", - }, +Deno.dlopen("dummy_lib_2.so", { + wrong_method1: { + parameters: [], + result: "function", }, -); +}); // @ts-expect-error: Invalid argument remote.symbols.method1(0); @@ -173,7 +165,7 @@ result4.then((_0: Deno.BufferSource) => {}); result4.then((_1: null | Deno.UnsafePointer) => {}); const fnptr = new Deno.UnsafeFnPointer( - {} as Deno.PointerObject, + {} as Deno.PointerObject>, { parameters: ["u32", "pointer"], result: "void", @@ -340,16 +332,18 @@ const static16_right: boolean | null = remote.symbols.static16; // Adapted from https://stackoverflow.com/a/53808212/10873797 type Equal = (() => G extends T ? 1 : 2) extends - (() => G extends U ? 1 : 2) ? true + () => G extends U ? 1 : 2 ? true : false; type AssertEqual< Expected extends $, Got extends $$, $ = [Equal] extends [true] ? Expected - : ([Expected] extends [Got] ? never : Got), + : [Expected] extends [Got] ? never + : Got, $$ = [Equal] extends [true] ? Got - : ([Got] extends [Expected] ? never : Got), + : [Got] extends [Expected] ? never + : Got, > = never; type AssertNotEqual< @@ -372,9 +366,7 @@ type MyFunctionDefinition = Deno.UnsafeCallbackDefinition< [typeof foo, "u32"], typeof myPointer >; -const myFunction = "function" as Deno.NativeTypedFunction< - MyFunctionDefinition ->; +const myFunction = "function" as Deno.NativeTypedFunction; type __Tests__ = [ empty: AssertEqual< @@ -396,14 +388,12 @@ type __Tests__ = [ }; close(): void; }, - Deno.DynamicLibrary< - { - pushBuf: { - parameters: ["buffer", "pointer", "function"]; - result: "void"; - }; - } - > + Deno.DynamicLibrary<{ + pushBuf: { + parameters: ["buffer", "pointer", "function"]; + result: "void"; + }; + }> >, higher_order_returns: AssertEqual< { @@ -416,27 +406,23 @@ type __Tests__ = [ }; close(): void; }, - Deno.DynamicLibrary< - { - pushBuf: { - parameters: ["buffer", "pointer", "function"]; - result: "pointer"; - }; - } - > + Deno.DynamicLibrary<{ + pushBuf: { + parameters: ["buffer", "pointer", "function"]; + result: "pointer"; + }; + }> >, non_exact_params: AssertEqual< { symbols: { - foo: ( - ...args: (number | Deno.PointerValue | null)[] - ) => bigint; + foo: (...args: (number | Deno.PointerValue | null)[]) => bigint; }; close(): void; }, - Deno.DynamicLibrary< - { foo: { parameters: ("i32" | "pointer")[]; result: "u64" } } - > + Deno.DynamicLibrary<{ + foo: { parameters: ("i32" | "pointer")[]; result: "u64" }; + }> >, non_exact_params_empty: AssertEqual< { @@ -445,9 +431,7 @@ type __Tests__ = [ }; close(): void; }, - Deno.DynamicLibrary< - { foo: { parameters: []; result: "i32" } } - > + Deno.DynamicLibrary<{ foo: { parameters: []; result: "i32" } }> >, non_exact_params_empty: AssertNotEqual< { @@ -456,9 +440,7 @@ type __Tests__ = [ }; close(): void; }, - Deno.DynamicLibrary< - { foo: { parameters: []; result: "i32" } } - > + Deno.DynamicLibrary<{ foo: { parameters: []; result: "i32" } }> >, enum_param: AssertEqual< { @@ -467,9 +449,7 @@ type __Tests__ = [ }; close(): void; }, - Deno.DynamicLibrary< - { foo: { parameters: [typeof foo]; result: "void" } } - > + Deno.DynamicLibrary<{ foo: { parameters: [typeof foo]; result: "void" } }> >, enum_return: AssertEqual< { @@ -478,9 +458,7 @@ type __Tests__ = [ }; close(): void; }, - Deno.DynamicLibrary< - { foo: { parameters: []; result: typeof foo } } - > + Deno.DynamicLibrary<{ foo: { parameters: []; result: typeof foo } }> >, typed_pointer_param: AssertEqual< { @@ -489,9 +467,9 @@ type __Tests__ = [ }; close(): void; }, - Deno.DynamicLibrary< - { foo: { parameters: [typeof myPointer]; result: "void" } } - > + Deno.DynamicLibrary<{ + foo: { parameters: [typeof myPointer]; result: "void" }; + }> >, typed_pointer_return: AssertEqual< { @@ -500,9 +478,7 @@ type __Tests__ = [ }; close(): void; }, - Deno.DynamicLibrary< - { foo: { parameters: []; result: typeof myPointer } } - > + Deno.DynamicLibrary<{ foo: { parameters: []; result: typeof myPointer } }> >, typed_function_param: AssertEqual< { @@ -511,9 +487,9 @@ type __Tests__ = [ }; close(): void; }, - Deno.DynamicLibrary< - { foo: { parameters: [typeof myFunction]; result: "void" } } - > + Deno.DynamicLibrary<{ + foo: { parameters: [typeof myFunction]; result: "void" }; + }> >, typed_function_return: AssertEqual< { @@ -522,8 +498,6 @@ type __Tests__ = [ }; close(): void; }, - Deno.DynamicLibrary< - { foo: { parameters: []; result: typeof myFunction } } - > + Deno.DynamicLibrary<{ foo: { parameters: []; result: typeof myFunction } }> >, ];