wardite 0.4.0 → 0.4.2

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: 2d2b7f37620b7290c9a4c1fc558024d87cb7ad73bf217c7f7abbda3e6dfda266
4
- data.tar.gz: c239d24ee56a9dd80084abc11dcffad7a40edbc2c4644146c3cf91fa5b393ddd
3
+ metadata.gz: a6335000832a623233f1a9719fe271fa4a000270bc55312fc996fe3f4e72bad9
4
+ data.tar.gz: d72874301c47400a24fa9992de296d5d490c04d2c6f1dad2b76493f7eed3b464
5
5
  SHA512:
6
- metadata.gz: 8a9369b5cb946190e8dd0f0fc5c17d383e9f5f168098332b78a4ed821398f0a6d7b631558ba6a8a32a14d9ebcce88dd23e8f05d32b73eb7d9e7aafa14a46b0f4
7
- data.tar.gz: 62f7f961e035a39203616793aa257d238a62760c70f6c9184070d3b79cc0615b829fbe5c4b89608838efe3db6b1a9e26332a125530992fcb41dcd64df8df3304
6
+ metadata.gz: 3d3a12027244cac1cc6efeb382a6a164c070946a85886eae1915c90360a6c139766ae2780103511bf1e332418576a6dbdc1fd7ca7266a2974dd228d24155bedb
7
+ data.tar.gz: 282d5051760ca800a876daaa1962bea603961ce3fc4551560255030c433e445ba0efc945b75b5829112a6742b6492142ad3c2a1d577f30816bcf76f39bd58f2e
data/README.md CHANGED
@@ -7,6 +7,21 @@ A pure-ruby webassembly runtime.
7
7
  - [x] Fully typed by RBS (with the aid of [rbs-inline](https://github.com/soutaro/rbs-inline))
8
8
  - [ ] WASI (p1) support
9
9
 
10
+ ## Supported Instructions
11
+
12
+ ref: https://webassembly.github.io/spec/core/binary/instructions.html
13
+
14
+ - [x] Control Instructions
15
+ - [x] Parametric Instructions
16
+ - [x] Variable Instructions
17
+ - [ ] Table Instructions
18
+ - [x] Memory Instructions (except `data.drop`)
19
+ - [x] Numeric Instructions (`0x41 ... 0xC4`)
20
+ - [x] Numeric Instructions (`0xFC` Operations)
21
+ - [ ] Reference Instructions
22
+ - [ ] Vector Instructions
23
+ - [x] end `0x0B`
24
+
10
25
  ## Installation
11
26
 
12
27
  Install the gem and add to the application's Gemfile by executing:
@@ -58,7 +58,7 @@ module Wardite
58
58
  runtime.stack.push(to)
59
59
 
60
60
 
61
- when :i32_extend_8_s
61
+ when :i32_extend8_s
62
62
  from = runtime.stack.pop
63
63
  raise EvalError, "maybe empty or invalid stack" if !from.is_a?(I32)
64
64
  to = from.extendN_s(to: :i32, from: :i8)
@@ -66,7 +66,7 @@ module Wardite
66
66
  runtime.stack.push(to)
67
67
 
68
68
 
69
- when :i32_extend_16_s
69
+ when :i32_extend16_s
70
70
  from = runtime.stack.pop
71
71
  raise EvalError, "maybe empty or invalid stack" if !from.is_a?(I32)
72
72
  to = from.extendN_s(to: :i32, from: :i16)
@@ -178,7 +178,7 @@ module Wardite
178
178
  runtime.stack.push(to)
179
179
 
180
180
 
181
- when :i64_extend_8_s
181
+ when :i64_extend8_s
182
182
  from = runtime.stack.pop
183
183
  raise EvalError, "maybe empty or invalid stack" if !from.is_a?(I32)
184
184
  to = from.extendN_s(to: :i64, from: :i8)
@@ -186,7 +186,7 @@ module Wardite
186
186
  runtime.stack.push(to)
187
187
 
188
188
 
189
- when :i64_extend_16_s
189
+ when :i64_extend16_s
190
190
  from = runtime.stack.pop
191
191
  raise EvalError, "maybe empty or invalid stack" if !from.is_a?(I32)
192
192
  to = from.extendN_s(to: :i64, from: :i16)
@@ -194,7 +194,7 @@ module Wardite
194
194
  runtime.stack.push(to)
195
195
 
196
196
 
197
- when :i64_extend_32_s
197
+ when :i64_extend32_s
198
198
  from = runtime.stack.pop
199
199
  raise EvalError, "maybe empty or invalid stack" if !from.is_a?(I32)
200
200
  to = from.extendN_s(to: :i64, from: :i32)
@@ -2,8 +2,9 @@
2
2
  module Wardite
3
3
  module Leb128Helper
4
4
  # @rbs buf: File|StringIO
5
+ # @rbs max_level: Integer
5
6
  # @rbs return: Integer
6
- def fetch_uleb128(buf)
7
+ def fetch_uleb128(buf, max_level: 8)
7
8
  dest = 0
8
9
  level = 0
9
10
  while b = buf.read(1)
@@ -18,7 +19,7 @@ module Wardite
18
19
  return dest
19
20
  end
20
21
 
21
- if level > 6
22
+ if level > max_level
22
23
  break
23
24
  end
24
25
  level += 1
@@ -29,7 +30,7 @@ module Wardite
29
30
 
30
31
  # @rbs buf: File|StringIO
31
32
  # @rbs return: Integer
32
- def fetch_sleb128(buf)
33
+ def fetch_sleb128(buf, max_level: 8)
33
34
  dest = 0
34
35
  level = 0
35
36
  while b = buf.read(1)
@@ -44,7 +45,7 @@ module Wardite
44
45
  break
45
46
  end
46
47
 
47
- if level > 6
48
+ if level > max_level
48
49
  raise "unreachable! debug: dest = #{dest} level = #{level}"
49
50
  end
50
51
  level += 1
data/lib/wardite/load.rb CHANGED
@@ -630,7 +630,7 @@ module Wardite
630
630
  when :i32
631
631
  operand << fetch_sleb128(buf)
632
632
  when :i64
633
- operand << fetch_sleb128(buf)
633
+ operand << fetch_sleb128(buf, max_level: 16)
634
634
  when :f32
635
635
  data = buf.read 4
636
636
  if !data || data.size != 4
@@ -667,6 +667,12 @@ module Wardite
667
667
  end
668
668
 
669
669
  dest
670
+ rescue => e
671
+ require "pp"
672
+ $stderr.puts "parsed:::"
673
+ $stderr.puts "#{dest.pretty_inspect}"
674
+ $stderr.puts "code = #{code}"
675
+ raise e
670
676
  end
671
677
 
672
678
  # @rbs c: String
@@ -845,7 +851,7 @@ module Wardite
845
851
  # @rbs return: nil
846
852
  def self.unimplemented_skip_section(code)
847
853
  $stderr.puts "warning: unimplemented section: 0x0#{code}"
848
- size = @buf.read(1)&.ord
854
+ size = fetch_uleb128(@buf)
849
855
  @buf.read(size)
850
856
  nil
851
857
  end
@@ -2,5 +2,5 @@
2
2
  # rbs_inline: enabled
3
3
 
4
4
  module Wardite
5
- VERSION = "0.4.0" #: String
5
+ VERSION = "0.4.2" #: String
6
6
  end
data/lib/wardite.rb CHANGED
@@ -310,20 +310,28 @@ module Wardite
310
310
  end
311
311
  self.stack = drained_stack(local_start)
312
312
 
313
- wasm_function.locals_type.each_with_index do |typ, i|
314
- case typ
315
- when :i32, :u32
316
- locals.push I32(0)
317
- when :i64, :u64
318
- locals.push I64(0)
319
- else
320
- $stderr.puts "warning: unknown type #{typ.inspect}. default to I32"
321
- locals.push I32(0)
313
+ wasm_function.locals_count.each_with_index do |count, i|
314
+ typ = wasm_function.locals_type[i]
315
+ count.times do
316
+ case typ
317
+ when :i32, :u32
318
+ locals.push I32(0)
319
+ when :i64, :u64
320
+ locals.push I64(0)
321
+ when :f32
322
+ locals.push F32(0.0)
323
+ when :f64
324
+ locals.push F64(0.0)
325
+ else
326
+ $stderr.puts "warning: unknown type #{typ.inspect}. default to I32"
327
+ locals.push I32(0)
328
+ end
322
329
  end
323
330
  end
324
331
 
325
332
  arity = wasm_function.retsig.size
326
333
  frame = Frame.new(-1, stack.size, wasm_function.body, arity, locals)
334
+ frame.findex = wasm_function.findex
327
335
  self.call_stack.push(frame)
328
336
  end
329
337
 
@@ -593,7 +601,8 @@ module Wardite
593
601
  end
594
602
  local = frame.locals[idx]
595
603
  if !local
596
- raise EvalError, "local not found"
604
+ # require "irb"; binding.irb
605
+ raise EvalError, "local not found, idx = #{idx}"
597
606
  end
598
607
  stack.push(local)
599
608
 
@@ -884,6 +893,8 @@ module Wardite
884
893
 
885
894
  attr_accessor :locals #: Array[wasmValue]
886
895
 
896
+ attr_accessor :findex #: Integer
897
+
887
898
  # @rbs pc: Integer
888
899
  # @rbs sp: Integer
889
900
  # @rbs body: Array[Op]
@@ -897,6 +908,8 @@ module Wardite
897
908
  @arity = arity
898
909
  @locals = locals
899
910
  @labels = []
911
+
912
+ @findex = 0
900
913
  end
901
914
  end
902
915
 
@@ -970,6 +983,8 @@ module Wardite
970
983
  retsig = type_section.defined_results[sigindex]
971
984
  codes = code_section.func_codes[findex]
972
985
  wasm_function = WasmFunction.new(callsig, retsig, codes)
986
+ idx = self.funcs.size
987
+ wasm_function.findex = idx
973
988
  self.funcs << wasm_function
974
989
  end
975
990
  end
@@ -1233,6 +1248,8 @@ module Wardite
1233
1248
 
1234
1249
  attr_accessor :code_body #: CodeSection::CodeBody
1235
1250
 
1251
+ attr_accessor :findex #: Integer
1252
+
1236
1253
  # @rbs callsig: Array[Symbol]
1237
1254
  # @rbs retsig: Array[Symbol]
1238
1255
  # @rbs code_body: CodeSection::CodeBody
@@ -1242,6 +1259,7 @@ module Wardite
1242
1259
  @retsig = retsig
1243
1260
 
1244
1261
  @code_body = code_body
1262
+ @findex = 0 # for debug
1245
1263
  end
1246
1264
 
1247
1265
  # @rbs return: Array[Op]
data/scripts/gen_conv.rb CHANGED
@@ -46,7 +46,7 @@ module GenConv
46
46
  elsif method =~ /^extendN_(u|s)$/
47
47
  suffix = $1
48
48
  from_size = from.to_s.scan(/\d+/).join
49
- symbol = "#{to.to_s}_extend_#{from_size}_#{suffix}"
49
+ symbol = "#{to.to_s}_extend#{from_size}_#{suffix}"
50
50
  extra_kargs = ", from: :#{from.to_s}"
51
51
  elsif method.end_with?("_s") or method.end_with?("_u")
52
52
  core = method.sub(/_(s|u)$/, "")
@@ -4,11 +4,12 @@
4
4
  module Wardite
5
5
  module Leb128Helper
6
6
  # @rbs buf: File|StringIO
7
+ # @rbs max_level: Integer
7
8
  # @rbs return: Integer
8
- def fetch_uleb128: (File | StringIO buf) -> Integer
9
+ def fetch_uleb128: (File | StringIO buf, ?max_level: Integer) -> Integer
9
10
 
10
11
  # @rbs buf: File|StringIO
11
12
  # @rbs return: Integer
12
- def fetch_sleb128: (File | StringIO buf) -> Integer
13
+ def fetch_sleb128: (File | StringIO buf, ?max_level: untyped) -> Integer
13
14
  end
14
15
  end
@@ -175,6 +175,8 @@ module Wardite
175
175
 
176
176
  attr_accessor locals: Array[wasmValue]
177
177
 
178
+ attr_accessor findex: Integer
179
+
178
180
  # @rbs pc: Integer
179
181
  # @rbs sp: Integer
180
182
  # @rbs body: Array[Op]
@@ -334,6 +336,8 @@ module Wardite
334
336
 
335
337
  attr_accessor code_body: CodeSection::CodeBody
336
338
 
339
+ attr_accessor findex: Integer
340
+
337
341
  # @rbs callsig: Array[Symbol]
338
342
  # @rbs retsig: Array[Symbol]
339
343
  # @rbs code_body: CodeSection::CodeBody
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wardite
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Uchio Kondo
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-11-10 00:00:00.000000000 Z
11
+ date: 2024-11-11 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A pure-ruby webassembly runtime
14
14
  email: