current commit
261104.12 · ffi: support function calls from pointers
declare namespace InternalFFIBinding {
  type Buffer = Uint8Array;
  type BufferSource = Buffer | ArrayBuffer | ArrayBufferView | SharedArrayBuffer;
  type VoidType = 'void';
  type NumberType =
    | 'char'
    | 'int8' | 'i8'
    | 'uint8' | 'u8' | 'bool'
    | 'int16' | 'i16'
    | 'uint16' | 'u16'
    | 'int32' | 'i32'
    | 'uint32' | 'u32'
    | 'float32' | 'f32' | 'float'
    | 'float64' | 'f64' | 'double';
  type BigIntType = 'int64' | 'i64' | 'uint64' | 'u64';
  type PointerType =
    | 'pointer' | 'ptr'
    | 'string' | 'str'
    | 'buffer' | 'arraybuffer'
    | 'function';
  type ValueType = NumberType | BigIntType | PointerType;
  type ReturnType = VoidType | ValueType;
  type FFICallback = (...args: any[]) => unknown;

  interface FFIFunction {
    (...args: unknown[]): unknown;
    pointer: bigint;
  }
  interface FunctionSignature {
    arguments?: readonly ValueType[];
    return?: ReturnType;
  }

  class DynamicLibrary {
    constructor(path: string | null, binary?: ArrayBufferView);

    readonly path: string;
    readonly symbols: Record<string, bigint>;
    readonly functions: Record<string, FFIFunction>;

    close(): void;
    getFunction(name: string, signature: FunctionSignature): FFIFunction;
    toFunction(pointer: bigint, signature: FunctionSignature): FFIFunction;
    getFunctions(): Record<string, FFIFunction>;
    getFunctions(
      definitions: Record<string, FunctionSignature>,
    ): Record<string, FFIFunction>;
    getSymbol(name: string): bigint;
    getSymbols(): Record<string, bigint>;
    registerCallback(callback: FFICallback): bigint;
    registerCallback(
      signature: FunctionSignature,
      callback: FFICallback
    ): bigint;
    unregisterCallback(pointer: bigint): void;
    refCallback(pointer: bigint): void;
    unrefCallback(pointer: bigint): void;
    [Symbol.dispose](): void;
  }
}
export interface FFIBinding {
  DynamicLibrary: typeof InternalFFIBinding.DynamicLibrary;
  toString(pointer: bigint): string | null;
  toBuffer(pointer: bigint, length: number, copy?: boolean): InternalFFIBinding.Buffer;
  toArrayBuffer(pointer: bigint, length: number, copy?: boolean): ArrayBuffer;

  exportBytes(source: InternalFFIBinding.BufferSource, pointer: bigint, length: number): void;
  getRawPointer(source: InternalFFIBinding.BufferSource): bigint;
  getCurrentEventLoop(): bigint;

  getInt8(pointer: bigint, offset?: number): number;
  getUint8(pointer: bigint, offset?: number): number;
  getInt16(pointer: bigint, offset?: number): number;
  getUint16(pointer: bigint, offset?: number): number;
  getInt32(pointer: bigint, offset?: number): number;
  getUint32(pointer: bigint, offset?: number): number;
  getInt64(pointer: bigint, offset?: number): bigint;
  getUint64(pointer: bigint, offset?: number): bigint;
  getFloat32(pointer: bigint, offset?: number): number;
  getFloat64(pointer: bigint, offset?: number): number;

  setInt8(pointer: bigint, offset: number, value: number): void;
  setUint8(pointer: bigint, offset: number, value: number): void;
  setInt16(pointer: bigint, offset: number, value: number): void;
  setUint16(pointer: bigint, offset: number, value: number): void;
  setInt32(pointer: bigint, offset: number, value: number): void;
  setUint32(pointer: bigint, offset: number, value: number): void;
  setInt64(pointer: bigint, offset: number, value: number | bigint): void;
  setUint64(pointer: bigint, offset: number, value: number | bigint): void;
  setFloat32(pointer: bigint, offset: number, value: number): void;
  setFloat64(pointer: bigint, offset: number, value: number): void;

  charIsSigned: boolean;
  uintptrMax: bigint;

  kSbSharedBuffer: symbol;
  kSbInvokeSlow: symbol;
  kSbArguments: symbol;
  kSbReturn: symbol;
  kFastArguments: symbol;
  kFastBufferInvoke: symbol;
}