From 7ac58719abb323a8a13aa763377b8f6dd9f7b174 Mon Sep 17 00:00:00 2001 From: Aapo Alasuutari Date: Fri, 5 Aug 2022 19:27:12 +0300 Subject: [PATCH] feat(ext/ffi): Add static method variants to Deno.UnsafePointerView (#15146) --- cli/dts/lib.deno.unstable.d.ts | 16 +++++++++++++++- ext/ffi/00_ffi.js | 26 +++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/cli/dts/lib.deno.unstable.d.ts b/cli/dts/lib.deno.unstable.d.ts index 037dbe2c13..60637f2263 100644 --- a/cli/dts/lib.deno.unstable.d.ts +++ b/cli/dts/lib.deno.unstable.d.ts @@ -535,10 +535,24 @@ declare namespace Deno { getFloat64(offset?: number): number; /** Gets a C string (null terminated string) at the specified byte offset from the pointer. */ getCString(offset?: number): string; + /** Gets a C string (null terminated string) at the specified byte offset from the specified pointer. */ + static getCString(pointer: BigInt, offset?: number): string; /** Gets an ArrayBuffer of length `byteLength` at the specified byte offset from the pointer. */ getArrayBuffer(byteLength: number, offset?: number): ArrayBuffer; - /** Copies the memory of the pointer into a typed array. Length is determined from the typed array's `byteLength`. Also takes optional offset from the pointer. */ + /** Gets an ArrayBuffer of length `byteLength` at the specified byte offset from the specified pointer. */ + static getArrayBuffer( + pointer: BigInt, + byteLength: number, + offset?: number, + ): ArrayBuffer; + /** Copies the memory of the pointer into a typed array. Length is determined from the typed array's `byteLength`. Also takes optional byte offset from the pointer. */ copyInto(destination: TypedArray, offset?: number): void; + /** Copies the memory of the specified pointer into a typed array. Length is determined from the typed array's `byteLength`. Also takes optional byte offset from the pointer. */ + static copyInto( + pointer: BigInt, + destination: TypedArray, + offset?: number, + ): void; } /** diff --git a/ext/ffi/00_ffi.js b/ext/ffi/00_ffi.js index 4d77449e88..7ba5aadc04 100644 --- a/ext/ffi/00_ffi.js +++ b/ext/ffi/00_ffi.js @@ -121,10 +121,25 @@ ); } + static getCString(pointer, offset = 0) { + return core.opSync( + "op_ffi_cstr_read", + offset ? BigInt(pointer) + BigInt(offset) : pointer, + ); + } + getArrayBuffer(byteLength, offset = 0) { return core.opSync( "op_ffi_get_buf", - offset ? this.pointer + BigInt(offset) : this.pointer, + offset ? BigInt(this.pointer) + BigInt(offset) : this.pointer, + byteLength, + ); + } + + static getArrayBuffer(pointer, byteLength, offset = 0) { + return core.opSync( + "op_ffi_get_buf", + offset ? BigInt(pointer) + BigInt(offset) : pointer, byteLength, ); } @@ -137,6 +152,15 @@ destination.byteLength, ); } + + static copyInto(pointer, destination, offset = 0) { + core.opSync( + "op_ffi_buf_copy_into", + offset ? BigInt(pointer) + BigInt(offset) : pointer, + destination, + destination.byteLength, + ); + } } class UnsafePointer {