Skip to content

Commit f6ae969

Browse files
author
Guy Bedford
authored
feat: add binary ranges to metadata (#933)
1 parent c4c9125 commit f6ae969

File tree

1 file changed

+43
-11
lines changed
  • crates/wasm-metadata/src

1 file changed

+43
-11
lines changed

crates/wasm-metadata/src/lib.rs

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use indexmap::{map::Entry, IndexMap};
33
use serde::Serialize;
44
use std::fmt;
55
use std::mem;
6+
use std::ops::Range;
67
use wasm_encoder::{ComponentSection as _, ComponentSectionId, Encode, Section};
78
use wasmparser::{
89
ComponentNameSectionReader, NameSectionReader, Parser, Payload::*, ProducersSectionReader,
@@ -333,13 +334,17 @@ pub enum Metadata {
333334
producers: Option<Producers>,
334335
/// All child modules and components inside the component.
335336
children: Vec<Box<Metadata>>,
337+
/// Byte range of the module in the parent binary
338+
range: Range<usize>,
336339
},
337340
/// Metadata found inside a WebAssembly module.
338341
Module {
339342
/// The module name, if any. Found in the name section.
340343
name: Option<String>,
341344
/// The module's producers section, if any.
342345
producers: Option<Producers>,
346+
/// Byte range of the module in the parent binary
347+
range: Range<usize>,
343348
},
344349
}
345350

@@ -354,15 +359,17 @@ impl Metadata {
354359
Version { encoding, .. } => {
355360
if metadata.is_empty() {
356361
match encoding {
357-
wasmparser::Encoding::Module => metadata.push(Metadata::empty_module()),
362+
wasmparser::Encoding::Module => {
363+
metadata.push(Metadata::empty_module(0..input.len()))
364+
}
358365
wasmparser::Encoding::Component => {
359-
metadata.push(Metadata::empty_component())
366+
metadata.push(Metadata::empty_component(0..input.len()))
360367
}
361368
}
362369
}
363370
}
364-
ModuleSection { .. } => metadata.push(Metadata::empty_module()),
365-
ComponentSection { .. } => metadata.push(Metadata::empty_component()),
371+
ModuleSection { range, .. } => metadata.push(Metadata::empty_module(range)),
372+
ComponentSection { range, .. } => metadata.push(Metadata::empty_component(range)),
366373
End { .. } => {
367374
let finished = metadata.pop().expect("non-empty metadata stack");
368375
if metadata.is_empty() {
@@ -408,18 +415,20 @@ impl Metadata {
408415
))
409416
}
410417

411-
fn empty_component() -> Self {
418+
fn empty_component(range: Range<usize>) -> Self {
412419
Metadata::Component {
413420
name: None,
414421
producers: None,
415422
children: Vec::new(),
423+
range,
416424
}
417425
}
418426

419-
fn empty_module() -> Self {
427+
fn empty_module(range: Range<usize>) -> Self {
420428
Metadata::Module {
421429
name: None,
422430
producers: None,
431+
range,
423432
}
424433
}
425434
fn set_name(&mut self, n: &str) {
@@ -444,7 +453,9 @@ impl Metadata {
444453
fn display(&self, f: &mut fmt::Formatter, indent: usize) -> fmt::Result {
445454
let spaces = std::iter::repeat(" ").take(indent).collect::<String>();
446455
match self {
447-
Metadata::Module { name, producers } => {
456+
Metadata::Module {
457+
name, producers, ..
458+
} => {
448459
if let Some(name) = name {
449460
writeln!(f, "{spaces}module {name}:")?;
450461
} else {
@@ -459,6 +470,7 @@ impl Metadata {
459470
name,
460471
producers,
461472
children,
473+
..
462474
} => {
463475
if let Some(name) = name {
464476
writeln!(f, "{spaces}component {name}:")?;
@@ -677,14 +689,20 @@ mod test {
677689

678690
let metadata = Metadata::from_binary(&module).unwrap();
679691
match metadata {
680-
Metadata::Module { name, producers } => {
692+
Metadata::Module {
693+
name,
694+
producers,
695+
range,
696+
} => {
681697
assert_eq!(name, Some("foo".to_owned()));
682698
let producers = producers.expect("some producers");
683699
assert_eq!(producers.get("language").unwrap().get("bar").unwrap(), "");
684700
assert_eq!(
685701
producers.get("processed-by").unwrap().get("baz").unwrap(),
686702
"1.0"
687703
);
704+
assert_eq!(range.start, 0);
705+
assert_eq!(range.end, 71);
688706
}
689707
_ => panic!("metadata should be module"),
690708
}
@@ -708,6 +726,7 @@ mod test {
708726
name,
709727
producers,
710728
children,
729+
range,
711730
} => {
712731
assert!(children.is_empty());
713732
assert_eq!(name, Some("foo".to_owned()));
@@ -717,6 +736,8 @@ mod test {
717736
producers.get("processed-by").unwrap().get("baz").unwrap(),
718737
"1.0"
719738
);
739+
assert_eq!(range.start, 0);
740+
assert_eq!(range.end, 81);
720741
}
721742
_ => panic!("metadata should be component"),
722743
}
@@ -757,6 +778,7 @@ mod test {
757778
name,
758779
producers,
759780
children,
781+
..
760782
} => {
761783
// Check that the component metadata is in the component
762784
assert_eq!(name, Some("gussie".to_owned()));
@@ -769,14 +791,20 @@ mod test {
769791
assert_eq!(children.len(), 1);
770792
let child = children.get(0).unwrap();
771793
match &**child {
772-
Metadata::Module { name, producers } => {
794+
Metadata::Module {
795+
name,
796+
producers,
797+
range,
798+
} => {
773799
assert_eq!(name, &Some("foo".to_owned()));
774800
let producers = producers.as_ref().expect("some producers");
775801
assert_eq!(producers.get("language").unwrap().get("bar").unwrap(), "");
776802
assert_eq!(
777803
producers.get("processed-by").unwrap().get("baz").unwrap(),
778804
"1.0"
779805
);
806+
assert_eq!(range.start, 10);
807+
assert_eq!(range.end, 81);
780808
}
781809
_ => panic!("child is a module"),
782810
}
@@ -797,7 +825,9 @@ mod test {
797825

798826
let metadata = Metadata::from_binary(&module).unwrap();
799827
match metadata {
800-
Metadata::Module { name, producers } => {
828+
Metadata::Module {
829+
name, producers, ..
830+
} => {
801831
assert_eq!(name, None);
802832
let producers = producers.expect("some producers");
803833
assert_eq!(producers.get("language").unwrap().get("bar").unwrap(), "");
@@ -825,7 +855,9 @@ mod test {
825855

826856
let metadata = Metadata::from_binary(&module).unwrap();
827857
match metadata {
828-
Metadata::Module { name, producers } => {
858+
Metadata::Module {
859+
name, producers, ..
860+
} => {
829861
assert_eq!(name, None);
830862
let producers = producers.expect("some producers");
831863
assert_eq!(producers.get("language").unwrap().get("bar").unwrap(), "");

0 commit comments

Comments
 (0)