@@ -3,6 +3,7 @@ use indexmap::{map::Entry, IndexMap};
3
3
use serde:: Serialize ;
4
4
use std:: fmt;
5
5
use std:: mem;
6
+ use std:: ops:: Range ;
6
7
use wasm_encoder:: { ComponentSection as _, ComponentSectionId , Encode , Section } ;
7
8
use wasmparser:: {
8
9
ComponentNameSectionReader , NameSectionReader , Parser , Payload :: * , ProducersSectionReader ,
@@ -333,13 +334,17 @@ pub enum Metadata {
333
334
producers : Option < Producers > ,
334
335
/// All child modules and components inside the component.
335
336
children : Vec < Box < Metadata > > ,
337
+ /// Byte range of the module in the parent binary
338
+ range : Range < usize > ,
336
339
} ,
337
340
/// Metadata found inside a WebAssembly module.
338
341
Module {
339
342
/// The module name, if any. Found in the name section.
340
343
name : Option < String > ,
341
344
/// The module's producers section, if any.
342
345
producers : Option < Producers > ,
346
+ /// Byte range of the module in the parent binary
347
+ range : Range < usize > ,
343
348
} ,
344
349
}
345
350
@@ -354,15 +359,17 @@ impl Metadata {
354
359
Version { encoding, .. } => {
355
360
if metadata. is_empty ( ) {
356
361
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
+ }
358
365
wasmparser:: Encoding :: Component => {
359
- metadata. push ( Metadata :: empty_component ( ) )
366
+ metadata. push ( Metadata :: empty_component ( 0 ..input . len ( ) ) )
360
367
}
361
368
}
362
369
}
363
370
}
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 ) ) ,
366
373
End { .. } => {
367
374
let finished = metadata. pop ( ) . expect ( "non-empty metadata stack" ) ;
368
375
if metadata. is_empty ( ) {
@@ -408,18 +415,20 @@ impl Metadata {
408
415
) )
409
416
}
410
417
411
- fn empty_component ( ) -> Self {
418
+ fn empty_component ( range : Range < usize > ) -> Self {
412
419
Metadata :: Component {
413
420
name : None ,
414
421
producers : None ,
415
422
children : Vec :: new ( ) ,
423
+ range,
416
424
}
417
425
}
418
426
419
- fn empty_module ( ) -> Self {
427
+ fn empty_module ( range : Range < usize > ) -> Self {
420
428
Metadata :: Module {
421
429
name : None ,
422
430
producers : None ,
431
+ range,
423
432
}
424
433
}
425
434
fn set_name ( & mut self , n : & str ) {
@@ -444,7 +453,9 @@ impl Metadata {
444
453
fn display ( & self , f : & mut fmt:: Formatter , indent : usize ) -> fmt:: Result {
445
454
let spaces = std:: iter:: repeat ( " " ) . take ( indent) . collect :: < String > ( ) ;
446
455
match self {
447
- Metadata :: Module { name, producers } => {
456
+ Metadata :: Module {
457
+ name, producers, ..
458
+ } => {
448
459
if let Some ( name) = name {
449
460
writeln ! ( f, "{spaces}module {name}:" ) ?;
450
461
} else {
@@ -459,6 +470,7 @@ impl Metadata {
459
470
name,
460
471
producers,
461
472
children,
473
+ ..
462
474
} => {
463
475
if let Some ( name) = name {
464
476
writeln ! ( f, "{spaces}component {name}:" ) ?;
@@ -677,14 +689,20 @@ mod test {
677
689
678
690
let metadata = Metadata :: from_binary ( & module) . unwrap ( ) ;
679
691
match metadata {
680
- Metadata :: Module { name, producers } => {
692
+ Metadata :: Module {
693
+ name,
694
+ producers,
695
+ range,
696
+ } => {
681
697
assert_eq ! ( name, Some ( "foo" . to_owned( ) ) ) ;
682
698
let producers = producers. expect ( "some producers" ) ;
683
699
assert_eq ! ( producers. get( "language" ) . unwrap( ) . get( "bar" ) . unwrap( ) , "" ) ;
684
700
assert_eq ! (
685
701
producers. get( "processed-by" ) . unwrap( ) . get( "baz" ) . unwrap( ) ,
686
702
"1.0"
687
703
) ;
704
+ assert_eq ! ( range. start, 0 ) ;
705
+ assert_eq ! ( range. end, 71 ) ;
688
706
}
689
707
_ => panic ! ( "metadata should be module" ) ,
690
708
}
@@ -708,6 +726,7 @@ mod test {
708
726
name,
709
727
producers,
710
728
children,
729
+ range,
711
730
} => {
712
731
assert ! ( children. is_empty( ) ) ;
713
732
assert_eq ! ( name, Some ( "foo" . to_owned( ) ) ) ;
@@ -717,6 +736,8 @@ mod test {
717
736
producers. get( "processed-by" ) . unwrap( ) . get( "baz" ) . unwrap( ) ,
718
737
"1.0"
719
738
) ;
739
+ assert_eq ! ( range. start, 0 ) ;
740
+ assert_eq ! ( range. end, 81 ) ;
720
741
}
721
742
_ => panic ! ( "metadata should be component" ) ,
722
743
}
@@ -757,6 +778,7 @@ mod test {
757
778
name,
758
779
producers,
759
780
children,
781
+ ..
760
782
} => {
761
783
// Check that the component metadata is in the component
762
784
assert_eq ! ( name, Some ( "gussie" . to_owned( ) ) ) ;
@@ -769,14 +791,20 @@ mod test {
769
791
assert_eq ! ( children. len( ) , 1 ) ;
770
792
let child = children. get ( 0 ) . unwrap ( ) ;
771
793
match & * * child {
772
- Metadata :: Module { name, producers } => {
794
+ Metadata :: Module {
795
+ name,
796
+ producers,
797
+ range,
798
+ } => {
773
799
assert_eq ! ( name, & Some ( "foo" . to_owned( ) ) ) ;
774
800
let producers = producers. as_ref ( ) . expect ( "some producers" ) ;
775
801
assert_eq ! ( producers. get( "language" ) . unwrap( ) . get( "bar" ) . unwrap( ) , "" ) ;
776
802
assert_eq ! (
777
803
producers. get( "processed-by" ) . unwrap( ) . get( "baz" ) . unwrap( ) ,
778
804
"1.0"
779
805
) ;
806
+ assert_eq ! ( range. start, 10 ) ;
807
+ assert_eq ! ( range. end, 81 ) ;
780
808
}
781
809
_ => panic ! ( "child is a module" ) ,
782
810
}
@@ -797,7 +825,9 @@ mod test {
797
825
798
826
let metadata = Metadata :: from_binary ( & module) . unwrap ( ) ;
799
827
match metadata {
800
- Metadata :: Module { name, producers } => {
828
+ Metadata :: Module {
829
+ name, producers, ..
830
+ } => {
801
831
assert_eq ! ( name, None ) ;
802
832
let producers = producers. expect ( "some producers" ) ;
803
833
assert_eq ! ( producers. get( "language" ) . unwrap( ) . get( "bar" ) . unwrap( ) , "" ) ;
@@ -825,7 +855,9 @@ mod test {
825
855
826
856
let metadata = Metadata :: from_binary ( & module) . unwrap ( ) ;
827
857
match metadata {
828
- Metadata :: Module { name, producers } => {
858
+ Metadata :: Module {
859
+ name, producers, ..
860
+ } => {
829
861
assert_eq ! ( name, None ) ;
830
862
let producers = producers. expect ( "some producers" ) ;
831
863
assert_eq ! ( producers. get( "language" ) . unwrap( ) . get( "bar" ) . unwrap( ) , "" ) ;
0 commit comments