summaryrefslogtreecommitdiffstats
path: root/third_party/rust/parity-wasm/examples/inject.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 14:29:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 14:29:10 +0000
commit2aa4a82499d4becd2284cdb482213d541b8804dd (patch)
treeb80bf8bf13c3766139fbacc530efd0dd9d54394c /third_party/rust/parity-wasm/examples/inject.rs
parentInitial commit. (diff)
downloadfirefox-2aa4a82499d4becd2284cdb482213d541b8804dd.tar.xz
firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.zip
Adding upstream version 86.0.1.upstream/86.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/parity-wasm/examples/inject.rs')
-rw-r--r--third_party/rust/parity-wasm/examples/inject.rs63
1 files changed, 63 insertions, 0 deletions
diff --git a/third_party/rust/parity-wasm/examples/inject.rs b/third_party/rust/parity-wasm/examples/inject.rs
new file mode 100644
index 0000000000..0e58e23167
--- /dev/null
+++ b/third_party/rust/parity-wasm/examples/inject.rs
@@ -0,0 +1,63 @@
+extern crate parity_wasm;
+
+use std::env;
+
+use parity_wasm::elements;
+use parity_wasm::builder;
+
+pub fn inject_nop(instructions: &mut elements::Instructions) {
+ use parity_wasm::elements::Instruction::*;
+ let instructions = instructions.elements_mut();
+ let mut position = 0;
+ loop {
+ let need_inject = match &instructions[position] {
+ &Block(_) | &If(_) => true,
+ _ => false,
+ };
+ if need_inject {
+ instructions.insert(position + 1, Nop);
+ }
+
+ position += 1;
+ if position >= instructions.len() {
+ break;
+ }
+ }
+}
+
+fn main() {
+ let args = env::args().collect::<Vec<_>>();
+ if args.len() != 3 {
+ println!("Usage: {} input_file.wasm output_file.wasm", args[0]);
+ return;
+ }
+
+ let mut module = parity_wasm::deserialize_file(&args[1]).unwrap();
+
+ for section in module.sections_mut() {
+ match section {
+ &mut elements::Section::Code(ref mut code_section) => {
+ for ref mut func_body in code_section.bodies_mut() {
+ inject_nop(func_body.code_mut());
+ }
+ },
+ _ => { }
+ }
+ }
+
+ let mut build = builder::from_module(module);
+ let import_sig = build.push_signature(
+ builder::signature()
+ .param().i32()
+ .param().i32()
+ .return_type().i32()
+ .build_sig()
+ );
+ let build = build.import()
+ .module("env")
+ .field("log")
+ .external().func(import_sig)
+ .build();
+
+ parity_wasm::serialize_to_file(&args[2], build.build()).unwrap();
+} \ No newline at end of file