wasmer 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/documentation.yml +50 -0
  3. data/.github/workflows/test.yml +34 -61
  4. data/CHANGELOG.md +89 -29
  5. data/Cargo.lock +812 -380
  6. data/Cargo.toml +7 -20
  7. data/Gemfile +2 -3
  8. data/README.md +1 -0
  9. data/Rakefile +4 -3
  10. data/crates/rutie-derive-macros/Cargo.toml +19 -0
  11. data/crates/rutie-derive-macros/README.md +4 -0
  12. data/crates/rutie-derive-macros/src/class.rs +156 -0
  13. data/crates/rutie-derive-macros/src/function.rs +178 -0
  14. data/crates/rutie-derive-macros/src/lib.rs +27 -0
  15. data/crates/rutie-derive-macros/src/methods.rs +282 -0
  16. data/crates/rutie-derive/Cargo.toml +14 -0
  17. data/crates/rutie-derive/README.md +97 -0
  18. data/crates/rutie-derive/src/lib.rs +4 -0
  19. data/crates/rutie-derive/src/upcast.rs +47 -0
  20. data/crates/rutie-test/Cargo.toml +10 -0
  21. data/crates/rutie-test/src/lib.rs +38 -0
  22. data/crates/wasmer/Cargo.toml +27 -0
  23. data/crates/wasmer/README.md +228 -0
  24. data/crates/wasmer/src/doc.rs +1512 -0
  25. data/crates/wasmer/src/error.rs +55 -0
  26. data/crates/wasmer/src/exports.rs +107 -0
  27. data/crates/wasmer/src/externals/function.rs +159 -0
  28. data/crates/wasmer/src/externals/global.rs +62 -0
  29. data/crates/wasmer/src/externals/memory.rs +117 -0
  30. data/crates/wasmer/src/externals/mod.rs +9 -0
  31. data/crates/wasmer/src/externals/table.rs +41 -0
  32. data/crates/wasmer/src/import_object.rs +78 -0
  33. data/crates/wasmer/src/instance.rs +45 -0
  34. data/crates/wasmer/src/lib.rs +307 -0
  35. data/crates/wasmer/src/memory/mod.rs +1 -0
  36. data/crates/wasmer/src/memory/views.rs +112 -0
  37. data/crates/wasmer/src/module.rs +106 -0
  38. data/crates/wasmer/src/prelude.rs +3 -0
  39. data/crates/wasmer/src/store.rs +22 -0
  40. data/crates/wasmer/src/types.rs +390 -0
  41. data/crates/wasmer/src/values.rs +84 -0
  42. data/crates/wasmer/src/wasi.rs +226 -0
  43. data/crates/wasmer/src/wat.rs +20 -0
  44. data/justfile +7 -1
  45. data/lib/wasmer.rb +29 -3
  46. data/wasmer.gemspec +6 -10
  47. metadata +45 -47
  48. data/README.md +0 -332
  49. data/lib/wasmer/version.rb +0 -3
  50. data/src/error.rs +0 -16
  51. data/src/instance/exports.rs +0 -215
  52. data/src/instance/globals.rs +0 -234
  53. data/src/instance/mod.rs +0 -141
  54. data/src/lib.rs +0 -162
  55. data/src/memory/mod.rs +0 -158
  56. data/src/memory/view.rs +0 -145
  57. data/src/module.rs +0 -28
data/src/memory/mod.rs DELETED
@@ -1,158 +0,0 @@
1
- //! The `Memory` WebAssembly class.
2
-
3
- pub mod view;
4
-
5
- use crate::{
6
- error::unwrap_or_raise,
7
- memory::view::{
8
- int16array::{RubyMemoryView as RubyInt16Array, MEMORY_VIEW_WRAPPER as INT16ARRAY_WRAPPER},
9
- int32array::{RubyMemoryView as RubyInt32Array, MEMORY_VIEW_WRAPPER as INT32ARRAY_WRAPPER},
10
- int8array::{RubyMemoryView as RubyInt8Array, MEMORY_VIEW_WRAPPER as INT8ARRAY_WRAPPER},
11
- uint16array::{
12
- RubyMemoryView as RubyUint16Array, MEMORY_VIEW_WRAPPER as UINT16ARRAY_WRAPPER,
13
- },
14
- uint32array::{
15
- RubyMemoryView as RubyUint32Array, MEMORY_VIEW_WRAPPER as UINT32ARRAY_WRAPPER,
16
- },
17
- uint8array::{RubyMemoryView as RubyUint8Array, MEMORY_VIEW_WRAPPER as UINT8ARRAY_WRAPPER},
18
- },
19
- };
20
- use lazy_static::lazy_static;
21
- use rutie::{class, methods, wrappable_struct, AnyException, Exception, Integer, Module, Object};
22
- use std::rc::Rc;
23
- use wasmer_runtime::{self as runtime, units::Pages};
24
-
25
- pub struct Memory {
26
- memory: Rc<runtime::Memory>,
27
- }
28
-
29
- impl Memory {
30
- pub fn new(memory: Rc<runtime::Memory>) -> Self {
31
- Self { memory }
32
- }
33
-
34
- pub fn uint8_view(&self, offset: usize) -> view::uint8array::MemoryView {
35
- view::uint8array::MemoryView::new(self.memory.clone(), offset)
36
- }
37
-
38
- pub fn int8_view(&self, offset: usize) -> view::int8array::MemoryView {
39
- view::int8array::MemoryView::new(self.memory.clone(), offset)
40
- }
41
-
42
- pub fn uint16_view(&self, offset: usize) -> view::uint16array::MemoryView {
43
- view::uint16array::MemoryView::new(self.memory.clone(), offset)
44
- }
45
-
46
- pub fn int16_view(&self, offset: usize) -> view::int16array::MemoryView {
47
- view::int16array::MemoryView::new(self.memory.clone(), offset)
48
- }
49
-
50
- pub fn uint32_view(&self, offset: usize) -> view::uint32array::MemoryView {
51
- view::uint32array::MemoryView::new(self.memory.clone(), offset)
52
- }
53
-
54
- pub fn int32_view(&self, offset: usize) -> view::int32array::MemoryView {
55
- view::int32array::MemoryView::new(self.memory.clone(), offset)
56
- }
57
-
58
- pub fn grow(&self, number_of_pages: u32) -> Result<u32, AnyException> {
59
- self.memory
60
- .grow(Pages(number_of_pages))
61
- .map(|previous_pages| previous_pages.0)
62
- .map_err(|err| {
63
- AnyException::new(
64
- "RuntimeError",
65
- Some(&format!("Failed to grow the memory: {}.", err)),
66
- )
67
- })
68
- }
69
- }
70
-
71
- wrappable_struct!(Memory, MemoryWrapper, MEMORY_WRAPPER);
72
-
73
- class!(RubyMemory);
74
-
75
- #[rustfmt::skip]
76
- methods!(
77
- RubyMemory,
78
- itself,
79
- // Glue code to call the `Memory.uint8_view` method.
80
- fn ruby_memory_uint8array(offset: Integer) -> RubyUint8Array {
81
- let offset = offset.map(|offset| offset.to_i64() as usize).unwrap_or(0);
82
- let memory_view = itself.get_data(&*MEMORY_WRAPPER).uint8_view(offset);
83
-
84
- let wasmer_module = Module::from_existing("Wasmer");
85
- wasmer_module
86
- .get_nested_class("Uint8Array")
87
- .wrap_data(memory_view, &*UINT8ARRAY_WRAPPER)
88
- }
89
-
90
- // Glue code to call the `Memory.int8_view` method.
91
- fn ruby_memory_int8array(offset: Integer) -> RubyInt8Array {
92
- let offset = offset.map(|offset| offset.to_i64() as usize).unwrap_or(0);
93
- let memory_view = itself.get_data(&*MEMORY_WRAPPER).int8_view(offset);
94
-
95
- let wasmer_module = Module::from_existing("Wasmer");
96
- wasmer_module
97
- .get_nested_class("Int8Array")
98
- .wrap_data(memory_view, &*INT8ARRAY_WRAPPER)
99
- }
100
-
101
- // Glue code to call the `Memory.uint16_view` method.
102
- fn ruby_memory_uint16array(offset: Integer) -> RubyUint16Array {
103
- let offset = offset.map(|offset| offset.to_i64() as usize).unwrap_or(0);
104
- let memory_view = itself.get_data(&*MEMORY_WRAPPER).uint16_view(offset);
105
-
106
- let wasmer_module = Module::from_existing("Wasmer");
107
- wasmer_module
108
- .get_nested_class("Uint16Array")
109
- .wrap_data(memory_view, &*UINT16ARRAY_WRAPPER)
110
- }
111
-
112
- // Glue code to call the `Memory.int16_view` method.
113
- fn ruby_memory_int16array(offset: Integer) -> RubyInt16Array {
114
- let offset = offset.map(|offset| offset.to_i64() as usize).unwrap_or(0);
115
- let memory_view = itself.get_data(&*MEMORY_WRAPPER).int16_view(offset);
116
-
117
- let wasmer_module = Module::from_existing("Wasmer");
118
- wasmer_module
119
- .get_nested_class("Int16Array")
120
- .wrap_data(memory_view, &*INT16ARRAY_WRAPPER)
121
- }
122
-
123
- // Glue code to call the `Memory.uint32_view` method.
124
- fn ruby_memory_uint32array(offset: Integer) -> RubyUint32Array {
125
- let offset = offset.map(|offset| offset.to_i64() as usize).unwrap_or(0);
126
- let memory_view = itself.get_data(&*MEMORY_WRAPPER).uint32_view(offset);
127
-
128
- let wasmer_module = Module::from_existing("Wasmer");
129
- wasmer_module
130
- .get_nested_class("Uint32Array")
131
- .wrap_data(memory_view, &*UINT32ARRAY_WRAPPER)
132
- }
133
-
134
- // Glue code to call the `Memory.int32_view` method.
135
- fn ruby_memory_int32array(offset: Integer) -> RubyInt32Array {
136
- let offset = offset.map(|offset| offset.to_i64() as usize).unwrap_or(0);
137
- let memory_view = itself.get_data(&*MEMORY_WRAPPER).int32_view(offset);
138
-
139
- let wasmer_module = Module::from_existing("Wasmer");
140
- wasmer_module
141
- .get_nested_class("Int32Array")
142
- .wrap_data(memory_view, &*INT32ARRAY_WRAPPER)
143
- }
144
-
145
- // Glue code to call the `Memory.grow` method.
146
- fn ruby_memory_grow(number_of_pages: Integer) -> Integer {
147
- let number_of_pages = number_of_pages
148
- .map(|number_of_pages| number_of_pages.to_i32() as u32)
149
- .unwrap_or(1);
150
-
151
- unwrap_or_raise(|| {
152
- itself
153
- .get_data(&*MEMORY_WRAPPER)
154
- .grow(number_of_pages)
155
- .map(|previous_number_of_pages| Integer::new(previous_number_of_pages as i64))
156
- })
157
- }
158
- );
data/src/memory/view.rs DELETED
@@ -1,145 +0,0 @@
1
- //! The `TypedArray`/`MemoryView` WebAssembly classes.
2
-
3
- #[rustfmt::skip]
4
-
5
- macro_rules! memory_view {
6
- ($mod_name:ident over $wasm_type:ty | $bytes_per_element:expr) => {
7
- pub mod $mod_name {
8
- use crate::error::unwrap_or_raise;
9
- use lazy_static::lazy_static;
10
- use rutie::{
11
- class, methods, wrappable_struct, AnyException, Exception, Fixnum, Integer,
12
- NilClass, Object, VM,
13
- };
14
- use std::{mem::size_of, rc::Rc};
15
- use wasmer_runtime as runtime;
16
-
17
- pub struct MemoryView {
18
- memory: Rc<runtime::memory::Memory>,
19
- offset: usize,
20
- }
21
-
22
- impl MemoryView {
23
- pub fn new(memory: Rc<runtime::Memory>, offset: usize) -> Self {
24
- Self { memory, offset }
25
- }
26
-
27
- pub fn len(&self) -> usize {
28
- self.memory.view::<$wasm_type>()[self.offset..].len() / size_of::<$wasm_type>()
29
- }
30
-
31
- pub fn set(&self, index: isize, value: $wasm_type) -> Result<(), String> {
32
- let offset = self.offset;
33
- let view = self.memory.view::<$wasm_type>();
34
-
35
- if index < 0 {
36
- return Err("Out of bound: Index cannot be negative.".into());
37
- }
38
-
39
- let index = index as usize;
40
-
41
- if view.len() <= offset + index {
42
- Err(format!(
43
- "Out of bound: Maximum index {} is larger than the memory size {}.",
44
- offset + index,
45
- view.len()
46
- ))
47
- } else {
48
- view[offset + index].set(value);
49
-
50
- Ok(())
51
- }
52
- }
53
-
54
- pub fn get(&self, index: isize) -> Result<$wasm_type, String> {
55
- let offset = self.offset;
56
- let view = self.memory.view::<$wasm_type>();
57
-
58
- if index < 0 {
59
- return Err("Out of bound: Index cannot be negative.".into());
60
- }
61
-
62
- let index = index as usize;
63
-
64
- if view.len() <= offset + index {
65
- Err(format!(
66
- "Out of bound: Maximum index {} is larger than the memory size {}.",
67
- offset + index,
68
- view.len()
69
- ))
70
- } else {
71
- Ok(view[offset + index].get())
72
- }
73
- }
74
-
75
- pub fn each(&self) {
76
- let view = self.memory.view::<$wasm_type>();
77
-
78
- for nth in self.offset..view.len() {
79
- let value = view[nth].get() as i64;
80
- VM::yield_object(Integer::from(value));
81
- }
82
- }
83
- }
84
-
85
- wrappable_struct!(MemoryView, MemoryViewWrapper, MEMORY_VIEW_WRAPPER);
86
-
87
- class!(RubyMemoryView);
88
-
89
- methods!(
90
- RubyMemoryView,
91
- _itself,
92
-
93
- // The `TypedArray.bytes_per_element` method.
94
- fn ruby_memory_view_bytes_per_element() -> Fixnum {
95
- Fixnum::new($bytes_per_element)
96
- }
97
-
98
- // Glue code to call the `TypedArray.length` method.
99
- fn ruby_memory_view_length() -> Fixnum {
100
- Fixnum::new(_itself.get_data(&*MEMORY_VIEW_WRAPPER).len() as i64)
101
- }
102
-
103
- // Glue code to call the `TypedArray.set` method.
104
- fn ruby_memory_view_set(index: Integer, value: Integer) -> NilClass {
105
- unwrap_or_raise(|| {
106
- let memory_view = _itself.get_data(&*MEMORY_VIEW_WRAPPER);
107
-
108
- memory_view
109
- .set(index?.to_i32() as isize, value?.to_i32() as $wasm_type)
110
- .map_err(|e| AnyException::new("ArgumentError", Some(&e)))?;
111
-
112
- Ok(NilClass::new())
113
- })
114
- }
115
-
116
- // Glue code to call the `TypedArray.get` method.
117
- fn ruby_memory_view_get(index: Integer) -> Fixnum {
118
- unwrap_or_raise(|| {
119
- let memory_view = _itself.get_data(&*MEMORY_VIEW_WRAPPER);
120
-
121
- Ok(Fixnum::new(
122
- memory_view
123
- .get(index?.to_i32() as isize)
124
- .map_err(|e| AnyException::new("ArgumentError", Some(&e)))?
125
- as i64,
126
- ))
127
- })
128
- }
129
-
130
- fn ruby_memory_view_each() -> RubyMemoryView {
131
- let memory_view = _itself.get_data(&*MEMORY_VIEW_WRAPPER);
132
- memory_view.each();
133
- _itself
134
- }
135
- );
136
- }
137
- };
138
- }
139
-
140
- memory_view!(uint8array over u8|1);
141
- memory_view!(int8array over i8|1);
142
- memory_view!(uint16array over u16|2);
143
- memory_view!(int16array over i16|2);
144
- memory_view!(uint32array over u32|4);
145
- memory_view!(int32array over i32|4);
data/src/module.rs DELETED
@@ -1,28 +0,0 @@
1
- use rutie::{class, methods, rubysys::value::ValueType, AnyObject, Boolean, Object, RString};
2
- use wasmer_runtime::validate;
3
-
4
- class!(Module);
5
-
6
- methods!(
7
- Module,
8
- _itself,
9
- fn ruby_module_validate(bytes: AnyObject) -> Boolean {
10
- if let Ok(bytes) = bytes {
11
- match bytes.ty() {
12
- ValueType::RString => bytes.try_convert_to::<RString>().ok().map_or_else(
13
- || Boolean::new(false),
14
- |string| {
15
- if validate(string.to_bytes_unchecked()) {
16
- Boolean::new(true)
17
- } else {
18
- Boolean::new(false)
19
- }
20
- },
21
- ),
22
- _ => Boolean::new(false),
23
- }
24
- } else {
25
- Boolean::new(false)
26
- }
27
- }
28
- );