wardite 0.6.0 → 0.7.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/README.md +2 -2
- data/Steepfile +1 -0
- data/exe/wardite +3 -25
- data/lib/wardite/cli/cli.rb +121 -0
- data/lib/wardite/value.rb +23 -2
- data/lib/wardite/version.rb +1 -1
- data/lib/wardite/wasi.rb +4 -1
- data/lib/wardite.rb +7 -1
- data/misc/bench-value.rb +25 -0
- data/rbs_collection.lock.yaml +204 -0
- data/rbs_collection.yaml +18 -0
- data/sig/bundler.rbs +3 -0
- data/sig/generated/wardite/cli/cli.rbs +50 -0
- data/sig/generated/wardite/leb128.rbs +1 -1
- data/sig/generated/wardite/value.rbs +9 -0
- data/sig/generated/wardite/wasi.rbs +4 -1
- data/sig/generated/wardite.rbs +5 -1
- metadata +9 -7
- data/misc/proposals/rubykaigi2025.md +0 -46
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9b2773f96babcc390d09312304046e661a1226b14413c307a3f9c082655cedb9
|
4
|
+
data.tar.gz: 011022bf110c979bb68bf18bb513588e6fe152177d92d8b3e3d69a296a7d73f2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d10a3156096c3610a2ac49d6b20d5814e81c106f01c01194b9ca1eda6ad746b9ee74d7755b141b617926e32142a0a62b3c959275ae4d53abc68bf4f527c9fada
|
7
|
+
data.tar.gz: d5a1cad2ea0b9270e4b8adb0070495cefe2d8347bcaa1e85def5b4befe60a82800a73d9c02f8cfcb73f1546888a2a96c9caa853d5e3b0bd9fa608de770211bbd
|
data/README.md
CHANGED
@@ -70,9 +70,9 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/udzura
|
|
70
70
|
|
71
71
|
## See also
|
72
72
|
|
73
|
-
- https://github.com/technohippy/wasmrb
|
73
|
+
- https://github.com/technohippy/wasmrb
|
74
74
|
- Referencial implementation but no support with WASI
|
75
|
-
- Wardite aims to support full WASI (
|
75
|
+
- Wardite aims to support full WASI (preview 1)
|
76
76
|
- https://github.com/skanehira/chibiwasm
|
77
77
|
- Small and consise implementation in Rust
|
78
78
|
- Wardite was first built upon [its development tutorial](https://skanehira.github.io/writing-a-wasm-runtime-in-rust/). Thanks!
|
data/Steepfile
CHANGED
data/exe/wardite
CHANGED
@@ -1,29 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require "wardite"
|
4
|
-
|
4
|
+
require "wardite/cli/cli"
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
if instance.runtime.respond_to?(:_start) # assumed WASI
|
9
|
-
argv = ARGV[1..-1] || []
|
10
|
-
instance.wasi.argv = ["wardite"] + argv
|
11
|
-
Bundler.with_original_env do
|
12
|
-
# instance.store.memories[0].grow(128)
|
13
|
-
instance.runtime._start
|
14
|
-
end
|
15
|
-
else
|
16
|
-
path = ARGV[0]
|
17
|
-
method = ARGV[1]
|
18
|
-
args = ARGV[2..-1] || []
|
19
|
-
|
20
|
-
args = args.map do|a|
|
21
|
-
if a.include? "."
|
22
|
-
a.to_f
|
23
|
-
else
|
24
|
-
a.to_i
|
25
|
-
end
|
26
|
-
end
|
27
|
-
ret = instance.runtime.call(method, args)
|
28
|
-
$stderr.puts "return value: #{ret.inspect}"
|
29
|
-
end
|
6
|
+
cli = Wardite::Cli::Cli.new(ARGV)
|
7
|
+
cli.run
|
@@ -0,0 +1,121 @@
|
|
1
|
+
# rbs_inline: enabled
|
2
|
+
require "optparse"
|
3
|
+
|
4
|
+
module Wardite
|
5
|
+
module Cli
|
6
|
+
class Cli
|
7
|
+
# @rbs @args: Array[String]
|
8
|
+
|
9
|
+
attr_reader :invoke #: String?
|
10
|
+
attr_reader :mapdir #: String?
|
11
|
+
attr_reader :file #: String
|
12
|
+
attr_reader :memsize #: Integer
|
13
|
+
attr_reader :wasi #: bool
|
14
|
+
|
15
|
+
# @rbs args: Array[String]
|
16
|
+
# @rbs return: void
|
17
|
+
def initialize(args)
|
18
|
+
@invoke = @mapdir = nil
|
19
|
+
@wasi = true # default to true
|
20
|
+
@memsize = 1
|
21
|
+
options = OptionParser.new do |opts|
|
22
|
+
opts.on("--invoke [fnname]", "Invoke the function") { |v|
|
23
|
+
@invoke = v
|
24
|
+
}
|
25
|
+
opts.on("--mapdir [dest[:src]]", "Map the directory") { |v|
|
26
|
+
@mapdir = v
|
27
|
+
}
|
28
|
+
opts.on("--memsize [size_in_bytes]", "Initial memory size") { |v|
|
29
|
+
@memsize = (v.to_i / (64 * 1024).to_f).ceil.to_i
|
30
|
+
}
|
31
|
+
opts.on("--no-wasi", "Disable WASI feature") {|_v|
|
32
|
+
@wasi = false
|
33
|
+
}
|
34
|
+
opts.on("FILE.wasm") { }
|
35
|
+
end
|
36
|
+
options.parse!(args)
|
37
|
+
@file = args[0] || raise("require file argument")
|
38
|
+
@args = (args[1..-1] || [])
|
39
|
+
@args.unshift if @args[0] == '--'
|
40
|
+
end
|
41
|
+
|
42
|
+
# @rbs return: Array[Integer | Float]
|
43
|
+
# @rbs %a{pure}
|
44
|
+
def args
|
45
|
+
@args.map do |a|
|
46
|
+
if a.include? "."
|
47
|
+
a.to_f
|
48
|
+
else
|
49
|
+
a.to_i
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# @rbs return: ::Wardite::Instance
|
55
|
+
def new_instance
|
56
|
+
f = File.open(file)
|
57
|
+
ins = Wardite::BinaryLoader::load_from_buffer(f, enable_wasi: wasi);
|
58
|
+
if memsize > 1
|
59
|
+
ins.store.memories[0].grow(memsize)
|
60
|
+
end
|
61
|
+
ins
|
62
|
+
end
|
63
|
+
|
64
|
+
# @rbs return: void
|
65
|
+
def run
|
66
|
+
if invoke
|
67
|
+
invoke_function
|
68
|
+
else
|
69
|
+
invoke_wasi if wasi
|
70
|
+
raise("requires function name to invoke")
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# @rbs return: void
|
75
|
+
def invoke_function
|
76
|
+
unless invoke
|
77
|
+
raise "--invoke not set"
|
78
|
+
end
|
79
|
+
instance = new_instance
|
80
|
+
ret = instance.runtime.call(invoke, args)
|
81
|
+
$stderr.puts "return value: #{ret.inspect}"
|
82
|
+
end
|
83
|
+
|
84
|
+
# @rbs return: void
|
85
|
+
def invoke_wasi
|
86
|
+
instance = new_instance #: ::Wardite::Instance
|
87
|
+
unless instance.wasi
|
88
|
+
raise "WASI not activated"
|
89
|
+
end
|
90
|
+
instance.wasi.argv = ["wardite"] + @args
|
91
|
+
if mapdir && mount_dst && mount_src
|
92
|
+
# TODO: support multiple mapdir
|
93
|
+
instance.wasi.mapdir[mount_dst] = mount_src
|
94
|
+
end
|
95
|
+
|
96
|
+
if defined? Bundler
|
97
|
+
Bundler.with_original_env do
|
98
|
+
instance.runtime._start
|
99
|
+
end
|
100
|
+
else
|
101
|
+
instance.runtime._start
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
# @rbs return: String?
|
106
|
+
# @rbs %a{pure}
|
107
|
+
def mount_src
|
108
|
+
mapdir&.split(":")&.first
|
109
|
+
end
|
110
|
+
|
111
|
+
# @rbs return: String?
|
112
|
+
# @rbs %a{pure}
|
113
|
+
def mount_dst
|
114
|
+
m = mapdir&.split(":")
|
115
|
+
if m
|
116
|
+
m.size == 2 ? m[1] : m[0]
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
data/lib/wardite/value.rb
CHANGED
@@ -8,13 +8,13 @@ module Wardite
|
|
8
8
|
# @rbs value: Integer
|
9
9
|
# @rbs return: I32
|
10
10
|
def I32(value)
|
11
|
-
I32.
|
11
|
+
I32.cached_or_initialize(value & I32::I32_MAX)
|
12
12
|
end
|
13
13
|
|
14
14
|
# @rbs value: Integer
|
15
15
|
# @rbs return: I64
|
16
16
|
def I64(value)
|
17
|
-
I64.new
|
17
|
+
I64.new(value & I64::I64_MAX)
|
18
18
|
end
|
19
19
|
|
20
20
|
# @rbs value: Float
|
@@ -40,6 +40,16 @@ module Wardite
|
|
40
40
|
# when we want to access signed value, it'd be done via #value_s
|
41
41
|
attr_accessor :value #: Integer
|
42
42
|
|
43
|
+
# @rbs!
|
44
|
+
# @@i32_object_pool: Hash[Integer, I32]
|
45
|
+
@@i32_object_pool = {} #: Hash[Integer, I32]
|
46
|
+
|
47
|
+
# @rbs value: Integer
|
48
|
+
# @rbs return: I32
|
49
|
+
def self.cached_or_initialize(value)
|
50
|
+
@@i32_object_pool[value] || I32.new(value)
|
51
|
+
end
|
52
|
+
|
43
53
|
# @rbs value: Integer
|
44
54
|
def initialize(value=0)
|
45
55
|
@value = value
|
@@ -225,6 +235,12 @@ module Wardite
|
|
225
235
|
def ==(other)
|
226
236
|
return self.class == other.class && self.value == other.value
|
227
237
|
end
|
238
|
+
|
239
|
+
(0..64).each do |value|
|
240
|
+
@@i32_object_pool[value] = I32.new(value)
|
241
|
+
end
|
242
|
+
value = -1 & I32::I32_MAX
|
243
|
+
@@i32_object_pool[value] = I32.new(value)
|
228
244
|
end
|
229
245
|
|
230
246
|
class I64
|
@@ -234,6 +250,11 @@ module Wardite
|
|
234
250
|
|
235
251
|
attr_accessor :value #: Integer
|
236
252
|
|
253
|
+
# @rbs value: Integer
|
254
|
+
def initialize(value=0)
|
255
|
+
@value = value
|
256
|
+
end
|
257
|
+
|
237
258
|
# @rbs str: String
|
238
259
|
# @rbs size: Integer|nil
|
239
260
|
# @rbs signed: bool
|
data/lib/wardite/version.rb
CHANGED
data/lib/wardite/wasi.rb
CHANGED
@@ -12,16 +12,19 @@ module Wardite
|
|
12
12
|
|
13
13
|
attr_accessor :fd_table #: Array[(IO|File)]
|
14
14
|
attr_accessor :argv #: Array[String]
|
15
|
+
attr_accessor :mapdir #: Hash[String, String]
|
15
16
|
|
16
17
|
# @rbs argv: Array[String]
|
18
|
+
# @rbs mapdir: Hash[String, String]
|
17
19
|
# @rbs return: void
|
18
|
-
def initialize(argv: [])
|
20
|
+
def initialize(argv: [], mapdir: {})
|
19
21
|
@fd_table = [
|
20
22
|
STDIN,
|
21
23
|
STDOUT,
|
22
24
|
STDERR,
|
23
25
|
]
|
24
26
|
@argv = argv
|
27
|
+
@mapdir = mapdir
|
25
28
|
end
|
26
29
|
|
27
30
|
# @rbs store: Store
|
data/lib/wardite.rb
CHANGED
@@ -38,7 +38,7 @@ module Wardite
|
|
38
38
|
|
39
39
|
attr_reader :import_object #: Hash[Symbol, wasmModule]
|
40
40
|
|
41
|
-
attr_accessor :wasi #: WasiSnapshotPreview1?
|
41
|
+
attr_accessor :wasi #: ::Wardite::WasiSnapshotPreview1?
|
42
42
|
|
43
43
|
# @rbs import_object: Hash[Symbol, wasmModuleSrc]
|
44
44
|
# @rbs &blk: (Instance) -> void
|
@@ -803,6 +803,12 @@ module Wardite
|
|
803
803
|
def respond_to? name
|
804
804
|
callable?(name) || super
|
805
805
|
end
|
806
|
+
|
807
|
+
# @rbs args: Array[Object]
|
808
|
+
# @rbs return: Object?
|
809
|
+
def _start(*args)
|
810
|
+
call(:_start, args)
|
811
|
+
end
|
806
812
|
end
|
807
813
|
|
808
814
|
class Type
|
data/misc/bench-value.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require "benchmark"
|
2
|
+
require "wardite"
|
3
|
+
|
4
|
+
N = 1000000
|
5
|
+
|
6
|
+
i32_100 = Wardite::I32.new(100)
|
7
|
+
i32_200 = Wardite::I32.new(200)
|
8
|
+
$RES = {}
|
9
|
+
$RES2 = {}
|
10
|
+
|
11
|
+
Benchmark.bmbm do |x|
|
12
|
+
x.report("add via value") do
|
13
|
+
N.times do |i|
|
14
|
+
res = Wardite::I32.new(i32_100.value + i32_200.value)
|
15
|
+
$RES[i%10] = res # avoid optimization
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
x.report("add immediate") do
|
20
|
+
N.times do |i|
|
21
|
+
res = 100 + 200
|
22
|
+
$RES2[i%10] = res
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,204 @@
|
|
1
|
+
---
|
2
|
+
path: ".gem_rbs_collection"
|
3
|
+
gems:
|
4
|
+
- name: activesupport
|
5
|
+
version: '7.0'
|
6
|
+
source:
|
7
|
+
type: git
|
8
|
+
name: ruby/gem_rbs_collection
|
9
|
+
revision: 1288acc1cdecc0a273740212da0df35b108dbfb6
|
10
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
11
|
+
repo_dir: gems
|
12
|
+
- name: ast
|
13
|
+
version: '2.4'
|
14
|
+
source:
|
15
|
+
type: git
|
16
|
+
name: ruby/gem_rbs_collection
|
17
|
+
revision: 1288acc1cdecc0a273740212da0df35b108dbfb6
|
18
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
19
|
+
repo_dir: gems
|
20
|
+
- name: base64
|
21
|
+
version: '0.1'
|
22
|
+
source:
|
23
|
+
type: git
|
24
|
+
name: ruby/gem_rbs_collection
|
25
|
+
revision: 1288acc1cdecc0a273740212da0df35b108dbfb6
|
26
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
27
|
+
repo_dir: gems
|
28
|
+
- name: bigdecimal
|
29
|
+
version: '3.1'
|
30
|
+
source:
|
31
|
+
type: git
|
32
|
+
name: ruby/gem_rbs_collection
|
33
|
+
revision: 1288acc1cdecc0a273740212da0df35b108dbfb6
|
34
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
35
|
+
repo_dir: gems
|
36
|
+
- name: concurrent-ruby
|
37
|
+
version: '1.1'
|
38
|
+
source:
|
39
|
+
type: git
|
40
|
+
name: ruby/gem_rbs_collection
|
41
|
+
revision: 1288acc1cdecc0a273740212da0df35b108dbfb6
|
42
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
43
|
+
repo_dir: gems
|
44
|
+
- name: connection_pool
|
45
|
+
version: '2.4'
|
46
|
+
source:
|
47
|
+
type: git
|
48
|
+
name: ruby/gem_rbs_collection
|
49
|
+
revision: 1288acc1cdecc0a273740212da0df35b108dbfb6
|
50
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
51
|
+
repo_dir: gems
|
52
|
+
- name: csv
|
53
|
+
version: '3.3'
|
54
|
+
source:
|
55
|
+
type: git
|
56
|
+
name: ruby/gem_rbs_collection
|
57
|
+
revision: 1288acc1cdecc0a273740212da0df35b108dbfb6
|
58
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
59
|
+
repo_dir: gems
|
60
|
+
- name: date
|
61
|
+
version: '0'
|
62
|
+
source:
|
63
|
+
type: stdlib
|
64
|
+
- name: digest
|
65
|
+
version: '0'
|
66
|
+
source:
|
67
|
+
type: stdlib
|
68
|
+
- name: erb
|
69
|
+
version: '0'
|
70
|
+
source:
|
71
|
+
type: stdlib
|
72
|
+
- name: ffi
|
73
|
+
version: 1.17.1
|
74
|
+
source:
|
75
|
+
type: rubygems
|
76
|
+
- name: fileutils
|
77
|
+
version: '0'
|
78
|
+
source:
|
79
|
+
type: stdlib
|
80
|
+
- name: forwardable
|
81
|
+
version: '0'
|
82
|
+
source:
|
83
|
+
type: stdlib
|
84
|
+
- name: i18n
|
85
|
+
version: '1.10'
|
86
|
+
source:
|
87
|
+
type: git
|
88
|
+
name: ruby/gem_rbs_collection
|
89
|
+
revision: 1288acc1cdecc0a273740212da0df35b108dbfb6
|
90
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
91
|
+
repo_dir: gems
|
92
|
+
- name: json
|
93
|
+
version: '0'
|
94
|
+
source:
|
95
|
+
type: stdlib
|
96
|
+
- name: listen
|
97
|
+
version: '3.9'
|
98
|
+
source:
|
99
|
+
type: git
|
100
|
+
name: ruby/gem_rbs_collection
|
101
|
+
revision: 1288acc1cdecc0a273740212da0df35b108dbfb6
|
102
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
103
|
+
repo_dir: gems
|
104
|
+
- name: logger
|
105
|
+
version: '0'
|
106
|
+
source:
|
107
|
+
type: stdlib
|
108
|
+
- name: minitest
|
109
|
+
version: '0'
|
110
|
+
source:
|
111
|
+
type: stdlib
|
112
|
+
- name: monitor
|
113
|
+
version: '0'
|
114
|
+
source:
|
115
|
+
type: stdlib
|
116
|
+
- name: mutex_m
|
117
|
+
version: '0'
|
118
|
+
source:
|
119
|
+
type: stdlib
|
120
|
+
- name: openssl
|
121
|
+
version: '0'
|
122
|
+
source:
|
123
|
+
type: stdlib
|
124
|
+
- name: optparse
|
125
|
+
version: '0'
|
126
|
+
source:
|
127
|
+
type: stdlib
|
128
|
+
- name: parser
|
129
|
+
version: '3.2'
|
130
|
+
source:
|
131
|
+
type: git
|
132
|
+
name: ruby/gem_rbs_collection
|
133
|
+
revision: 1288acc1cdecc0a273740212da0df35b108dbfb6
|
134
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
135
|
+
repo_dir: gems
|
136
|
+
- name: pathname
|
137
|
+
version: '0'
|
138
|
+
source:
|
139
|
+
type: stdlib
|
140
|
+
- name: rainbow
|
141
|
+
version: '3.0'
|
142
|
+
source:
|
143
|
+
type: git
|
144
|
+
name: ruby/gem_rbs_collection
|
145
|
+
revision: 1288acc1cdecc0a273740212da0df35b108dbfb6
|
146
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
147
|
+
repo_dir: gems
|
148
|
+
- name: rake
|
149
|
+
version: '13.0'
|
150
|
+
source:
|
151
|
+
type: git
|
152
|
+
name: ruby/gem_rbs_collection
|
153
|
+
revision: 1288acc1cdecc0a273740212da0df35b108dbfb6
|
154
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
155
|
+
repo_dir: gems
|
156
|
+
- name: rbs
|
157
|
+
version: 3.7.0
|
158
|
+
source:
|
159
|
+
type: rubygems
|
160
|
+
- name: rdoc
|
161
|
+
version: '0'
|
162
|
+
source:
|
163
|
+
type: stdlib
|
164
|
+
- name: securerandom
|
165
|
+
version: '0'
|
166
|
+
source:
|
167
|
+
type: stdlib
|
168
|
+
- name: singleton
|
169
|
+
version: '0'
|
170
|
+
source:
|
171
|
+
type: stdlib
|
172
|
+
- name: socket
|
173
|
+
version: '0'
|
174
|
+
source:
|
175
|
+
type: stdlib
|
176
|
+
- name: stringio
|
177
|
+
version: '0'
|
178
|
+
source:
|
179
|
+
type: stdlib
|
180
|
+
- name: strscan
|
181
|
+
version: '0'
|
182
|
+
source:
|
183
|
+
type: stdlib
|
184
|
+
- name: time
|
185
|
+
version: '0'
|
186
|
+
source:
|
187
|
+
type: stdlib
|
188
|
+
- name: timeout
|
189
|
+
version: '0'
|
190
|
+
source:
|
191
|
+
type: stdlib
|
192
|
+
- name: tsort
|
193
|
+
version: '0'
|
194
|
+
source:
|
195
|
+
type: stdlib
|
196
|
+
- name: tzinfo
|
197
|
+
version: '2.0'
|
198
|
+
source:
|
199
|
+
type: git
|
200
|
+
name: ruby/gem_rbs_collection
|
201
|
+
revision: 1288acc1cdecc0a273740212da0df35b108dbfb6
|
202
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
203
|
+
repo_dir: gems
|
204
|
+
gemfile_lock_path: Gemfile.lock
|
data/rbs_collection.yaml
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# Download sources
|
2
|
+
sources:
|
3
|
+
- type: git
|
4
|
+
name: ruby/gem_rbs_collection
|
5
|
+
remote: https://github.com/ruby/gem_rbs_collection.git
|
6
|
+
revision: main
|
7
|
+
repo_dir: gems
|
8
|
+
|
9
|
+
# You can specify local directories as sources also.
|
10
|
+
# - type: local
|
11
|
+
# path: path/to/your/local/repository
|
12
|
+
|
13
|
+
# A directory to install the downloaded RBSs
|
14
|
+
path: .gem_rbs_collection
|
15
|
+
|
16
|
+
gems:
|
17
|
+
# If you want to avoid installing rbs files for gems, you can specify them here.
|
18
|
+
- name: optparse
|
data/sig/bundler.rbs
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# Generated from lib/wardite/cli/cli.rb with RBS::Inline
|
2
|
+
|
3
|
+
module Wardite
|
4
|
+
module Cli
|
5
|
+
class Cli
|
6
|
+
@args: Array[String]
|
7
|
+
|
8
|
+
attr_reader invoke: String?
|
9
|
+
|
10
|
+
attr_reader mapdir: String?
|
11
|
+
|
12
|
+
attr_reader file: String
|
13
|
+
|
14
|
+
attr_reader memsize: Integer
|
15
|
+
|
16
|
+
attr_reader wasi: bool
|
17
|
+
|
18
|
+
# @rbs args: Array[String]
|
19
|
+
# @rbs return: void
|
20
|
+
def initialize: (Array[String] args) -> void
|
21
|
+
|
22
|
+
# @rbs return: Array[Integer | Float]
|
23
|
+
# @rbs %a{pure}
|
24
|
+
%a{pure}
|
25
|
+
def args: () -> Array[Integer | Float]
|
26
|
+
|
27
|
+
# @rbs return: ::Wardite::Instance
|
28
|
+
def new_instance: () -> ::Wardite::Instance
|
29
|
+
|
30
|
+
# @rbs return: void
|
31
|
+
def run: () -> void
|
32
|
+
|
33
|
+
# @rbs return: void
|
34
|
+
def invoke_function: () -> void
|
35
|
+
|
36
|
+
# @rbs return: void
|
37
|
+
def invoke_wasi: () -> void
|
38
|
+
|
39
|
+
# @rbs return: String?
|
40
|
+
# @rbs %a{pure}
|
41
|
+
%a{pure}
|
42
|
+
def mount_src: () -> String?
|
43
|
+
|
44
|
+
# @rbs return: String?
|
45
|
+
# @rbs %a{pure}
|
46
|
+
%a{pure}
|
47
|
+
def mount_dst: () -> String?
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -6,7 +6,7 @@ module Wardite
|
|
6
6
|
# @rbs buf: File|StringIO
|
7
7
|
# @rbs max_level: Integer
|
8
8
|
# @rbs return: Integer
|
9
|
-
def fetch_uleb128: (File | StringIO buf, ?max_level: Integer) -> Integer
|
9
|
+
def self?.fetch_uleb128: (File | StringIO buf, ?max_level: Integer) -> Integer
|
10
10
|
|
11
11
|
# @rbs buf: File|StringIO
|
12
12
|
# @rbs return: Integer
|
@@ -32,6 +32,12 @@ module Wardite
|
|
32
32
|
# when we want to access signed value, it'd be done via #value_s
|
33
33
|
attr_accessor value: Integer
|
34
34
|
|
35
|
+
@@i32_object_pool: Hash[Integer, I32]
|
36
|
+
|
37
|
+
# @rbs value: Integer
|
38
|
+
# @rbs return: I32
|
39
|
+
def self.cached_or_initialize: (Integer value) -> I32
|
40
|
+
|
35
41
|
# @rbs value: Integer
|
36
42
|
def initialize: (?Integer value) -> untyped
|
37
43
|
|
@@ -119,6 +125,9 @@ module Wardite
|
|
119
125
|
|
120
126
|
attr_accessor value: Integer
|
121
127
|
|
128
|
+
# @rbs value: Integer
|
129
|
+
def initialize: (?Integer value) -> untyped
|
130
|
+
|
122
131
|
# @rbs str: String
|
123
132
|
# @rbs size: Integer|nil
|
124
133
|
# @rbs signed: bool
|
@@ -10,9 +10,12 @@ module Wardite
|
|
10
10
|
|
11
11
|
attr_accessor argv: Array[String]
|
12
12
|
|
13
|
+
attr_accessor mapdir: Hash[String, String]
|
14
|
+
|
13
15
|
# @rbs argv: Array[String]
|
16
|
+
# @rbs mapdir: Hash[String, String]
|
14
17
|
# @rbs return: void
|
15
|
-
def initialize: (?argv: Array[String]) -> void
|
18
|
+
def initialize: (?argv: Array[String], ?mapdir: Hash[String, String]) -> void
|
16
19
|
|
17
20
|
# @rbs store: Store
|
18
21
|
# @rbs args: Array[wasmValue]
|
data/sig/generated/wardite.rbs
CHANGED
@@ -22,7 +22,7 @@ module Wardite
|
|
22
22
|
|
23
23
|
attr_reader import_object: Hash[Symbol, wasmModule]
|
24
24
|
|
25
|
-
attr_accessor wasi: WasiSnapshotPreview1?
|
25
|
+
attr_accessor wasi: ::Wardite::WasiSnapshotPreview1?
|
26
26
|
|
27
27
|
# @rbs import_object: Hash[Symbol, wasmModuleSrc]
|
28
28
|
# @rbs &blk: (Instance) -> void
|
@@ -141,6 +141,10 @@ module Wardite
|
|
141
141
|
# @rbs name: String|Symbol
|
142
142
|
# @rbs return: bool
|
143
143
|
def respond_to?: (String | Symbol name) -> bool
|
144
|
+
|
145
|
+
# @rbs args: Array[Object]
|
146
|
+
# @rbs return: Object?
|
147
|
+
def _start: (*untyped args) -> Object?
|
144
148
|
end
|
145
149
|
|
146
150
|
class Type
|
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wardite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Uchio Kondo
|
8
|
-
autorequire:
|
9
8
|
bindir: exe
|
10
9
|
cert_chain: []
|
11
|
-
date: 2025-
|
10
|
+
date: 2025-03-10 00:00:00.000000000 Z
|
12
11
|
dependencies: []
|
13
12
|
description: A pure-ruby webassembly runtime
|
14
13
|
email:
|
@@ -47,6 +46,7 @@ files:
|
|
47
46
|
- lib/wardite/alu_f64.generated.rb
|
48
47
|
- lib/wardite/alu_i32.generated.rb
|
49
48
|
- lib/wardite/alu_i64.generated.rb
|
49
|
+
- lib/wardite/cli/cli.rb
|
50
50
|
- lib/wardite/const.rb
|
51
51
|
- lib/wardite/convert.generated.rb
|
52
52
|
- lib/wardite/errors.rb
|
@@ -59,7 +59,7 @@ files:
|
|
59
59
|
- lib/wardite/wasi.rb
|
60
60
|
- lib/wardite/wasi/consts.rb
|
61
61
|
- lib/wardite/wasm_module.rb
|
62
|
-
- misc/
|
62
|
+
- misc/bench-value.rb
|
63
63
|
- misc/slides/fib.c
|
64
64
|
- misc/slides/fib.html
|
65
65
|
- misc/slides/image-1.png
|
@@ -67,16 +67,20 @@ files:
|
|
67
67
|
- misc/slides/image.png
|
68
68
|
- misc/slides/tokyo12.html
|
69
69
|
- misc/slides/tokyo12.md
|
70
|
+
- rbs_collection.lock.yaml
|
71
|
+
- rbs_collection.yaml
|
70
72
|
- scripts/gen_alu.rb
|
71
73
|
- scripts/gen_conv.rb
|
72
74
|
- scripts/templates/alu_module.rb.tmpl
|
73
75
|
- scripts/templates/conv_module.rb.tmpl
|
76
|
+
- sig/bundler.rbs
|
74
77
|
- sig/fcntl.rbs
|
75
78
|
- sig/generated/wardite.rbs
|
76
79
|
- sig/generated/wardite/alu_f32.generated.rbs
|
77
80
|
- sig/generated/wardite/alu_f64.generated.rbs
|
78
81
|
- sig/generated/wardite/alu_i32.generated.rbs
|
79
82
|
- sig/generated/wardite/alu_i64.generated.rbs
|
83
|
+
- sig/generated/wardite/cli/cli.rbs
|
80
84
|
- sig/generated/wardite/const.rbs
|
81
85
|
- sig/generated/wardite/convert.generated.rbs
|
82
86
|
- sig/generated/wardite/errors.rbs
|
@@ -95,7 +99,6 @@ licenses: []
|
|
95
99
|
metadata:
|
96
100
|
homepage_uri: https://github.com/udzura/wardite
|
97
101
|
source_code_uri: https://github.com/udzura/wardite
|
98
|
-
post_install_message:
|
99
102
|
rdoc_options: []
|
100
103
|
require_paths:
|
101
104
|
- lib
|
@@ -110,8 +113,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
110
113
|
- !ruby/object:Gem::Version
|
111
114
|
version: '0'
|
112
115
|
requirements: []
|
113
|
-
rubygems_version: 3.
|
114
|
-
signing_key:
|
116
|
+
rubygems_version: 3.6.2
|
115
117
|
specification_version: 4
|
116
118
|
summary: A pure-ruby webassembly runtime
|
117
119
|
test_files: []
|
@@ -1,46 +0,0 @@
|
|
1
|
-
# RubyKaigi 2025 Proposal
|
2
|
-
|
3
|
-
## title:
|
4
|
-
|
5
|
-
Implementing WASM Runtime in Ruby - ruby.wasm works on Ruby?
|
6
|
-
|
7
|
-
## Abstract
|
8
|
-
|
9
|
-
<!--
|
10
|
-
|
11
|
-
Create an abstract of talk in English, following below:
|
12
|
-
|
13
|
-
- 作者はWarditeというRubyのWASMランタイムを開発した
|
14
|
-
- WarditeはPure Rubyで、RBSに完全対応している
|
15
|
-
- Warditeでruby.wasmを動かすことをマイルストーンにしており、その取り組みについて報告する。
|
16
|
-
- 例えば、WASI preview 1 対応、パフォーマンス改善など。
|
17
|
-
|
18
|
-
-->
|
19
|
-
|
20
|
-
The author has developed a WASM runtime named Wardite, which is implemented entirely in pure Ruby and fully annotated by RBS. The primary milestone for Wardite is to successfully run ruby.wasm. This presentation will dive deeply into the various efforts and challenges encountered in reaching this milestone. Key topics will include the implementation of support for WASI preview 1, performance enhancements, and other technical advancements. Attendees will gain insights into the current status of Wardite, its architecture, and the approaches taken to eficciently implement WebAssembly runtime in Ruby. The talk aims to provide a comprehensive overview of the progress made so far and the future directions for Wardite, highlighting its potential impact on the Ruby and WebAssembly ecosystems.
|
21
|
-
|
22
|
-
## Details
|
23
|
-
|
24
|
-
現在、以下のような内容を考えています
|
25
|
-
|
26
|
-
- なぜ、Warditeを作ったか?
|
27
|
-
- Pure Rubyであることのメリット
|
28
|
-
- cf. wazero in Go
|
29
|
-
- 簡単なWarditeの紹介
|
30
|
-
- 動作のデモ
|
31
|
-
- Warditeの実装
|
32
|
-
- WASM Core 1.0を動かすために必要な仕様の解説
|
33
|
-
- 簡単な内部設計
|
34
|
-
- 命令の概要
|
35
|
-
- RBSによる型情報の利用
|
36
|
-
- Wardite開発上の技術的チャレンジ
|
37
|
-
- パフォーマンス改善の取り組み
|
38
|
-
- 基本的な計測(ruby-prof、perf)
|
39
|
-
- オブジェクト生成の低減・最適化
|
40
|
-
- Warditeでruby.wasmを動かすための取り組み
|
41
|
-
- WASI preview 1 対応
|
42
|
-
- 今後の展望
|
43
|
-
- 更なるパフォーマンス改善
|
44
|
-
- Component 対応
|
45
|
-
|
46
|
-
## Pitch
|