From a6c67d2f9336f9dfcaf910bab3602d272e9e22be Mon Sep 17 00:00:00 2001 From: NikVolf Date: Fri, 9 Jun 2017 15:17:12 +0300 Subject: [PATCH 1/3] data segment builder --- spec/src/fixtures.rs | 1 + src/builder/global.rs | 1 - src/builder/mod.rs | 1 + src/builder/module.rs | 23 ++++++++++++++++++++++- 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/spec/src/fixtures.rs b/spec/src/fixtures.rs index c7539c3..ad663f1 100644 --- a/spec/src/fixtures.rs +++ b/spec/src/fixtures.rs @@ -16,6 +16,7 @@ macro_rules! run_test { run_test!("address", wasm_address); run_test!("address-offset-range.fail", wasm_address_offset_range_fail, fail); run_test!("binary", wasm_binary); +run_test!("call", wasm_call); run_test!("endianness", wasm_endianness); run_test!("f32", wasm_f32); run_test!("f32_bitwise", wasm_f32_bitwise); diff --git a/src/builder/global.rs b/src/builder/global.rs index 2cae4ba..9c666f3 100644 --- a/src/builder/global.rs +++ b/src/builder/global.rs @@ -56,7 +56,6 @@ impl GlobalBuilder where F: Invoke { } } - impl Invoke for GlobalBuilder { type Result = Self; fn invoke(self, the_type: elements::ValueType) -> Self { diff --git a/src/builder/mod.rs b/src/builder/mod.rs index 7d7437e..d590a75 100644 --- a/src/builder/mod.rs +++ b/src/builder/mod.rs @@ -9,6 +9,7 @@ mod memory; mod table; mod export; mod global; +mod data; pub use self::module::{module, from_module, ModuleBuilder}; pub use self::code::{signatures, signature, function}; diff --git a/src/builder/module.rs b/src/builder/module.rs index 8086a96..372acfa 100644 --- a/src/builder/module.rs +++ b/src/builder/module.rs @@ -2,7 +2,7 @@ use super::invoke::{Invoke, Identity}; use super::code::{self, SignaturesBuilder, FunctionBuilder}; use super::memory::{self, MemoryBuilder}; use super::table::{self, TableBuilder}; -use super::{import, export, global}; +use super::{import, export, global, data}; use elements; /// Module builder @@ -321,6 +321,17 @@ impl ModuleBuilder where F: Invoke { global::GlobalBuilder::with_callback(self) } + /// Add data segment to the builder + pub fn with_data_segment(mut self, segment: elements::DataSegment) -> Self { + self.module.data.entries_mut().push(segment); + self + } + + /// Data entry builder + pub fn data(self) -> data::DataSegmentBuilder { + data::DataSegmentBuilder::with_callback(self) + } + /// Build module (final step) pub fn build(self) -> F::Result { self.callback.invoke(self.module.into()) @@ -414,6 +425,16 @@ impl Invoke for ModuleBuilder } } +impl Invoke for ModuleBuilder + where F: Invoke +{ + type Result = Self; + + fn invoke(self, segment: elements::DataSegment) -> Self { + self.with_data_segment(segment) + } +} + /// Start new module builder pub fn module() -> ModuleBuilder { ModuleBuilder::new() From 6446c62c829d794695e791380d8af11d1806db8e Mon Sep 17 00:00:00 2001 From: NikVolf Date: Fri, 9 Jun 2017 15:19:21 +0300 Subject: [PATCH 2/3] test --- src/builder/data.rs | 49 +++++++++++++++++++++++++++++++++++++++++++ src/builder/module.rs | 12 +++++++++++ 2 files changed, 61 insertions(+) create mode 100644 src/builder/data.rs diff --git a/src/builder/data.rs b/src/builder/data.rs new file mode 100644 index 0000000..46398e5 --- /dev/null +++ b/src/builder/data.rs @@ -0,0 +1,49 @@ +use super::invoke::{Identity, Invoke}; +use elements; + +pub struct DataSegmentBuilder { + callback: F, + // todo: add mapper once multiple memory refs possible + mem_index: u32, + offset: elements::InitExpr, + value: Vec, +} + +impl DataSegmentBuilder { + pub fn new() -> Self { + DataSegmentBuilder::with_callback(Identity) + } +} + +impl DataSegmentBuilder { + pub fn with_callback(callback: F) -> Self { + DataSegmentBuilder { + callback: callback, + mem_index: 0, + offset: elements::InitExpr::empty(), + value: Vec::new(), + } + } + + pub fn offset(mut self, opcode: elements::Opcode) -> Self { + self.offset = elements::InitExpr::new(vec![opcode, elements::Opcode::End]); + self + } + + pub fn value(mut self, value: Vec) -> Self { + self.value = value; + self + } +} + +impl DataSegmentBuilder where F: Invoke { + pub fn build(self) -> F::Result { + self.callback.invoke( + elements::DataSegment::new( + self.mem_index, + self.offset, + self.value, + ) + ) + } +} \ No newline at end of file diff --git a/src/builder/module.rs b/src/builder/module.rs index 372acfa..584b2d9 100644 --- a/src/builder/module.rs +++ b/src/builder/module.rs @@ -487,4 +487,16 @@ mod tests { assert_eq!(module.global_section().expect("global section to exist").entries().len(), 1); } + + #[test] + fn data() { + let module = module() + .data() + .offset(::elements::Opcode::I32Const(16)) + .value(vec![0u8, 15, 10, 5, 25]) + .build() + .build(); + + assert_eq!(module.data_section().expect("data section to exist").entries().len(), 1); + } } From 4a4ef698fc2ec4df97d6a6eb43174b212a69a289 Mon Sep 17 00:00:00 2001 From: NikVolf Date: Fri, 9 Jun 2017 15:20:21 +0300 Subject: [PATCH 3/3] remove artifact --- spec/src/fixtures.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/spec/src/fixtures.rs b/spec/src/fixtures.rs index ad663f1..c7539c3 100644 --- a/spec/src/fixtures.rs +++ b/spec/src/fixtures.rs @@ -16,7 +16,6 @@ macro_rules! run_test { run_test!("address", wasm_address); run_test!("address-offset-range.fail", wasm_address_offset_range_fail, fail); run_test!("binary", wasm_binary); -run_test!("call", wasm_call); run_test!("endianness", wasm_endianness); run_test!("f32", wasm_f32); run_test!("f32_bitwise", wasm_f32_bitwise);