wasmer 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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
- );