diff --git libquickjs-sys/embed/quickjs/libbf.c libquickjs-sys/embed/quickjs/libbf.c
index cbabf95..f0625f9 100644
--- libquickjs-sys/embed/quickjs/libbf.c
+++ libquickjs-sys/embed/quickjs/libbf.c
@@ -2261,14 +2261,17 @@ int bf_get_int64(int64_t *pres, const bf_t *a, int flags)
             v = INT64_MAX;
         }
     } else {
+        ret = BF_ST_OVERFLOW;
         slimb_t bit_pos = a->len * LIMB_BITS - a->expn;
         v = get_bits(a->tab, a->len, bit_pos); 
 #if LIMB_BITS == 32
         v |= (uint64_t)get_bits(a->tab, a->len, bit_pos + 32) << 32;
 #endif
-        if (a->sign)
+        if (a->sign) {
+            if (a->expn == 64 && v == (uint64_t)INT64_MAX + 1)
+                ret = 0; // not overflow, but INT64_MIN
             v = -v;
-        ret = 0;
+        }
     }
     *pres = v;
     return ret;
diff --git libquickjs-sys/embed/quickjs/quickjs.c libquickjs-sys/embed/quickjs/quickjs.c
index 7bb20cb..ad5811c 100644
--- libquickjs-sys/embed/quickjs/quickjs.c
+++ libquickjs-sys/embed/quickjs/quickjs.c
@@ -11244,15 +11244,16 @@ static void JS_FreeBigInt(JSContext *ctx, bf_t *a, bf_t *buf)
 static int JS_ToBigInt64Free(JSContext *ctx, int64_t *pres, JSValue val)
 {
     bf_t a_s, *a;
+    int ret;
 
     a = JS_ToBigIntFree(ctx, &a_s, val);
     if (!a) {
         *pres = 0;
         return -1;
     }
-    bf_get_int64(pres, a, BF_GET_INT_MOD);
+    ret = bf_get_int64(pres, a, BF_GET_INT_MOD);
     JS_FreeBigInt(ctx, a, &a_s);
-    return 0;
+    return ret;
 }
 
 int JS_ToBigInt64(JSContext *ctx, int64_t *pres, JSValueConst val)
