MCPcopy Create free account
hub / github.com/bytecodealliance/wit-bindgen / export

Method export

crates/c/src/lib.rs:2318–2478  ·  view source on GitHub ↗
(&mut self, func: &Function, interface_name: Option<&WorldKey>)

Source from the content-addressed store, hash-verified

2316 }
2317
2318 fn export(&mut self, func: &Function, interface_name: Option<&WorldKey>) {
2319 let async_ = self
2320 .r#gen
2321 .opts
2322 .async_
2323 .is_async(self.resolve, interface_name, func, false);
2324
2325 let (variant, prefix) = if async_ {
2326 self.r#gen.needs_async = true;
2327 (AbiVariant::GuestExportAsync, "[async-lift]")
2328 } else {
2329 (AbiVariant::GuestExport, "")
2330 };
2331
2332 let sig = self.resolve.wasm_signature(variant, func);
2333
2334 self.src.c_fns("\n");
2335
2336 let core_module_name = interface_name.map(|s| self.resolve.name_world_key(s));
2337 let export_name = func.legacy_core_export_name(core_module_name.as_deref());
2338
2339 // Print the actual header for this function into the header file, and
2340 // it's what we'll be calling.
2341 let h_sig = self.print_sig(interface_name, func, &sig, async_);
2342
2343 // Generate, in the C source file, the raw wasm signature that has the
2344 // canonical ABI.
2345 uwriteln!(
2346 self.src.c_adapters,
2347 "\n__attribute__((__export_name__(\"{prefix}{export_name}\")))"
2348 );
2349 let name = self.c_func_name(interface_name, func);
2350 let import_name = self.r#gen.names.tmp(&format!("__wasm_export_{name}"));
2351
2352 let mut f = FunctionBindgen::new(self, h_sig, &import_name);
2353 match sig.results.len() {
2354 0 => f.r#gen.src.c_adapters("void"),
2355 1 => f.r#gen.src.c_adapters(wasm_type(sig.results[0])),
2356 _ => unimplemented!("multi-value return not supported"),
2357 }
2358 f.r#gen.src.c_adapters(" ");
2359 f.r#gen.src.c_adapters(&import_name);
2360 f.r#gen.src.c_adapters("(");
2361 for (i, param) in sig.params.iter().enumerate() {
2362 if i > 0 {
2363 f.r#gen.src.c_adapters(", ");
2364 }
2365 let name = f.locals.tmp("arg");
2366 uwrite!(f.r#gen.src.c_adapters, "{} {}", wasm_type(*param), name);
2367 f.params.push(name);
2368 }
2369 if sig.params.len() == 0 {
2370 f.r#gen.src.c_adapters("void");
2371 }
2372 f.r#gen.src.c_adapters(") {\n");
2373
2374 // Perform all lifting/lowering and append it to our src.
2375 abi::call(

Callers 2

export_interfaceMethod · 0.45
export_funcsMethod · 0.45

Calls 15

newFunction · 0.85
callFunction · 0.85
post_returnFunction · 0.85
c_fnsMethod · 0.80
mapMethod · 0.80
print_sigMethod · 0.80
c_func_nameMethod · 0.80
c_adaptersMethod · 0.80
joinMethod · 0.80
as_strMethod · 0.80
as_mut_stringMethod · 0.80

Tested by

no test coverage detected