wardite 0.8.1 → 0.9.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.
@@ -13,6 +13,8 @@ module Wardite
13
13
  attr_reader :wasi #: bool
14
14
  attr_reader :yjit #: bool
15
15
 
16
+ attr_reader :profile_file_path #: String?
17
+
16
18
  # @rbs args: Array[String]
17
19
  # @rbs return: void
18
20
  def initialize(args)
@@ -37,6 +39,9 @@ module Wardite
37
39
  opts.on("--yjit", "Enable yjit if available; setting WARDITE_YJIT_ON=1 has the same effect") {|_v|
38
40
  @yjit = true
39
41
  }
42
+ opts.on("--out-profile [file]", "Enable Vernier profiling and save to the file") {|v|
43
+ @profile_file_path = v
44
+ }
40
45
  opts.on("FILE.wasm") { }
41
46
  end
42
47
  options.parse!(args)
@@ -47,6 +52,10 @@ module Wardite
47
52
  if (yjit || ENV["WARDITE_YJIT_ON"] == "1") && (defined? RubyVM::YJIT)
48
53
  RubyVM::YJIT.enable
49
54
  end
55
+
56
+ if (yjit || ENV["WARDITE_YJIT_ON"] == "1") && !defined?(RubyVM::YJIT)
57
+ warn "Warning: --yjit option is specified, but not available in this Ruby build"
58
+ end
50
59
  end
51
60
 
52
61
  # @rbs return: Array[Integer | Float]
@@ -73,6 +82,19 @@ module Wardite
73
82
 
74
83
  # @rbs return: void
75
84
  def run
85
+ if profile_file_path
86
+ require "vernier"
87
+ $stderr.puts "Activated Vernier profiling"
88
+ Vernier.profile(out: profile_file_path) do
89
+ __run
90
+ end
91
+ else
92
+ __run
93
+ end
94
+ end
95
+
96
+ # @rbs return: void
97
+ def __run
76
98
  if invoke
77
99
  invoke_function
78
100
  else
@@ -5,10 +5,11 @@ module Wardite
5
5
  module Evaluator
6
6
  # @rbs runtime: Runtime
7
7
  # @rbs frame: Frame
8
- # @rbs insn: Op
9
- # @rbs return: void
10
- def self.convert_eval_insn(runtime, frame, insn)
11
- case insn.code
8
+ # @rbs code: Symbol
9
+ # @rbs operand: Array[operandItem]
10
+ # @rbs return: bool?
11
+ def self.convert_eval_insn(runtime, frame, code, operand)
12
+ case code
12
13
 
13
14
  when :i32_wrap_i64
14
15
  from = runtime.stack.pop
@@ -331,8 +332,9 @@ module Wardite
331
332
 
332
333
 
333
334
  else
334
- raise "Unknown opcode for namespace #{insn.namespace}: #{insn.code}"
335
+ return
335
336
  end
337
+ return true
336
338
  end
337
339
  end
338
340
  end
@@ -34,6 +34,7 @@ module Wardite
34
34
  i32_extend8_s i32_extend16_s i64_extend8_s i64_extend16_s i64_extend32_s
35
35
  __unsuported_from_here_on__
36
36
  ] #: Array[Symbol]
37
+ SYMS[0xfc] = :fc
37
38
 
38
39
  FC_SYMS = %i[
39
40
  i32_trunc_sat_f32_s i32_trunc_sat_f32_u i32_trunc_sat_f64_s i32_trunc_sat_f64_u
@@ -44,30 +45,417 @@ module Wardite
44
45
  __unsuported_from_here_on__
45
46
  ] #: Array[Symbol]
46
47
 
47
- # @rbs @@table: Hash[Integer, Symbol] | nil
48
- @@table = nil
49
- # @rbs @@fc_table: Hash[Integer, Symbol] | nil
50
- @@fc_table = nil
48
+ OPERANDS = [
49
+ [],
50
+ [],
51
+ [:u8_block],
52
+ [:u8_block],
53
+ [:u8_block],
54
+ [],
55
+ [],
56
+ [],
57
+ [],
58
+ [],
59
+ [],
60
+ [],
61
+ [:u32],
62
+ [:u32],
63
+ [:u32_vec, :u32],
64
+ [],
65
+ [:u32],
66
+ [:u32, :u32],
67
+ [],
68
+ [],
69
+ [],
70
+ [],
71
+ [],
72
+ [],
73
+ [],
74
+ [],
75
+ [],
76
+ [],
77
+ [],
78
+ [],
79
+ [],
80
+ [],
81
+ [:u32],
82
+ [:u32],
83
+ [:u32],
84
+ [:u32],
85
+ [:u32],
86
+ [],
87
+ [],
88
+ [],
89
+ [:u32, :u32],
90
+ [:u32, :u32],
91
+ [:u32, :u32],
92
+ [:u32, :u32],
93
+ [:u32, :u32],
94
+ [:u32, :u32],
95
+ [:u32, :u32],
96
+ [:u32, :u32],
97
+ [:u32, :u32],
98
+ [:u32, :u32],
99
+ [:u32, :u32],
100
+ [:u32, :u32],
101
+ [:u32, :u32],
102
+ [:u32, :u32],
103
+ [:u32, :u32],
104
+ [:u32, :u32],
105
+ [:u32, :u32],
106
+ [:u32, :u32],
107
+ [:u32, :u32],
108
+ [:u32, :u32],
109
+ [:u32, :u32],
110
+ [:u32, :u32],
111
+ [:u32, :u32],
112
+ [:u32],
113
+ [:u32],
114
+ [:i32],
115
+ [:i64],
116
+ [:f32],
117
+ [:f64],
118
+ [],
119
+ [],
120
+ [],
121
+ [],
122
+ [],
123
+ [],
124
+ [],
125
+ [],
126
+ [],
127
+ [],
128
+ [],
129
+ [],
130
+ [],
131
+ [],
132
+ [],
133
+ [],
134
+ [],
135
+ [],
136
+ [],
137
+ [],
138
+ [],
139
+ [],
140
+ [],
141
+ [],
142
+ [],
143
+ [],
144
+ [],
145
+ [],
146
+ [],
147
+ [],
148
+ [],
149
+ [],
150
+ [],
151
+ [],
152
+ [],
153
+ [],
154
+ [],
155
+ [],
156
+ [],
157
+ [],
158
+ [],
159
+ [],
160
+ [],
161
+ [],
162
+ [],
163
+ [],
164
+ [],
165
+ [],
166
+ [],
167
+ [],
168
+ [],
169
+ [],
170
+ [],
171
+ [],
172
+ [],
173
+ [],
174
+ [],
175
+ [],
176
+ [],
177
+ [],
178
+ [],
179
+ [],
180
+ [],
181
+ [],
182
+ [],
183
+ [],
184
+ [],
185
+ [],
186
+ [],
187
+ [],
188
+ [],
189
+ [],
190
+ [],
191
+ [],
192
+ [],
193
+ [],
194
+ [],
195
+ [],
196
+ [],
197
+ [],
198
+ [],
199
+ [],
200
+ [],
201
+ [],
202
+ [],
203
+ [],
204
+ [],
205
+ [],
206
+ [],
207
+ [],
208
+ [],
209
+ [],
210
+ [],
211
+ [],
212
+ [],
213
+ [],
214
+ [],
215
+ [],
216
+ [],
217
+ [],
218
+ [],
219
+ [],
220
+ [],
221
+ [],
222
+ [],
223
+ [],
224
+ [],
225
+ [],
226
+ [],
227
+ [],
228
+ [],
229
+ [],
230
+ [],
231
+ [],
232
+ [],
233
+ [],
234
+ [],
235
+ [],
236
+ [],
237
+ [],
238
+ [],
239
+ [],
240
+ [],
241
+ [],
242
+ [],
243
+ [],
244
+ [],
245
+ [],
246
+ []
247
+ ] #: Array[Array[Symbol]]
51
248
 
52
- # @rbs return: Hash[Integer, Symbol]
53
- def self.table
54
- return @@table if @@table != nil
55
- @@table = {} #: Hash[Integer, Symbol] | nil
56
- SYMS.each_with_index do |sym, i|
57
- @@table[i] = sym
58
- end
59
- @@table
60
- end
249
+ NAMESPACES = [
250
+ :default,
251
+ :default,
252
+ :default,
253
+ :default,
254
+ :default,
255
+ :default,
256
+ :default,
257
+ :default,
258
+ :default,
259
+ :default,
260
+ :default,
261
+ :default,
262
+ :default,
263
+ :default,
264
+ :default,
265
+ :default,
266
+ :default,
267
+ :default,
268
+ :default,
269
+ :default,
270
+ :default,
271
+ :default,
272
+ :default,
273
+ :default,
274
+ :default,
275
+ :default,
276
+ :default,
277
+ :default,
278
+ :default,
279
+ :default,
280
+ :default,
281
+ :default,
282
+ :default,
283
+ :default,
284
+ :default,
285
+ :default,
286
+ :default,
287
+ :default,
288
+ :default,
289
+ :default,
290
+ :i32,
291
+ :i64,
292
+ :f32,
293
+ :f64,
294
+ :i32,
295
+ :i32,
296
+ :i32,
297
+ :i32,
298
+ :i64,
299
+ :i64,
300
+ :i64,
301
+ :i64,
302
+ :i64,
303
+ :i64,
304
+ :i32,
305
+ :i64,
306
+ :f32,
307
+ :f64,
308
+ :i32,
309
+ :i32,
310
+ :i64,
311
+ :i64,
312
+ :i64,
313
+ :default,
314
+ :default,
315
+ :i32,
316
+ :i64,
317
+ :f32,
318
+ :f64,
319
+ :i32,
320
+ :i32,
321
+ :i32,
322
+ :i32,
323
+ :i32,
324
+ :i32,
325
+ :i32,
326
+ :i32,
327
+ :i32,
328
+ :i32,
329
+ :i32,
330
+ :i64,
331
+ :i64,
332
+ :i64,
333
+ :i64,
334
+ :i64,
335
+ :i64,
336
+ :i64,
337
+ :i64,
338
+ :i64,
339
+ :i64,
340
+ :i64,
341
+ :f32,
342
+ :f32,
343
+ :f32,
344
+ :f32,
345
+ :f32,
346
+ :f32,
347
+ :f64,
348
+ :f64,
349
+ :f64,
350
+ :f64,
351
+ :f64,
352
+ :f64,
353
+ :i32,
354
+ :i32,
355
+ :i32,
356
+ :i32,
357
+ :i32,
358
+ :i32,
359
+ :i32,
360
+ :i32,
361
+ :i32,
362
+ :i32,
363
+ :i32,
364
+ :i32,
365
+ :i32,
366
+ :i32,
367
+ :i32,
368
+ :i32,
369
+ :i32,
370
+ :i32,
371
+ :i64,
372
+ :i64,
373
+ :i64,
374
+ :i64,
375
+ :i64,
376
+ :i64,
377
+ :i64,
378
+ :i64,
379
+ :i64,
380
+ :i64,
381
+ :i64,
382
+ :i64,
383
+ :i64,
384
+ :i64,
385
+ :i64,
386
+ :i64,
387
+ :i64,
388
+ :i64,
389
+ :f32,
390
+ :f32,
391
+ :f32,
392
+ :f32,
393
+ :f32,
394
+ :f32,
395
+ :f32,
396
+ :f32,
397
+ :f32,
398
+ :f32,
399
+ :f32,
400
+ :f32,
401
+ :f32,
402
+ :f32,
403
+ :f64,
404
+ :f64,
405
+ :f64,
406
+ :f64,
407
+ :f64,
408
+ :f64,
409
+ :f64,
410
+ :f64,
411
+ :f64,
412
+ :f64,
413
+ :f64,
414
+ :f64,
415
+ :f64,
416
+ :f64,
417
+ :convert,
418
+ :convert,
419
+ :convert,
420
+ :convert,
421
+ :convert,
422
+ :convert,
423
+ :convert,
424
+ :convert,
425
+ :convert,
426
+ :convert,
427
+ :convert,
428
+ :convert,
429
+ :convert,
430
+ :convert,
431
+ :convert,
432
+ :convert,
433
+ :convert,
434
+ :convert,
435
+ :convert,
436
+ :convert,
437
+ :convert,
438
+ :convert,
439
+ :convert,
440
+ :convert,
441
+ :convert,
442
+ :convert,
443
+ :convert,
444
+ :convert,
445
+ :convert,
446
+ :convert
447
+ ] #: Array[Symbol]
61
448
 
62
- # @rbs return: Hash[Integer, Symbol]
63
- def self.fc_table
64
- return @@fc_table if @@fc_table != nil
65
- @@fc_table = {} #: Hash[Integer, Symbol] | nil
66
- FC_SYMS.each_with_index do |sym, i|
67
- @@fc_table[i] = sym
68
- end
69
- @@fc_table
70
- end
449
+ FC_OPERANDS = [
450
+ :convert,
451
+ :convert,
452
+ :convert,
453
+ :convert,
454
+ :convert,
455
+ :convert,
456
+ :convert,
457
+ :convert
458
+ ] #: Array[Symbol]
71
459
 
72
460
  attr_accessor :namespace #: Symbol
73
461
 
@@ -78,6 +466,10 @@ module Wardite
78
466
 
79
467
  attr_accessor :meta #: Hash[Symbol, Integer]
80
468
 
469
+ # $OP_COUNT = 0
470
+ # END {
471
+ # puts "Total opcodes: #{$OP_COUNT}"
472
+ # }
81
473
  # @rbs namespace: Symbol
82
474
  # @rbs code: Symbol
83
475
  # @rbs operand: Array[operandItem]
@@ -86,61 +478,25 @@ module Wardite
86
478
  @code = code
87
479
  @operand = operand
88
480
  @meta = {}
481
+ # $OP_COUNT += 1
89
482
  end
90
483
 
91
- # @rbs chr: String
92
- # @rbs return: [Symbol, Symbol]
484
+ # @rbs chr: Integer
485
+ # @rbs return: Symbol
93
486
  def self.to_sym(chr)
94
- if chr.ord == 0xfc
95
- return [:fc, :fc]
96
- end
97
-
98
- code = table[chr.ord]
99
- if ! code
100
- raise "found unknown code 0x#{chr.ord.to_s(16)}"
101
- end
102
- # opcodes equal to or larger than are "convert" ops
103
- if chr.ord >= 0xa7
104
- return [:convert, code]
105
- end
106
-
107
- prefix = code.to_s.split("_")[0]
108
- case prefix
109
- when "i32", "i64", "f32", "f64"
110
- [prefix.to_sym, code]
111
- else
112
- [:default, code]
113
- end
487
+ return SYMS[chr]
114
488
  end
115
489
 
116
490
  # @rbs lower: Integer
117
- # @rbs return: [Symbol, Symbol]
491
+ # @rbs return: Symbol
118
492
  def self.resolve_fc_sym(lower)
119
- if lower == 0xfc
120
- return [:fc, :fc]
121
- end
122
-
123
- code = fc_table[lower]
124
- if ! code
125
- raise "found unknown code 0xfc 0x#{lower.to_s(16)}"
126
- end
127
-
128
- prefix = code.to_s.split("_")[0]
129
- case prefix
130
- when "i32", "i64", "f32", "f64"
131
- # All FC operations for numeric are "convert"
132
- [:convert, code]
133
- else
134
- [:default, code]
135
- end
493
+ FC_SYMS[lower] || raise("found unknown code 0xfc 0x#{lower.to_s(16)}")
136
494
  end
137
495
 
138
496
  # @rbs code: Symbol
139
497
  # @rbs return: Array[Symbol]
140
498
  def self.operand_of(code)
141
499
  case code
142
- when /load/, /store/
143
- [:u32, :u32]
144
500
  when :local_get, :local_set, :local_tee, :global_get, :global_set, :call, :br, :br_if
145
501
  [:u32]
146
502
  when :memory_init, :memory_copy
@@ -161,6 +517,10 @@ module Wardite
161
517
  [:f64]
162
518
  when :if, :block, :loop
163
519
  [:u8_block]
520
+ when :i32_load, :i64_load, :f32_load, :f64_load, :i32_load8_s, :i32_load8_u, :i32_load16_s, :i32_load16_u,
521
+ :i64_load8_s, :i64_load8_u, :i64_load16_s, :i64_load16_u, :i64_load32_s, :i64_load32_u, :i32_store, :i64_store,
522
+ :f32_store, :f64_store, :i32_store8, :i32_store16, :i64_store8, :i64_store16, :i64_store32
523
+ [:u32, :u32]
164
524
  else
165
525
  []
166
526
  end
@@ -8,10 +8,9 @@ module Wardite
8
8
  dest = 0
9
9
  level = 0
10
10
  while b = buf.read(1)
11
- if b == nil
12
- raise LoadError, "buffer too short"
13
- end
11
+ raise LoadError, "buffer too short" unless b
14
12
  c = b.ord
13
+ return c if c < 0x80 && level.zero?
15
14
 
16
15
  upper, lower = (c >> 7), (c & (1 << 7) - 1)
17
16
  dest |= lower << (7 * level)
@@ -34,9 +33,7 @@ module Wardite
34
33
  dest = 0
35
34
  level = 0
36
35
  while b = buf.read(1)
37
- if b == nil
38
- raise LoadError, "buffer too short"
39
- end
36
+ raise LoadError, "buffer too short" unless b
40
37
  c = b.ord
41
38
 
42
39
  upper, lower = (c >> 7), (c & (1 << 7) - 1)