summaryrefslogtreecommitdiff
path: root/ext/ffi
diff options
context:
space:
mode:
authorDivy Srivastava <dj.srivastava23@gmail.com>2024-10-24 09:41:38 +0530
committerGitHub <noreply@github.com>2024-10-24 09:41:38 +0530
commitfa49fd404be82daf8ac7228bf54e780135f67b17 (patch)
tree3c8b98387bebf16831f5f59b0cf0ac0dbc1234df /ext/ffi
parent6d587cbfc800a627efb32d377b260954ccd7a1ed (diff)
fix(ext/ffi): return u64/i64 as bigints from nonblocking ffi calls (#26486)
Fixes https://github.com/denoland/deno/issues/25194
Diffstat (limited to 'ext/ffi')
-rw-r--r--ext/ffi/Cargo.toml1
-rw-r--r--ext/ffi/call.rs27
2 files changed, 16 insertions, 12 deletions
diff --git a/ext/ffi/Cargo.toml b/ext/ffi/Cargo.toml
index 80b0180d0..59dc13ed9 100644
--- a/ext/ffi/Cargo.toml
+++ b/ext/ffi/Cargo.toml
@@ -21,6 +21,7 @@ dynasmrt = "1.2.3"
libffi = "=3.2.0"
libffi-sys = "=2.3.0"
log.workspace = true
+num-bigint.workspace = true
serde.workspace = true
serde-value = "0.7"
serde_json = "1.0"
diff --git a/ext/ffi/call.rs b/ext/ffi/call.rs
index d337b29b0..ef61dc383 100644
--- a/ext/ffi/call.rs
+++ b/ext/ffi/call.rs
@@ -9,12 +9,14 @@ use crate::FfiPermissions;
use crate::ForeignFunction;
use deno_core::op2;
use deno_core::serde_json::Value;
+use deno_core::serde_v8::BigInt as V8BigInt;
use deno_core::serde_v8::ExternalPointer;
use deno_core::unsync::spawn_blocking;
use deno_core::v8;
use deno_core::OpState;
use deno_core::ResourceId;
use libffi::middle::Arg;
+use num_bigint::BigInt;
use serde::Serialize;
use std::cell::RefCell;
use std::ffi::c_void;
@@ -202,6 +204,7 @@ where
#[serde(untagged)]
pub enum FfiValue {
Value(Value),
+ BigInt(V8BigInt),
External(ExternalPointer),
}
@@ -251,18 +254,18 @@ fn ffi_call(
NativeType::I32 => {
FfiValue::Value(Value::from(cif.call::<i32>(fun_ptr, &call_args)))
}
- NativeType::U64 => {
- FfiValue::Value(Value::from(cif.call::<u64>(fun_ptr, &call_args)))
- }
- NativeType::I64 => {
- FfiValue::Value(Value::from(cif.call::<i64>(fun_ptr, &call_args)))
- }
- NativeType::USize => {
- FfiValue::Value(Value::from(cif.call::<usize>(fun_ptr, &call_args)))
- }
- NativeType::ISize => {
- FfiValue::Value(Value::from(cif.call::<isize>(fun_ptr, &call_args)))
- }
+ NativeType::U64 => FfiValue::BigInt(V8BigInt::from(BigInt::from(
+ cif.call::<u64>(fun_ptr, &call_args),
+ ))),
+ NativeType::I64 => FfiValue::BigInt(V8BigInt::from(BigInt::from(
+ cif.call::<i64>(fun_ptr, &call_args),
+ ))),
+ NativeType::USize => FfiValue::BigInt(V8BigInt::from(BigInt::from(
+ cif.call::<usize>(fun_ptr, &call_args),
+ ))),
+ NativeType::ISize => FfiValue::BigInt(V8BigInt::from(BigInt::from(
+ cif.call::<isize>(fun_ptr, &call_args),
+ ))),
NativeType::F32 => {
FfiValue::Value(Value::from(cif.call::<f32>(fun_ptr, &call_args)))
}