Skip to content

Commit bdf4a77

Browse files
authored
fix(visitor): check type for the underlying js object (#684)
1 parent 2f6b8d2 commit bdf4a77

File tree

1 file changed

+27
-6
lines changed

1 file changed

+27
-6
lines changed

napi/src/transformer.rs

+27-6
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,14 @@ impl Visitors<JsObject> {
9999
fn named(&self, stage: VisitStage, name: &str) -> Option<JsFunction> {
100100
self
101101
.for_stage(stage)
102-
.and_then(|m| m.get_named_property::<JsFunction>(name).ok())
102+
.and_then(|m| m.get_named_property::<JsUnknown>(name).ok())
103+
.and_then(|v| {
104+
if let Ok(ValueType::Function) = v.get_type() {
105+
v.try_into().ok()
106+
} else {
107+
None
108+
}
109+
})
103110
}
104111

105112
fn custom(&self, stage: VisitStage, obj: &str, name: &str) -> Option<JsFunction> {
@@ -177,7 +184,14 @@ impl JsVisitor {
177184
let mut types = VisitTypes::empty();
178185
macro_rules! get {
179186
($name: literal, $( $t: ident )|+) => {{
180-
let res: Option<JsFunction> = visitor.get_named_property($name).ok();
187+
let res: Option<JsFunction> = visitor.get_named_property::<JsUnknown>($name).ok().and_then(|v| {
188+
if let Ok(ValueType::Function) = v.get_type() {
189+
v.try_into().ok()
190+
} else {
191+
None
192+
}
193+
});
194+
181195
if res.is_some() {
182196
types |= $( VisitTypes::$t )|+;
183197
}
@@ -190,12 +204,19 @@ impl JsVisitor {
190204

191205
macro_rules! map {
192206
($name: literal, $( $t: ident )|+) => {{
193-
if let Ok(obj) = visitor.get_named_property::<JsObject>($name) {
207+
let obj: Option<JsObject> = visitor.get_named_property::<JsUnknown>($name).ok().and_then(|v| {
208+
if let Ok(ValueType::Object) = v.get_type() {
209+
v.try_into().ok()
210+
} else {
211+
None
212+
}
213+
});
214+
215+
if obj.is_some() {
194216
types |= $( VisitTypes::$t )|+;
195-
env.create_reference(obj).ok()
196-
} else {
197-
None
198217
}
218+
219+
obj.and_then(|obj| env.create_reference(obj).ok())
199220
}};
200221
}
201222

0 commit comments

Comments
 (0)