Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit a456fcd

Browse filesBrowse files
authored
refactor!(napi): add lifetime for JsNumber (#2609)
1 parent 8f85244 commit a456fcd
Copy full SHA for a456fcd

File tree

10 files changed

+89
-137
lines changed
Filter options

10 files changed

+89
-137
lines changed

‎bench/src/async_compute.rs

Copy file name to clipboardExpand all lines: bench/src/async_compute.rs
+2-2
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ fn bench_tokio_future(ctx: CallContext) -> Result<JsObject> {
4444
let buffer_ref = ctx.get::<Buffer>(0)?;
4545
ctx
4646
.env
47-
.execute_tokio_future(async move { Ok(buffer_ref.len()) }, |env, v: usize| {
48-
env.create_uint32(v as u32 + 1)
47+
.execute_tokio_future(async move { Ok(buffer_ref.len()) }, |_, v: usize| {
48+
Ok(v as u32 + 1)
4949
})
5050
}
5151

‎crates/napi/src/call_context.rs

Copy file name to clipboardExpand all lines: crates/napi/src/call_context.rs
+2-2
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ impl<'env> CallContext<'env> {
5757
}
5858
}
5959

60-
pub fn try_get<ArgType: NapiValue + TypeName + FromNapiValue>(
60+
pub fn try_get<ArgType: FromNapiValue + TypeName + FromNapiValue>(
6161
&self,
6262
index: usize,
6363
) -> Result<Either<ArgType, JsUndefined>> {
@@ -67,7 +67,7 @@ impl<'env> CallContext<'env> {
6767
"Arguments index out of range".to_owned(),
6868
))
6969
} else if index < self.length {
70-
unsafe { ArgType::from_raw(self.env.0, self.args[index]) }.map(Either::A)
70+
unsafe { ArgType::from_napi_value(self.env.0, self.args[index]) }.map(Either::A)
7171
} else {
7272
self.env.get_undefined().map(Either::B)
7373
}

‎crates/napi/src/env.rs

Copy file name to clipboardExpand all lines: crates/napi/src/env.rs
+4-4
Original file line numberDiff line numberDiff line change
@@ -81,29 +81,29 @@ impl Env {
8181
check_status!(unsafe {
8282
sys::napi_create_int32(self.0, int, (&mut raw_value) as *mut sys::napi_value)
8383
})?;
84-
Ok(unsafe { JsNumber::from_raw_unchecked(self.0, raw_value) })
84+
unsafe { JsNumber::from_napi_value(self.0, raw_value) }
8585
}
8686

8787
pub fn create_int64(&self, int: i64) -> Result<JsNumber> {
8888
let mut raw_value = ptr::null_mut();
8989
check_status!(unsafe {
9090
sys::napi_create_int64(self.0, int, (&mut raw_value) as *mut sys::napi_value)
9191
})?;
92-
Ok(unsafe { JsNumber::from_raw_unchecked(self.0, raw_value) })
92+
unsafe { JsNumber::from_napi_value(self.0, raw_value) }
9393
}
9494

9595
pub fn create_uint32(&self, number: u32) -> Result<JsNumber> {
9696
let mut raw_value = ptr::null_mut();
9797
check_status!(unsafe { sys::napi_create_uint32(self.0, number, &mut raw_value) })?;
98-
Ok(unsafe { JsNumber::from_raw_unchecked(self.0, raw_value) })
98+
unsafe { JsNumber::from_napi_value(self.0, raw_value) }
9999
}
100100

101101
pub fn create_double(&self, double: f64) -> Result<JsNumber> {
102102
let mut raw_value = ptr::null_mut();
103103
check_status!(unsafe {
104104
sys::napi_create_double(self.0, double, (&mut raw_value) as *mut sys::napi_value)
105105
})?;
106-
Ok(unsafe { JsNumber::from_raw_unchecked(self.0, raw_value) })
106+
unsafe { JsNumber::from_napi_value(self.0, raw_value) }
107107
}
108108

109109
/// [n_api_napi_create_bigint_int64](https://nodejs.org/api/n-api.html#n_api_napi_create_bigint_int64)

‎crates/napi/src/js_values/bigint.rs

Copy file name to clipboardExpand all lines: crates/napi/src/js_values/bigint.rs
+1-84
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use std::ptr;
44
use super::*;
55
use crate::{bindgen_runtime::TypeName, check_status, sys, Result};
66

7+
#[deprecated(since = "3.0.0", note = "Use `napi::bindgen_prelude::BigInt` instead")]
78
#[derive(Clone, Copy)]
89
pub struct JsBigInt {
910
pub(crate) raw: Value,
@@ -37,90 +38,6 @@ impl JsBigInt {
3738
word_count,
3839
}
3940
}
40-
41-
pub fn into_unknown(self) -> JsUnknown {
42-
unsafe { JsUnknown::from_raw_unchecked(self.raw.env, self.raw.value) }
43-
}
44-
45-
pub fn coerce_to_number(self) -> Result<JsNumber> {
46-
let mut new_raw_value = ptr::null_mut();
47-
check_status!(unsafe {
48-
sys::napi_coerce_to_number(self.raw.env, self.raw.value, &mut new_raw_value)
49-
})?;
50-
Ok(JsNumber(Value {
51-
env: self.raw.env,
52-
value: new_raw_value,
53-
value_type: ValueType::Number,
54-
}))
55-
}
56-
57-
pub fn coerce_to_string(self) -> Result<JsString> {
58-
let mut new_raw_value = ptr::null_mut();
59-
check_status!(unsafe {
60-
sys::napi_coerce_to_string(self.raw.env, self.raw.value, &mut new_raw_value)
61-
})?;
62-
Ok(JsString(Value {
63-
env: self.raw.env,
64-
value: new_raw_value,
65-
value_type: ValueType::String,
66-
}))
67-
}
68-
69-
pub fn coerce_to_object(self) -> Result<JsObject> {
70-
let mut new_raw_value = ptr::null_mut();
71-
check_status!(unsafe {
72-
sys::napi_coerce_to_object(self.raw.env, self.raw.value, &mut new_raw_value)
73-
})?;
74-
Ok(JsObject(Value {
75-
env: self.raw.env,
76-
value: new_raw_value,
77-
value_type: ValueType::Object,
78-
}))
79-
}
80-
81-
pub fn is_date(&self) -> Result<bool> {
82-
let mut is_date = true;
83-
check_status!(unsafe { sys::napi_is_date(self.raw.env, self.raw.value, &mut is_date) })?;
84-
Ok(is_date)
85-
}
86-
87-
pub fn is_error(&self) -> Result<bool> {
88-
let mut result = false;
89-
check_status!(unsafe { sys::napi_is_error(self.raw.env, self.raw.value, &mut result) })?;
90-
Ok(result)
91-
}
92-
93-
pub fn is_typedarray(&self) -> Result<bool> {
94-
let mut result = false;
95-
check_status!(unsafe { sys::napi_is_typedarray(self.raw.env, self.raw.value, &mut result) })?;
96-
Ok(result)
97-
}
98-
99-
pub fn is_dataview(&self) -> Result<bool> {
100-
let mut result = false;
101-
check_status!(unsafe { sys::napi_is_dataview(self.raw.env, self.raw.value, &mut result) })?;
102-
Ok(result)
103-
}
104-
105-
pub fn is_array(&self) -> Result<bool> {
106-
let mut is_array = false;
107-
check_status!(unsafe { sys::napi_is_array(self.raw.env, self.raw.value, &mut is_array) })?;
108-
Ok(is_array)
109-
}
110-
111-
pub fn is_buffer(&self) -> Result<bool> {
112-
let mut is_buffer = false;
113-
check_status!(unsafe { sys::napi_is_buffer(self.raw.env, self.raw.value, &mut is_buffer) })?;
114-
Ok(is_buffer)
115-
}
116-
117-
pub fn instanceof<Constructor: NapiRaw>(&self, constructor: Constructor) -> Result<bool> {
118-
let mut result = false;
119-
check_status!(unsafe {
120-
sys::napi_instanceof(self.raw.env, self.raw.value, constructor.raw(), &mut result)
121-
})?;
122-
Ok(result)
123-
}
12441
}
12542

12643
impl NapiRaw for JsBigInt {

‎crates/napi/src/js_values/de.rs

Copy file name to clipboardExpand all lines: crates/napi/src/js_values/de.rs
+2-5
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1-
use std::convert::TryInto;
2-
31
use serde::de::Visitor;
42
use serde::de::{DeserializeSeed, EnumAccess, MapAccess, SeqAccess, Unexpected, VariantAccess};
53

64
use crate::bindgen_runtime::{BufferSlice, FromNapiValue};
75
#[cfg(feature = "napi6")]
86
use crate::JsBigInt;
97
use crate::{type_of, NapiValue, Value, ValueType};
10-
use crate::{Error, JsBoolean, JsNumber, JsObject, JsString, JsUnknown, Result, Status};
8+
use crate::{Error, JsBoolean, JsObject, JsString, JsUnknown, Result, Status};
119

1210
use super::JsArrayBuffer;
1311

@@ -34,8 +32,7 @@ impl<'x> serde::de::Deserializer<'x> for &mut De<'_> {
3432
visitor.visit_bool(js_boolean.get_value()?)
3533
}
3634
ValueType::Number => {
37-
let js_number: f64 =
38-
unsafe { JsNumber::from_raw_unchecked(self.0.env, self.0.value).try_into()? };
35+
let js_number: f64 = unsafe { FromNapiValue::from_napi_value(self.0.env, self.0.value)? };
3936
if (js_number.trunc() - js_number).abs() < f64::EPSILON {
4037
visitor.visit_i64(js_number as i64)
4138
} else {

‎crates/napi/src/js_values/mod.rs

Copy file name to clipboardExpand all lines: crates/napi/src/js_values/mod.rs
+24-16
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,11 @@ pub trait JsValue: Sized {
125125

126126
/// Convert the value to an unknown
127127
fn into_unknown(self) -> JsUnknown {
128-
unsafe { JsUnknown::from_raw_unchecked(self.value().env, self.value().value) }
128+
JsUnknown(Value {
129+
env: self.value().env,
130+
value: self.value().value,
131+
value_type: ValueType::Unknown,
132+
})
129133
}
130134

131135
/// Coerce the value to a boolean
@@ -138,20 +142,23 @@ pub trait JsValue: Sized {
138142
unsafe { bool::from_napi_value(env, new_raw_value) }
139143
}
140144

141-
fn coerce_to_number(self) -> Result<JsNumber> {
145+
fn coerce_to_number(&self) -> Result<JsNumber> {
142146
let mut new_raw_value = ptr::null_mut();
143147
let env = self.value().env;
144148
check_status!(unsafe {
145149
sys::napi_coerce_to_number(env, self.value().value, &mut new_raw_value)
146150
})?;
147-
Ok(JsNumber(Value {
148-
env,
149-
value: new_raw_value,
150-
value_type: ValueType::Number,
151-
}))
151+
Ok(JsNumber(
152+
Value {
153+
env,
154+
value: new_raw_value,
155+
value_type: ValueType::Number,
156+
},
157+
std::marker::PhantomData,
158+
))
152159
}
153160

154-
fn coerce_to_string(self) -> Result<JsString> {
161+
fn coerce_to_string(&self) -> Result<JsString> {
155162
let mut new_raw_value = ptr::null_mut();
156163
let env = self.value().env;
157164
check_status!(unsafe {
@@ -687,16 +694,19 @@ macro_rules! impl_js_value_methods {
687694
}))
688695
}
689696

690-
pub fn coerce_to_number(self) -> Result<JsNumber> {
697+
pub fn coerce_to_number<'env>(self) -> Result<JsNumber<'env>> {
691698
let mut new_raw_value = ptr::null_mut();
692699
check_status!(unsafe {
693700
sys::napi_coerce_to_number(self.0.env, self.0.value, &mut new_raw_value)
694701
})?;
695-
Ok(JsNumber(Value {
696-
env: self.0.env,
697-
value: new_raw_value,
698-
value_type: ValueType::Number,
699-
}))
702+
Ok(JsNumber(
703+
Value {
704+
env: self.0.env,
705+
value: new_raw_value,
706+
value_type: ValueType::Number,
707+
},
708+
std::marker::PhantomData,
709+
))
700710
}
701711

702712
pub fn coerce_to_string(self) -> Result<JsString> {
@@ -1181,7 +1191,6 @@ impl_js_value_methods!(JsBuffer);
11811191
impl_js_value_methods!(JsArrayBuffer);
11821192
impl_js_value_methods!(JsTypedArray);
11831193
impl_js_value_methods!(JsDataView);
1184-
impl_js_value_methods!(JsNumber);
11851194
impl_js_value_methods!(JsString);
11861195
impl_js_value_methods!(JsObject);
11871196
#[cfg(feature = "napi5")]
@@ -1205,7 +1214,6 @@ impl_napi_value_trait!(JsBuffer, Object);
12051214
impl_napi_value_trait!(JsArrayBuffer, Object);
12061215
impl_napi_value_trait!(JsTypedArray, Object);
12071216
impl_napi_value_trait!(JsDataView, Object);
1208-
impl_napi_value_trait!(JsNumber, Number);
12091217
impl_napi_value_trait!(JsString, String);
12101218
impl_napi_value_trait!(JsObject, Object);
12111219
#[cfg(feature = "napi5")]

‎crates/napi/src/js_values/number.rs

Copy file name to clipboardExpand all lines: crates/napi/src/js_values/number.rs
+35-13
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,48 @@
11
use std::convert::TryFrom;
22

3-
use super::Value;
4-
use crate::bindgen_runtime::{TypeName, ValidateNapiValue};
5-
use crate::{check_status, ValueType};
6-
use crate::{sys, Error, Result};
3+
use crate::{
4+
bindgen_runtime::{FromNapiValue, TypeName, ValidateNapiValue},
5+
check_status, sys, Error, JsValue, Result, Value, ValueType,
6+
};
77

88
#[derive(Clone, Copy)]
9-
pub struct JsNumber(pub(crate) Value);
9+
pub struct JsNumber<'env>(
10+
pub(crate) Value,
11+
pub(crate) std::marker::PhantomData<&'env ()>,
12+
);
1013

11-
impl TypeName for JsNumber {
14+
impl TypeName for JsNumber<'_> {
1215
fn type_name() -> &'static str {
13-
"f64"
16+
"number"
1417
}
1518

1619
fn value_type() -> crate::ValueType {
1720
ValueType::Number
1821
}
1922
}
2023

21-
impl ValidateNapiValue for JsNumber {}
24+
impl ValidateNapiValue for JsNumber<'_> {}
2225

23-
impl JsNumber {
26+
impl JsValue for JsNumber<'_> {
27+
fn value(&self) -> Value {
28+
self.0
29+
}
30+
}
31+
32+
impl FromNapiValue for JsNumber<'_> {
33+
unsafe fn from_napi_value(env: sys::napi_env, napi_val: sys::napi_value) -> Result<Self> {
34+
Ok(JsNumber(
35+
Value {
36+
env,
37+
value: napi_val,
38+
value_type: ValueType::Number,
39+
},
40+
std::marker::PhantomData,
41+
))
42+
}
43+
}
44+
45+
impl JsNumber<'_> {
2446
pub fn get_uint32(&self) -> Result<u32> {
2547
let mut result = 0;
2648
check_status!(unsafe { sys::napi_get_value_uint32(self.0.env, self.0.value, &mut result) })?;
@@ -46,7 +68,7 @@ impl JsNumber {
4668
}
4769
}
4870

49-
impl TryFrom<JsNumber> for u32 {
71+
impl TryFrom<JsNumber<'_>> for u32 {
5072
type Error = Error;
5173

5274
fn try_from(value: JsNumber) -> Result<u32> {
@@ -56,7 +78,7 @@ impl TryFrom<JsNumber> for u32 {
5678
}
5779
}
5880

59-
impl TryFrom<JsNumber> for i32 {
81+
impl TryFrom<JsNumber<'_>> for i32 {
6082
type Error = Error;
6183

6284
fn try_from(value: JsNumber) -> Result<i32> {
@@ -66,7 +88,7 @@ impl TryFrom<JsNumber> for i32 {
6688
}
6789
}
6890

69-
impl TryFrom<JsNumber> for i64 {
91+
impl TryFrom<JsNumber<'_>> for i64 {
7092
type Error = Error;
7193

7294
fn try_from(value: JsNumber) -> Result<i64> {
@@ -76,7 +98,7 @@ impl TryFrom<JsNumber> for i64 {
7698
}
7799
}
78100

79-
impl TryFrom<JsNumber> for f64 {
101+
impl TryFrom<JsNumber<'_>> for f64 {
80102
type Error = Error;
81103

82104
fn try_from(value: JsNumber) -> Result<f64> {

‎crates/napi/src/js_values/value.rs

Copy file name to clipboard
+9-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
1+
use std::fmt::{self, Display};
2+
13
use crate::sys;
24

35
use super::ValueType;
46

5-
#[derive(Clone, Copy)]
7+
#[derive(Debug, Clone, Copy)]
68
pub struct Value {
79
pub env: sys::napi_env,
810
pub value: sys::napi_value,
911
pub value_type: ValueType,
1012
}
13+
14+
impl Display for Value {
15+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
16+
write!(f, "Value({:?})", self.value_type)
17+
}
18+
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.