wardite 0.6.1 → 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: f0d5832e8cec120cdc72a68daf9acafb4d571fa2be166a6b912536774278c634
4
- data.tar.gz: 6527a2be1289f3d3e9223cd93497b95c1956593fea6b3430f8cd8293e4ab8e5f
3
+ metadata.gz: 9b2773f96babcc390d09312304046e661a1226b14413c307a3f9c082655cedb9
4
+ data.tar.gz: 011022bf110c979bb68bf18bb513588e6fe152177d92d8b3e3d69a296a7d73f2
5
5
  SHA512:
6
- metadata.gz: 95c24b6c6461b449270eb9a343e613095b2ee7ee587c1ebb88933c6c3c6e65bcba044b48ab51928ff2398b9b11a1d84a4830b78aeb1e67c37448900c2ffa2ddb
7
- data.tar.gz: 4ff3a32bd496162b06df804717a3017e2bcfbdccf25a2727c2c0096cbd6aa12abd119e05b2fdea4db29aaff0f668f42ef856e8b120a685abb0b7c4765c1eb18b
6
+ metadata.gz: d10a3156096c3610a2ac49d6b20d5814e81c106f01c01194b9ca1eda6ad746b9ee74d7755b141b617926e32142a0a62b3c959275ae4d53abc68bf4f527c9fada
7
+ data.tar.gz: d5a1cad2ea0b9270e4b8adb0070495cefe2d8347bcaa1e85def5b4befe60a82800a73d9c02f8cfcb73f1546888a2a96c9caa853d5e3b0bd9fa608de770211bbd
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
@@ -2,5 +2,5 @@
2
2
  # rbs_inline: enabled
3
3
 
4
4
  module Wardite
5
- VERSION = "0.6.1" #: 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,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
@@ -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,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wardite
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Uchio Kondo
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-01-13 00:00:00.000000000 Z
10
+ date: 2025-03-10 00:00:00.000000000 Z
11
11
  dependencies: []
12
12
  description: A pure-ruby webassembly runtime
13
13
  email:
@@ -46,6 +46,7 @@ files:
46
46
  - lib/wardite/alu_f64.generated.rb
47
47
  - lib/wardite/alu_i32.generated.rb
48
48
  - lib/wardite/alu_i64.generated.rb
49
+ - lib/wardite/cli/cli.rb
49
50
  - lib/wardite/const.rb
50
51
  - lib/wardite/convert.generated.rb
51
52
  - lib/wardite/errors.rb
@@ -66,16 +67,20 @@ files:
66
67
  - misc/slides/image.png
67
68
  - misc/slides/tokyo12.html
68
69
  - misc/slides/tokyo12.md
70
+ - rbs_collection.lock.yaml
71
+ - rbs_collection.yaml
69
72
  - scripts/gen_alu.rb
70
73
  - scripts/gen_conv.rb
71
74
  - scripts/templates/alu_module.rb.tmpl
72
75
  - scripts/templates/conv_module.rb.tmpl
76
+ - sig/bundler.rbs
73
77
  - sig/fcntl.rbs
74
78
  - sig/generated/wardite.rbs
75
79
  - sig/generated/wardite/alu_f32.generated.rbs
76
80
  - sig/generated/wardite/alu_f64.generated.rbs
77
81
  - sig/generated/wardite/alu_i32.generated.rbs
78
82
  - sig/generated/wardite/alu_i64.generated.rbs
83
+ - sig/generated/wardite/cli/cli.rbs
79
84
  - sig/generated/wardite/const.rbs
80
85
  - sig/generated/wardite/convert.generated.rbs
81
86
  - sig/generated/wardite/errors.rbs