MCPcopy Create free account
hub / github.com/bytecodealliance/wasmtime / export

Method export

crates/wit-bindgen/src/lib.rs:633–878  ·  view source on GitHub ↗
(&mut self, resolve: &Resolve, name: &WorldKey, item: &WorldItem)

Source from the content-addressed store, hash-verified

631 }
632
633 fn export(&mut self, resolve: &Resolve, name: &WorldKey, item: &WorldItem) {
634 let wt = self.wasmtime_path();
635 let mut generator = InterfaceGenerator::new(self, resolve);
636 let field;
637 let ty;
638 let ty_index;
639 let load;
640 let get_index;
641 match item {
642 WorldItem::Function(func) => {
643 generator.define_rust_guest_export(resolve, None, func);
644 let body = mem::take(&mut generator.src).into();
645 load = generator.extract_typed_function(func).1;
646 assert!(generator.src.is_empty());
647 generator.generator.exports.funcs.push(body);
648 ty_index = format!("{wt}::component::ComponentExportIndex");
649 field = func_field_name(resolve, func);
650 ty = format!("{wt}::component::Func");
651 let sig = generator.typedfunc_sig(func, TypeMode::AllBorrowed("'_"));
652 let typecheck = format!(
653 "match item {{
654 {wt}::component::types::ComponentItem::ComponentFunc(func) => {{
655 {wt}::error::Context::context(
656 func.typecheck::<{sig}>(&_instance_type),
657 \"type-checking export func `{0}`\"
658 )?;
659 index
660 }}
661 _ => Err({wt}::format_err!(\"export `{0}` is not a function\"))?,
662 }}",
663 func.name
664 );
665 get_index = format!(
666 "{{ let (item, index) = _component.get_export(None, \"{}\")
667 .ok_or_else(|| {wt}::format_err!(\"no export `{0}` found\"))?;
668 {typecheck}
669 }}",
670 func.name
671 );
672 }
673 WorldItem::Type { .. } => unreachable!(),
674 WorldItem::Interface { id, .. } => {
675 generator
676 .generator
677 .name_interface(resolve, *id, name, InterfaceKind::Export);
678 generator.current_interface = Some((*id, name, InterfaceKind::Export));
679 generator.types(*id);
680 let struct_name = "Guest";
681 let iface = &resolve.interfaces[*id];
682 let iface_name = match name {
683 WorldKey::Name(name) => name,
684 WorldKey::Interface(_) => iface.name.as_ref().unwrap(),
685 };
686 uwriteln!(generator.src, "#[derive(Clone)]");
687 uwriteln!(generator.src, "pub struct {struct_name} {{");
688 for (_, func) in iface.functions.iter() {
689 uwriteln!(
690 generator.src,

Callers 12

generateMethod · 0.45
build_wasmFunction · 0.45
exportsMethod · 0.45
to_bytesMethod · 0.45
encodeMethod · 0.45
wasmMethod · 0.45
to_wasm_binaryMethod · 0.45
rewriteMethod · 0.45
instrumentFunction · 0.45
lift_accessorMethod · 0.45
finishMethod · 0.45

Calls 15

func_field_nameFunction · 0.85
to_rust_identFunction · 0.85
wasmtime_pathMethod · 0.80
typedfunc_sigMethod · 0.80
name_interfaceMethod · 0.80
or_insertMethod · 0.80
newFunction · 0.50
pushMethod · 0.45
typesMethod · 0.45
unwrapMethod · 0.45

Tested by 1