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.
- checksums.yaml +4 -4
- data/.github/workflows/documentation.yml +50 -0
- data/.github/workflows/test.yml +34 -61
- data/CHANGELOG.md +89 -29
- data/Cargo.lock +812 -380
- data/Cargo.toml +7 -20
- data/Gemfile +2 -3
- data/README.md +1 -0
- data/Rakefile +4 -3
- data/crates/rutie-derive-macros/Cargo.toml +19 -0
- data/crates/rutie-derive-macros/README.md +4 -0
- data/crates/rutie-derive-macros/src/class.rs +156 -0
- data/crates/rutie-derive-macros/src/function.rs +178 -0
- data/crates/rutie-derive-macros/src/lib.rs +27 -0
- data/crates/rutie-derive-macros/src/methods.rs +282 -0
- data/crates/rutie-derive/Cargo.toml +14 -0
- data/crates/rutie-derive/README.md +97 -0
- data/crates/rutie-derive/src/lib.rs +4 -0
- data/crates/rutie-derive/src/upcast.rs +47 -0
- data/crates/rutie-test/Cargo.toml +10 -0
- data/crates/rutie-test/src/lib.rs +38 -0
- data/crates/wasmer/Cargo.toml +27 -0
- data/crates/wasmer/README.md +228 -0
- data/crates/wasmer/src/doc.rs +1512 -0
- data/crates/wasmer/src/error.rs +55 -0
- data/crates/wasmer/src/exports.rs +107 -0
- data/crates/wasmer/src/externals/function.rs +159 -0
- data/crates/wasmer/src/externals/global.rs +62 -0
- data/crates/wasmer/src/externals/memory.rs +117 -0
- data/crates/wasmer/src/externals/mod.rs +9 -0
- data/crates/wasmer/src/externals/table.rs +41 -0
- data/crates/wasmer/src/import_object.rs +78 -0
- data/crates/wasmer/src/instance.rs +45 -0
- data/crates/wasmer/src/lib.rs +307 -0
- data/crates/wasmer/src/memory/mod.rs +1 -0
- data/crates/wasmer/src/memory/views.rs +112 -0
- data/crates/wasmer/src/module.rs +106 -0
- data/crates/wasmer/src/prelude.rs +3 -0
- data/crates/wasmer/src/store.rs +22 -0
- data/crates/wasmer/src/types.rs +390 -0
- data/crates/wasmer/src/values.rs +84 -0
- data/crates/wasmer/src/wasi.rs +226 -0
- data/crates/wasmer/src/wat.rs +20 -0
- data/justfile +7 -1
- data/lib/wasmer.rb +29 -3
- data/wasmer.gemspec +6 -10
- metadata +45 -47
- data/README.md +0 -332
- data/lib/wasmer/version.rb +0 -3
- data/src/error.rs +0 -16
- data/src/instance/exports.rs +0 -215
- data/src/instance/globals.rs +0 -234
- data/src/instance/mod.rs +0 -141
- data/src/lib.rs +0 -162
- data/src/memory/mod.rs +0 -158
- data/src/memory/view.rs +0 -145
- 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
|
-
);
|