Skip to content

Commit 498499a

Browse files
committed
fix: limit host bindgen errors to guest exports
Signed-off-by: James Sturtevant <jsturtevant@gmail.com>
1 parent a9a448b commit 498499a

10 files changed

Lines changed: 143 additions & 199 deletions

File tree

src/hyperlight_component_util/src/emit.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ pub struct Mod {
124124
pub items: TokenStream,
125125
pub traits: BTreeMap<Ident, Trait>,
126126
pub impls: BTreeMap<(Vec<Ident>, Ident), TokenStream>,
127+
pub emitted_type_names: BTreeSet<Ident>,
127128
}
128129
impl Mod {
129130
pub fn empty() -> Self {
@@ -132,6 +133,7 @@ impl Mod {
132133
items: TokenStream::new(),
133134
traits: BTreeMap::new(),
134135
impls: BTreeMap::new(),
136+
emitted_type_names: BTreeSet::new(),
135137
}
136138
}
137139
/// Get a reference to a sub-module, creating it if necessary

src/hyperlight_component_util/src/host.rs

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ fn emit_export_instance<'a, 'b, 'c>(s: &'c mut State<'a, 'b>, wn: WitName, it: &
122122

123123
let ns = wn.namespace_path();
124124
let nsi = wn.namespace_idents();
125-
let trait_name = kebab_to_type(wn.name);
125+
let trait_name = kebab_to_exports_name(wn.name);
126126
let r#trait = s.r#trait(&nsi, trait_name.clone());
127127
let tvs = r#trait
128128
.tvs
@@ -221,28 +221,17 @@ fn emit_import_extern_decl<'a, 'b, 'c>(
221221
})
222222
.unzip::<_, _, Vec<_>, Vec<_>>();
223223
let tp = s.cur_trait_path();
224-
let (callname, is_constructor) = match kebab_to_fn(ed.kebab_name) {
225-
FnName::Plain(n) => (quote! { #tp::#n }, false),
224+
let callname = match kebab_to_fn(ed.kebab_name) {
225+
FnName::Plain(n) => quote! { #tp::#n },
226226
FnName::Associated(r, m) => {
227227
let hp = s.helper_path();
228228
match m {
229-
ResourceItemName::Constructor => (quote! { #hp #r::new }, true),
230-
ResourceItemName::Method(mn) => (quote! { #hp #r::#mn }, false),
231-
ResourceItemName::Static(mn) => (quote! { #hp #r::#mn }, false),
229+
ResourceItemName::Constructor => quote! { #hp #r::new },
230+
ResourceItemName::Method(mn) => quote! { #hp #r::#mn },
231+
ResourceItemName::Static(mn) => quote! { #hp #r::#mn },
232232
}
233233
}
234234
};
235-
// WIT constructors always return `own<resource>` with no
236-
// spec-level mechanism for fallibility, so their trait
237-
// signature stays as `fn new(...) -> Self::T` (no Result
238-
// wrapper). Non-constructor trait methods return
239-
// `Result` on the host side, so we append `?` to
240-
// propagate errors from the host implementation.
241-
let try_op = if is_constructor {
242-
quote! {}
243-
} else {
244-
quote! { ? }
245-
};
246235
let SelfInfo {
247236
orig_id,
248237
type_id,
@@ -263,7 +252,7 @@ fn emit_import_extern_decl<'a, 'b, 'c>(
263252
&mut #inner_id
264253
),
265254
#(#pus),*
266-
)#try_op;
255+
);
267256
Ok(#marshal_result)
268257
})
269258
.unwrap();

src/hyperlight_component_util/src/resource.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ pub fn emit_tables<'a, 'b, 'c>(
9999
#sphantom
100100
}
101101
impl<I: #bound #sv> #rtsid<I #svs> {
102-
fn new() -> Self {
102+
pub(crate) fn new() -> Self {
103103
#rtsid {
104104
#(#inits,)*
105105
_phantomI: ::core::marker::PhantomData,

src/hyperlight_component_util/src/rtypes.rs

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -641,7 +641,7 @@ fn emit_extern_decl<'a, 'b, 'c>(
641641
.map(|p| emit_func_param(&mut s, p))
642642
.collect::<Vec<_>>();
643643
let result = emit_func_result(&mut s, &ft.result);
644-
let result = if !s.is_guest {
644+
let result = if !s.is_guest && s.is_export {
645645
quote! { ::std::result::Result<#result, ::hyperlight_host::error::HyperlightError> }
646646
} else {
647647
result
@@ -668,7 +668,7 @@ fn emit_extern_decl<'a, 'b, 'c>(
668668
}
669669
ResourceItemName::Method(n) => {
670670
let result = emit_func_result(&mut sv, &ft.result);
671-
let result = if !sv.is_guest {
671+
let result = if !sv.is_guest && sv.is_export {
672672
quote! { ::std::result::Result<#result, ::hyperlight_host::error::HyperlightError> }
673673
} else {
674674
result
@@ -679,7 +679,7 @@ fn emit_extern_decl<'a, 'b, 'c>(
679679
}
680680
ResourceItemName::Static(n) => {
681681
let result = emit_func_result(&mut sv, &ft.result);
682-
let result = if !sv.is_guest {
682+
let result = if !sv.is_guest && sv.is_export {
683683
quote! { ::std::result::Result<#result, ::hyperlight_host::error::HyperlightError> }
684684
} else {
685685
result
@@ -706,6 +706,9 @@ fn emit_extern_decl<'a, 'b, 'c>(
706706
) -> TokenStream {
707707
let id = kebab_to_type(ed.kebab_name);
708708
let mut s = s.helper();
709+
if !s.cur_mod().emitted_type_names.insert(id.clone()) {
710+
return TokenStream::new();
711+
}
709712

710713
let t = emit_defined(&mut s, v, id, t);
711714
s.cur_mod().items.extend(t);
@@ -727,6 +730,9 @@ fn emit_extern_decl<'a, 'b, 'c>(
727730
let rn = kebab_to_type(ed.kebab_name);
728731
s.add_helper_supertrait(rn.clone());
729732
let mut s = s.helper();
733+
if !s.cur_mod().emitted_type_names.insert(rn.clone()) {
734+
return quote! {};
735+
}
730736
s.cur_trait = Some(rn.clone());
731737
s.cur_trait().items.extend(quote! {
732738
type T: ::core::marker::Send;
@@ -744,7 +750,12 @@ fn emit_extern_decl<'a, 'b, 'c>(
744750
emit_instance(&mut s, wn.clone(), it);
745751

746752
let nsids = wn.namespace_idents();
747-
let repr = s.r#trait(&nsids, kebab_to_type(wn.name));
753+
let trait_name = if !s.is_guest && s.is_export {
754+
kebab_to_exports_name(wn.name)
755+
} else {
756+
kebab_to_type(wn.name)
757+
};
758+
let repr = s.r#trait(&nsids, trait_name.clone());
748759
let vs = if !repr.tvs.is_empty() {
749760
let vs = repr.tvs.clone();
750761
let tvs = vs
@@ -760,9 +771,9 @@ fn emit_extern_decl<'a, 'b, 'c>(
760771
let tns = wn.namespace_path();
761772
let tn = kebab_to_type(wn.name);
762773
let trait_bound = if tns.is_empty() {
763-
quote! { #rp #tn }
774+
quote! { #rp #trait_name }
764775
} else {
765-
quote! { #rp #tns::#tn }
776+
quote! { #rp #tns::#trait_name }
766777
};
767778
quote! {
768779
type #tn: #trait_bound #vs;
@@ -781,7 +792,11 @@ fn emit_instance<'a, 'b, 'c>(s: &'c mut State<'a, 'b>, wn: WitName, it: &'c Inst
781792
tracing::debug!("emitting instance {:?}", wn);
782793
let mut s = s.with_cursor(wn.namespace_idents());
783794

784-
let name = kebab_to_type(wn.name);
795+
let name = if !s.is_guest && s.is_export {
796+
kebab_to_exports_name(wn.name)
797+
} else {
798+
kebab_to_type(wn.name)
799+
};
785800

786801
s.cur_helper_mod = Some(kebab_to_namespace(wn.name));
787802
s.cur_trait = Some(name.clone());

0 commit comments

Comments
 (0)