neon::types

Struct JsBigInt

Source
pub struct JsBigInt(/* private fields */);
Available on crate feature napi-6 only.
Expand description

The type of JavaScript BigInt values.

§Example

The following shows an example of adding two numbers that exceed Number.MAX_SAFE_INTEGER.


fn add_bigint(mut cx: FunctionContext) -> JsResult<JsBigInt> {
    // Get references to the `BigInt` arguments
    let a = cx.argument::<JsBigInt>(0)?;
    let b = cx.argument::<JsBigInt>(1)?;

    // Convert the `BigInt` to `i64`
    let a = a.to_i64(&mut cx)
        // On failure, convert err to a `RangeError` exception
        .or_throw(&mut cx)?;

    let b = b.to_i64(&mut cx).or_throw(&mut cx)?;
    let sum = a + b;

    // Create a `BigInt` from the `i64` sum
    Ok(JsBigInt::from_i64(&mut cx, sum))
}

Implementations§

Source§

impl JsBigInt

Source

pub const POSITIVE: Sign = Sign::Positive

Source

pub const NEGATIVE: Sign = Sign::Negative

Source

pub fn from_i64<'cx, C>(cx: &mut C, n: i64) -> Handle<'cx, Self>
where C: Context<'cx>,

Creates a BigInt from an i64.

§Example
let value: Handle<JsBigInt> = JsBigInt::from_i64(&mut cx, 42);
Source

pub fn from_u64<'cx, C>(cx: &mut C, n: u64) -> Handle<'cx, Self>
where C: Context<'cx>,

Creates a BigInt from a u64.

§Example
let value: Handle<JsBigInt> = JsBigInt::from_u64(&mut cx, 42);
Source

pub fn from_i128<'cx, C>(cx: &mut C, n: i128) -> Handle<'cx, Self>
where C: Context<'cx>,

Creates a BigInt from an i128.

§Example
let value: Handle<JsBigInt> = JsBigInt::from_i128(&mut cx, 42);
Source

pub fn from_u128<'cx, C>(cx: &mut C, n: u128) -> Handle<'cx, Self>
where C: Context<'cx>,

Creates a BigInt from a u128.

§Example
let value: Handle<JsBigInt> = JsBigInt::from_u128(&mut cx, 42);
Source

pub fn from_digits_le<'cx, C>( cx: &mut C, sign: Sign, digits: &[u64], ) -> Handle<'cx, Self>
where C: Context<'cx>,

Creates a BigInt from a signed magnitude. The BigInt is calculated as:
Sign * (digit[0] x (2⁶⁴)⁰ + digit[0] x (2⁶⁴)¹ + digit[0] x (2⁶⁴)² ...)

§Example
// Creates a `BigInt` equal to `2n ** 128n`
let value: Handle<JsBigInt> = JsBigInt::from_digits_le(
    &mut cx,
    JsBigInt::POSITIVE,
    &[0, 0, 1],
);
Source

pub fn to_i64<'cx, C>(&self, cx: &mut C) -> Result<i64, RangeError<i64>>
where C: Context<'cx>,

Reads an i64 from a BigInt.

Fails on overflow and underflow.

§Example

See JsBigInt.

Source

pub fn to_u64<'cx, C>(&self, cx: &mut C) -> Result<u64, RangeError<u64>>
where C: Context<'cx>,

Reads a u64 from a BigInt.

Fails on overflow or a negative sign.

Source

pub fn to_i128<'cx, C>(&self, cx: &mut C) -> Result<i128, RangeError<i128>>
where C: Context<'cx>,

Reads an i128 from a BigInt.

Fails on overflow and underflow.

Source

pub fn to_u128<'cx, C>(&self, cx: &mut C) -> Result<u128, RangeError<u128>>
where C: Context<'cx>,

Reads a u128 from a BigInt.

Fails on overflow or a negative sign.

Source

pub fn to_digits_le<'cx, C>(&self, cx: &mut C) -> (Sign, Vec<u64>)
where C: Context<'cx>,

Gets a signed magnitude pair from a BigInt.

The BigInt is calculated as:
Sign * (digit[0] x (2⁶⁴)⁰ + digit[0] x (2⁶⁴)¹ + digit[0] x (2⁶⁴)² ...)

Source

pub fn read_digits_le<'cx, C>( &self, cx: &mut C, digits: &mut [u64], ) -> (Sign, usize)
where C: Context<'cx>,

Gets the sign from a BigInt and reads digits into a buffer. The returned usize is the total number of digits in the BigInt.

§Example

Read a u256 from a BigInt.

fn bigint_to_u256(cx: &mut FunctionContext, n: Handle<JsBigInt>) -> NeonResult<[u64; 4]> {
    let mut digits = [0; 4];
    let (sign, num_digits) = n.read_digits_le(cx, &mut digits);

    if sign == JsBigInt::NEGATIVE {
        return cx.throw_error("Underflow reading u256 from BigInt");
    }

    if num_digits > digits.len() {
        return cx.throw_error("Overflow reading u256 from BigInt");
    }

    Ok(digits)
}
Source

pub fn len<'cx, C>(&self, cx: &mut C) -> usize
where C: Context<'cx>,

Gets the number of u64 digits in a BigInt

Trait Implementations§

Source§

impl Debug for JsBigInt

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Value for JsBigInt

Source§

fn to_string<'cx, C: Context<'cx>>(&self, cx: &mut C) -> JsResult<'cx, JsString>

Source§

fn as_value<'cx, C: Context<'cx>>(&self, _: &mut C) -> Handle<'cx, JsValue>

Source§

fn to_raw(&self) -> Value

Available on crate feature sys only.
Get a raw reference to the wrapped Node-API value.
Source§

unsafe fn from_raw<'cx, C: Context<'cx>>( cx: &C, value: Value, ) -> Handle<'cx, Self>

Available on crate feature sys only.
Creates a value from a raw Node-API value. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.