/// A custom section within a wasm module. #[derive(Debug)] pubenum Custom<'a> { /// A raw custom section with the manual placement and bytes specified.
Raw(RawCustomSection<'a>), /// A producers custom section.
Producers(Producers<'a>), /// The `dylink.0` custom section
Dylink0(Dylink0<'a>),
}
impl Custom<'_> { /// Where this custom section is placed. pubfn place(&self) -> CustomPlace { matchself {
Custom::Raw(s) => s.place,
Custom::Producers(_) => CustomPlace::AfterLast,
Custom::Dylink0(_) => CustomPlace::BeforeFirst,
}
}
/// The name of this custom section pubfn name(&self) -> &str { matchself {
Custom::Raw(s) => s.name,
Custom::Producers(_) => "producers",
Custom::Dylink0(_) => "dylink.0",
}
}
}
/// A wasm custom section within a module. #[derive(Debug)] pubstruct RawCustomSection<'a> { /// Where this `@custom` was defined. pub span: Span,
/// Name of the custom section. pub name: &'a str,
/// Where the custom section is being placed, pub place: CustomPlace,
/// Payload of this custom section. pub data: Vec<&'a [u8]>,
}
/// Possible locations to place a custom section within a module. #[derive(Debug, PartialEq, Copy, Clone)] pubenum CustomPlace { /// This custom section will appear before the first section in the module.
BeforeFirst, /// This custom section will be placed just before a known section.
Before(CustomPlaceAnchor), /// This custom section will be placed just after a known section.
After(CustomPlaceAnchor), /// This custom section will appear after the last section in the module.
AfterLast,
}
/// Known sections that custom sections can be placed relative to. #[derive(Debug, PartialEq, Eq, Copy, Clone)] #[allow(missing_docs)] pubenum CustomPlaceAnchor { Type,
Import,
Func,
Table,
Memory,
Global,
Export,
Start,
Elem,
Code,
Data,
Tag,
}
impl<'a> Parse<'a> for RawCustomSection<'a> { fn parse(parser: Parser<'a>) -> Result<Self> { let span = parser.parse::<annotation::custom>()?.0; let name = parser.parse()?; let place = if parser.peek::<token::LParen>()? {
parser.parens(|p| p.parse())?
} else {
CustomPlace::AfterLast
}; letmut data = Vec::new(); while !parser.is_empty() {
data.push(parser.parse()?);
}
Ok(RawCustomSection {
span,
name,
place,
data,
})
}
}
impl<'a> Parse<'a> for CustomPlace { fn parse(parser: Parser<'a>) -> Result<Self> { letmut l = parser.lookahead1(); let ctor = if l.peek::<kw::before>()? {
parser.parse::<kw::before>()?; if l.peek::<kw::first>()? {
parser.parse::<kw::first>()?; return Ok(CustomPlace::BeforeFirst);
}
CustomPlace::Before asfn(CustomPlaceAnchor) -> _
} elseif l.peek::<kw::after>()? {
parser.parse::<kw::after>()?; if l.peek::<kw::last>()? {
parser.parse::<kw::last>()?; return Ok(CustomPlace::AfterLast);
}
CustomPlace::After
} else { return Err(l.error());
};
Ok(ctor(parser.parse()?))
}
}
impl<'a> Parse<'a> for CustomPlaceAnchor { fn parse(parser: Parser<'a>) -> Result<Self> { if parser.peek::<kw::r#type>()? {
parser.parse::<kw::r#type>()?; return Ok(CustomPlaceAnchor::Type);
} if parser.peek::<kw::import>()? {
parser.parse::<kw::import>()?; return Ok(CustomPlaceAnchor::Import);
} if parser.peek::<kw::func>()? {
parser.parse::<kw::func>()?; return Ok(CustomPlaceAnchor::Func);
} if parser.peek::<kw::table>()? {
parser.parse::<kw::table>()?; return Ok(CustomPlaceAnchor::Table);
} if parser.peek::<kw::memory>()? {
parser.parse::<kw::memory>()?; return Ok(CustomPlaceAnchor::Memory);
} if parser.peek::<kw::global>()? {
parser.parse::<kw::global>()?; return Ok(CustomPlaceAnchor::Global);
} if parser.peek::<kw::export>()? {
parser.parse::<kw::export>()?; return Ok(CustomPlaceAnchor::Export);
} if parser.peek::<kw::start>()? {
parser.parse::<kw::start>()?; return Ok(CustomPlaceAnchor::Start);
} if parser.peek::<kw::elem>()? {
parser.parse::<kw::elem>()?; return Ok(CustomPlaceAnchor::Elem);
} if parser.peek::<kw::code>()? {
parser.parse::<kw::code>()?; return Ok(CustomPlaceAnchor::Code);
} if parser.peek::<kw::data>()? {
parser.parse::<kw::data>()?; return Ok(CustomPlaceAnchor::Data);
} if parser.peek::<kw::tag>()? {
parser.parse::<kw::tag>()?; return Ok(CustomPlaceAnchor::Tag);
}
Err(parser.error("expected a valid section name"))
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.