1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-23 15:16:54 -05:00

fix(ext/ffi): return u64/i64 as bigints from nonblocking ffi calls (#26486)

Fixes https://github.com/denoland/deno/issues/25194
This commit is contained in:
Divy Srivastava 2024-10-24 09:41:38 +05:30 committed by GitHub
parent 6d587cbfc8
commit fa49fd404b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 21 additions and 16 deletions

1
Cargo.lock generated
View file

@ -1577,6 +1577,7 @@ dependencies = [
"libffi", "libffi",
"libffi-sys", "libffi-sys",
"log", "log",
"num-bigint",
"serde", "serde",
"serde-value", "serde-value",
"serde_json", "serde_json",

View file

@ -21,6 +21,7 @@ dynasmrt = "1.2.3"
libffi = "=3.2.0" libffi = "=3.2.0"
libffi-sys = "=2.3.0" libffi-sys = "=2.3.0"
log.workspace = true log.workspace = true
num-bigint.workspace = true
serde.workspace = true serde.workspace = true
serde-value = "0.7" serde-value = "0.7"
serde_json = "1.0" serde_json = "1.0"

View file

@ -9,12 +9,14 @@ use crate::FfiPermissions;
use crate::ForeignFunction; use crate::ForeignFunction;
use deno_core::op2; use deno_core::op2;
use deno_core::serde_json::Value; use deno_core::serde_json::Value;
use deno_core::serde_v8::BigInt as V8BigInt;
use deno_core::serde_v8::ExternalPointer; use deno_core::serde_v8::ExternalPointer;
use deno_core::unsync::spawn_blocking; use deno_core::unsync::spawn_blocking;
use deno_core::v8; use deno_core::v8;
use deno_core::OpState; use deno_core::OpState;
use deno_core::ResourceId; use deno_core::ResourceId;
use libffi::middle::Arg; use libffi::middle::Arg;
use num_bigint::BigInt;
use serde::Serialize; use serde::Serialize;
use std::cell::RefCell; use std::cell::RefCell;
use std::ffi::c_void; use std::ffi::c_void;
@ -202,6 +204,7 @@ where
#[serde(untagged)] #[serde(untagged)]
pub enum FfiValue { pub enum FfiValue {
Value(Value), Value(Value),
BigInt(V8BigInt),
External(ExternalPointer), External(ExternalPointer),
} }
@ -251,18 +254,18 @@ fn ffi_call(
NativeType::I32 => { NativeType::I32 => {
FfiValue::Value(Value::from(cif.call::<i32>(fun_ptr, &call_args))) FfiValue::Value(Value::from(cif.call::<i32>(fun_ptr, &call_args)))
} }
NativeType::U64 => { NativeType::U64 => FfiValue::BigInt(V8BigInt::from(BigInt::from(
FfiValue::Value(Value::from(cif.call::<u64>(fun_ptr, &call_args))) cif.call::<u64>(fun_ptr, &call_args),
} ))),
NativeType::I64 => { NativeType::I64 => FfiValue::BigInt(V8BigInt::from(BigInt::from(
FfiValue::Value(Value::from(cif.call::<i64>(fun_ptr, &call_args))) cif.call::<i64>(fun_ptr, &call_args),
} ))),
NativeType::USize => { NativeType::USize => FfiValue::BigInt(V8BigInt::from(BigInt::from(
FfiValue::Value(Value::from(cif.call::<usize>(fun_ptr, &call_args))) cif.call::<usize>(fun_ptr, &call_args),
} ))),
NativeType::ISize => { NativeType::ISize => FfiValue::BigInt(V8BigInt::from(BigInt::from(
FfiValue::Value(Value::from(cif.call::<isize>(fun_ptr, &call_args))) cif.call::<isize>(fun_ptr, &call_args),
} ))),
NativeType::F32 => { NativeType::F32 => {
FfiValue::Value(Value::from(cif.call::<f32>(fun_ptr, &call_args))) FfiValue::Value(Value::from(cif.call::<f32>(fun_ptr, &call_args)))
} }

View file

@ -95,10 +95,10 @@ fn basic() {
579.912\n\ 579.912\n\
579.912\n\ 579.912\n\
579\n\ 579\n\
8589934590\n\ 8589934590n\n\
-8589934590\n\ -8589934590n\n\
8589934590\n\ 8589934590n\n\
-8589934590\n\ -8589934590n\n\
9007199254740992n\n\ 9007199254740992n\n\
9007199254740992n\n\ 9007199254740992n\n\
-9007199254740992n\n\ -9007199254740992n\n\