Skip to content

Commit 7751530

Browse files
committed
fix: fix object.get/set
1 parent 045dc33 commit 7751530

2 files changed

Lines changed: 43 additions & 84 deletions

File tree

crates/napi/src/bindgen_runtime/js_values/map.rs

Lines changed: 12 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,15 @@ where
3737
if NODE_VERSION_MAJOR >= 20 && NODE_VERSION_MINOR >= 18 {
3838
fast_set_property(raw_env, obj.0.value, k, v)?;
3939
} else {
40-
set_property(raw_env, obj.0.value, k, v)?;
40+
obj.set(k.as_ref(), v)?;
4141
}
4242
}
4343
#[cfg(not(all(
4444
feature = "experimental",
4545
feature = "node_version_detect",
4646
any(all(target_os = "linux", feature = "dyn-symbols"), target_os = "macos")
4747
)))]
48-
set_property(raw_env, obj.0.value, k, v)?;
48+
obj.set(k.as_ref(), v)?;
4949
}
5050

5151
unsafe { Object::to_napi_value(raw_env, obj) }
@@ -62,8 +62,8 @@ where
6262
let obj = unsafe { Object::from_napi_value(env, napi_val)? };
6363
let mut map = HashMap::default();
6464
for key in Object::keys(&obj)?.into_iter() {
65-
if let Some(val) = get_property(env, obj.0.value, &key)? {
66-
map.insert(K::from(key), V::from_napi_value(env, val)?);
65+
if let Some(val) = obj.get(&key)? {
66+
map.insert(K::from(key), val);
6767
}
6868
}
6969

@@ -102,15 +102,15 @@ where
102102
if crate::bindgen_runtime::NODE_VERSION_MAJOR >= 20 && NODE_VERSION_MINOR >= 18 {
103103
fast_set_property(raw_env, obj.0.value, k, v)?;
104104
} else {
105-
set_property(raw_env, obj.0.value, k, v)?;
105+
obj.set(k.as_ref(), v)?;
106106
}
107107
}
108108
#[cfg(not(all(
109109
feature = "experimental",
110110
feature = "node_version_detect",
111111
any(all(target_os = "linux", feature = "dyn-symbols"), target_os = "macos")
112112
)))]
113-
set_property(raw_env, obj.0.value, k, v)?;
113+
obj.set(k.as_ref(), v)?;
114114
}
115115

116116
unsafe { Object::to_napi_value(raw_env, obj) }
@@ -126,8 +126,8 @@ where
126126
let obj = unsafe { Object::from_napi_value(env, napi_val)? };
127127
let mut map = BTreeMap::default();
128128
for key in Object::keys(&obj)?.into_iter() {
129-
if let Some(val) = get_property(env, obj.0.value, &key)? {
130-
map.insert(K::from(key), V::from_napi_value(env, val)?);
129+
if let Some(val) = obj.get(&key)? {
130+
map.insert(K::from(key), val);
131131
}
132132
}
133133

@@ -170,15 +170,15 @@ where
170170
if crate::bindgen_runtime::NODE_VERSION_MAJOR >= 20 && NODE_VERSION_MINOR >= 18 {
171171
fast_set_property(raw_env, obj.0.value, k, v)?;
172172
} else {
173-
set_property(raw_env, obj.0.value, k, v)?;
173+
obj.set(k.as_ref(), v)?;
174174
}
175175
}
176176
#[cfg(not(all(
177177
feature = "experimental",
178178
feature = "node_version_detect",
179179
any(all(target_os = "linux", feature = "dyn-symbols"), target_os = "macos")
180180
)))]
181-
set_property(raw_env, obj.0.value, k, v)?;
181+
obj.set(k.as_ref(), v)?;
182182
}
183183

184184
unsafe { Object::to_napi_value(raw_env, obj) }
@@ -196,8 +196,8 @@ where
196196
let obj = unsafe { Object::from_napi_value(env, napi_val)? };
197197
let mut map = IndexMap::default();
198198
for key in Object::keys(&obj)?.into_iter() {
199-
if let Some(val) = get_property(env, obj.0.value, &key)? {
200-
map.insert(K::from(key), V::from_napi_value(env, val)?);
199+
if let Some(val) = obj.get(&key)? {
200+
map.insert(K::from(key), val);
201201
}
202202
}
203203

@@ -234,62 +234,3 @@ fn fast_set_property<K: AsRef<str>, V: ToNapiValue>(
234234
)?;
235235
Ok(())
236236
}
237-
238-
fn set_property<K: AsRef<str>, V: ToNapiValue>(
239-
raw_env: sys::napi_env,
240-
obj: sys::napi_value,
241-
k: K,
242-
v: V,
243-
) -> Result<()> {
244-
let mut property_key = std::ptr::null_mut();
245-
check_status!(
246-
unsafe {
247-
sys::napi_create_string_utf8(
248-
raw_env,
249-
k.as_ref().as_ptr().cast(),
250-
k.as_ref().len() as isize,
251-
&mut property_key,
252-
)
253-
},
254-
"Create property key failed"
255-
)?;
256-
check_status!(
257-
unsafe { sys::napi_set_property(raw_env, obj, property_key, V::to_napi_value(raw_env, v)?,) },
258-
"Failed to set property"
259-
)?;
260-
Ok(())
261-
}
262-
263-
fn get_property<K: AsRef<str>>(
264-
raw_env: sys::napi_env,
265-
obj: sys::napi_value,
266-
k: K,
267-
) -> Result<Option<sys::napi_value>> {
268-
let mut property_key = std::ptr::null_mut();
269-
check_status!(
270-
unsafe {
271-
sys::napi_create_string_utf8(
272-
raw_env,
273-
k.as_ref().as_ptr().cast(),
274-
k.as_ref().len() as isize,
275-
&mut property_key,
276-
)
277-
},
278-
"Create property key failed"
279-
)?;
280-
281-
let mut ret = std::ptr::null_mut();
282-
283-
check_status!(
284-
unsafe { sys::napi_get_property(raw_env, obj, property_key, &mut ret) },
285-
"Failed to get property",
286-
)?;
287-
288-
let ty = type_of!(raw_env, ret)?;
289-
290-
Ok(if ty == ValueType::Undefined {
291-
None
292-
} else {
293-
Some(ret)
294-
})
295-
}

crates/napi/src/bindgen_runtime/js_values/object.rs

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::{bindgen_prelude::*, check_status, sys, type_of, JsObject, ValueType};
2-
use std::{ffi::CString, ptr};
2+
use std::ptr;
33

44
pub type Object = JsObject;
55

@@ -31,13 +31,22 @@ impl Object {
3131
}
3232

3333
fn get_inner(&self, field: &str) -> Result<Option<sys::napi_value>> {
34-
let c_field = CString::new(field)?;
35-
3634
unsafe {
35+
let mut property_key = std::ptr::null_mut();
36+
check_status!(
37+
sys::napi_create_string_utf8(
38+
self.0.env,
39+
field.as_ptr().cast(),
40+
field.len() as isize,
41+
&mut property_key,
42+
),
43+
"Feild to create property key with `{field}`"
44+
)?;
45+
3746
let mut ret = ptr::null_mut();
3847

3948
check_status!(
40-
sys::napi_get_named_property(self.0.env, self.0.value, c_field.as_ptr(), &mut ret),
49+
sys::napi_get_property(self.0.env, self.0.value, property_key, &mut ret),
4150
"Failed to get property with field `{field}`",
4251
)?;
4352

@@ -56,15 +65,24 @@ impl Object {
5665
}
5766

5867
unsafe fn set_inner(&mut self, field: &str, napi_val: sys::napi_value) -> Result<()> {
59-
let c_field = CString::new(field)?;
60-
61-
unsafe {
62-
check_status!(
63-
sys::napi_set_named_property(self.0.env, self.0.value, c_field.as_ptr(), napi_val),
64-
"Failed to set property with field `{field}`",
65-
)?;
66-
Ok(())
67-
}
68+
let mut property_key = std::ptr::null_mut();
69+
check_status!(
70+
unsafe {
71+
sys::napi_create_string_utf8(
72+
self.0.env,
73+
field.as_ptr().cast(),
74+
field.len() as isize,
75+
&mut property_key,
76+
)
77+
},
78+
"Feild to create property key with `{field}`"
79+
)?;
80+
81+
check_status!(
82+
unsafe { sys::napi_set_property(self.0.env, self.0.value, property_key, napi_val) },
83+
"Failed to set property with field `{field}`"
84+
)?;
85+
Ok(())
6886
}
6987

7088
pub fn keys(obj: &Object) -> Result<Vec<String>> {

0 commit comments

Comments
 (0)