Skip to content

Commit 4c53a36

Browse files
committed
fix: handle u64 conversion for number between MAX_SAFE_INTEGER and i64::MAX
1 parent 09f3d95 commit 4c53a36

File tree

2 files changed

+12
-0
lines changed

2 files changed

+12
-0
lines changed

src/value/value.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,14 @@ impl OwnedJsValue {
320320
});
321321
}
322322

323+
// numbers between 2^53 -1 and i64::MAX is treated as float in quickjs
324+
if self.is_float() {
325+
let float = self.to_float()?;
326+
return Ok(BigInt {
327+
inner: BigIntOrI64::Int(float as i64),
328+
});
329+
}
330+
323331
if self.is_short_bigint() {
324332
let int = unsafe { q::JS_Ext_GetShortBigInt(self.value) };
325333
return Ok(BigInt {

tests/convert.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ fn test_try_from_owned_js_value() {
1818
let value: Option<i32> = js_value.try_into().unwrap();
1919
assert_eq!(value, Some(42));
2020

21+
let js_value: OwnedJsValue = context.eval("1754784747637", false).unwrap();
22+
let value: Option<u64> = js_value.try_into().unwrap();
23+
assert_eq!(value, Some(1754784747637));
24+
2125
let js_value: OwnedJsValue = context.eval("true", false).unwrap();
2226
let value: bool = js_value.try_into().unwrap();
2327
assert_eq!(value, true);

0 commit comments

Comments
 (0)