From eeaf9f71a355b69d9c8469d44d94fa4d38e19163 Mon Sep 17 00:00:00 2001 From: irxground Date: Thu, 13 Jun 2019 10:27:28 +0900 Subject: [PATCH 1/3] Implement Wasmer::XxxArray#each --- src/lib.rs | 3 +++ src/memory/view.rs | 19 ++++++++++++++++++- tests/memory_test.rb | 12 ++++-------- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index fb4ea5e..2efd134 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -104,6 +104,9 @@ pub extern "C" fn Init_wasmer() { // Declare the `[]` (get) method. itself.def("[]", memory::view::$mod_name::ruby_memory_view_get); + + // Declare the `each` method. + itself.def("each", memory::view::$mod_name::ruby_memory_view_each); }); }; } diff --git a/src/memory/view.rs b/src/memory/view.rs index 0c2d71c..355e840 100644 --- a/src/memory/view.rs +++ b/src/memory/view.rs @@ -9,7 +9,7 @@ macro_rules! memory_view { use lazy_static::lazy_static; use rutie::{ class, methods, wrappable_struct, AnyException, Exception, Fixnum, Integer, - NilClass, Object, + NilClass, Object, VM, }; use std::{mem::size_of, rc::Rc}; use wasmer_runtime as runtime; @@ -71,6 +71,17 @@ macro_rules! memory_view { Ok(view[offset + index].get()) } } + + pub fn each(&self) { + let view = self.memory.view::<$wasm_type>(); + + let mut offset = self.offset; + while offset < view.len() { + let value = view[offset].get(); + VM::yield_object(Integer::from(value as i64)); + offset += 1; + } + } } wrappable_struct!(MemoryView, MemoryViewWrapper, MEMORY_VIEW_WRAPPER); @@ -117,6 +128,12 @@ macro_rules! memory_view { )) }) } + + fn ruby_memory_view_each() -> RubyMemoryView { + let memory_view = _itself.get_data(&*MEMORY_VIEW_WRAPPER); + memory_view.each(); + _itself + } ); } }; diff --git a/tests/memory_test.rb b/tests/memory_test.rb index 507df9a..e5cdb96 100644 --- a/tests/memory_test.rb +++ b/tests/memory_test.rb @@ -99,17 +99,13 @@ def test_hello_world nth = 0 string = "" - while true - char = memory[nth] - - if 0 == char - break - end - - string += char.chr + memory.each do |char| + break if 0 == char + string << char.chr nth += 1 end + assert_equal 13, nth assert_equal "Hello, World!", string end From ee18b6743ead9f61d753b960f163fe378238620f Mon Sep 17 00:00:00 2001 From: irxground Date: Fri, 14 Jun 2019 18:09:17 +0900 Subject: [PATCH 2/3] Wasmer::XxxArray.include Enumerable --- src/lib.rs | 3 ++- tests/memory_test.rb | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 2efd134..d17c3d8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -107,7 +107,8 @@ pub extern "C" fn Init_wasmer() { // Declare the `each` method. itself.def("each", memory::view::$mod_name::ruby_memory_view_each); - }); + }) + .include("Enumerable"); }; } diff --git a/tests/memory_test.rb b/tests/memory_test.rb index e5cdb96..68b3e1f 100644 --- a/tests/memory_test.rb +++ b/tests/memory_test.rb @@ -109,6 +109,18 @@ def test_hello_world assert_equal "Hello, World!", string end + def test_enumerable + instance = Wasmer::Instance.new self.bytes + memory = instance.memory.int16_view + memory[0] = 1 + memory[1] = 10 + memory[2] = 100 + memory[3] = 1000 + memory[5] = 2 + sum = memory.take_while{|x| x > 0}.inject(0, &:+) + assert_equal 1111, sum + end + def test_views_share_the_same_buffer instance = Wasmer::Instance.new self.bytes int8 = instance.memory.int8_view From 16d85f323874c402eebb8f6a1fde4b0160f1ca4c Mon Sep 17 00:00:00 2001 From: irxground Date: Fri, 14 Jun 2019 18:37:21 +0900 Subject: [PATCH 3/3] Fix iteration method --- src/memory/view.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/memory/view.rs b/src/memory/view.rs index 355e840..56abd7e 100644 --- a/src/memory/view.rs +++ b/src/memory/view.rs @@ -75,11 +75,9 @@ macro_rules! memory_view { pub fn each(&self) { let view = self.memory.view::<$wasm_type>(); - let mut offset = self.offset; - while offset < view.len() { - let value = view[offset].get(); - VM::yield_object(Integer::from(value as i64)); - offset += 1; + for nth in self.offset..view.len() { + let value = view[nth].get() as i64; + VM::yield_object(Integer::from(value)); } } }