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

Method parse_external_name

cranelift/reader/src/parser.rs:1319–1374  ·  view source on GitHub ↗

Parse an external name. For example, in a function reference decl, the parser would be in this state: fn0 = * name signature

(&mut self)

Source from the content-addressed store, hash-verified

1317 // fn0 = * name signature
1318 //
1319 fn parse_external_name(&mut self) -> ParseResult<ExternalName> {
1320 match self.token() {
1321 Some(Token::Name(s)) => {
1322 self.consume();
1323 s.parse()
1324 .map_err(|_| self.error("invalid test case or libcall name"))
1325 }
1326
1327 Some(Token::UserNameRef(name_ref)) => {
1328 self.consume();
1329 Ok(ExternalName::user(UserExternalNameRef::new(
1330 name_ref as usize,
1331 )))
1332 }
1333
1334 Some(Token::UserRef(namespace)) => {
1335 self.consume();
1336 if let Some(Token::Colon) = self.token() {
1337 self.consume();
1338 match self.token() {
1339 Some(Token::Integer(index_str)) => {
1340 let index: u32 = u32::from_str_radix(index_str, 10).map_err(|_| {
1341 self.error("the integer given overflows the u32 type")
1342 })?;
1343 self.consume();
1344
1345 // Deduplicate the reference (O(n), but should be fine for tests),
1346 // to follow `FunctionParameters::declare_imported_user_function`,
1347 // otherwise this will cause ref mismatches when asserted below.
1348 let name_ref = self
1349 .predeclared_external_names
1350 .iter()
1351 .find_map(|(reff, name)| {
1352 if name.index == index && name.namespace == namespace {
1353 Some(reff)
1354 } else {
1355 None
1356 }
1357 })
1358 .unwrap_or_else(|| {
1359 self.predeclared_external_names
1360 .push(ir::UserExternalName { namespace, index })
1361 });
1362
1363 Ok(ExternalName::user(name_ref))
1364 }
1365 _ => err!(self.loc, "expected integer"),
1366 }
1367 } else {
1368 err!(self.loc, "expected colon")
1369 }
1370 }
1371
1372 _ => err!(self.loc, "expected external name"),
1373 }
1374 }
1375
1376 // Parse a function signature.

Callers 2

parse_function_declMethod · 0.80

Calls 8

OkFunction · 0.85
tokenMethod · 0.80
newFunction · 0.50
consumeMethod · 0.45
parseMethod · 0.45
errorMethod · 0.45
iterMethod · 0.45
pushMethod · 0.45

Tested by

no test coverage detected