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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bbf27d475ac9dac6a9c0f6284bf379858dfef4ee52f3a2d609f41e0a87110b46
4
- data.tar.gz: 69d508dc6674117a0c94e8308b357e49a05952f17ac949470c53e8a3267442c2
3
+ metadata.gz: 9b2773f96babcc390d09312304046e661a1226b14413c307a3f9c082655cedb9
4
+ data.tar.gz: 011022bf110c979bb68bf18bb513588e6fe152177d92d8b3e3d69a296a7d73f2
5
5
  SHA512:
6
- metadata.gz: 9d1b5d0ed4b626ab9c34fd0aabedca56b48afa4e9629557e0fcc8d0c7a2e05ad57d674d630c4f4b1599ec1babf70082d2a21041890f6081d4fbe18b8e57c0789
7
- data.tar.gz: ae55bd53d03c27a6626e320223389655adcfb67033d99bf9715171eb9bb90c718fab3eacefb2e8d9dd367f7c6d5c986f2bc956741da261d821ce102362b0898e
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?tab=readme-ov-file
73
+ - https://github.com/technohippy/wasmrb
74
74
  - Referencial implementation but no support with WASI
75
- - Wardite aims to support full WASI (previwe 1)
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
@@ -5,6 +5,7 @@ target :lib do
5
5
 
6
6
  library "pp"
7
7
  library "securerandom"
8
+ library "optparse"
8
9
  # configure_code_diagnostics(Steep::Diagnostic::Ruby.strict)
9
10
  end
10
11
 
data/exe/wardite CHANGED
@@ -1,29 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require "wardite"
4
- path = ARGV[0]
4
+ require "wardite/cli/cli"
5
5
 
6
- f = File.open(path)
7
- instance = Wardite::BinaryLoader::load_from_buffer(f);
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.new(value & I32::I32_MAX)
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.tap{|i| i.value = value & I64::I64_MAX }
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
@@ -2,5 +2,5 @@
2
2
  # rbs_inline: enabled
3
3
 
4
4
  module Wardite
5
- VERSION = "0.6.0" #: String
5
+ VERSION = "0.7.0" #: String
6
6
  end
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
@@ -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
@@ -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,3 @@
1
+ module Bundler
2
+ def self.with_original_env: () {() -> void} -> untyped
3
+ end
@@ -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]
@@ -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.6.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-01-10 00:00:00.000000000 Z
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/proposals/rubykaigi2025.md
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.5.11
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