wardite 0.2.2 → 0.3.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/examples/break.wat +13 -0
- data/examples/call_indirect.wat +15 -0
- data/examples/loop.wat +20 -0
- data/examples/start.wat +12 -0
- data/lib/wardite/instruction.rb +11 -5
- data/lib/wardite/load.rb +130 -9
- data/lib/wardite/value.rb +45 -42
- data/lib/wardite/version.rb +1 -1
- data/lib/wardite/wasi.rb +2 -2
- data/lib/wardite.rb +387 -15
- data/sig/generated/wardite/instruction.rbs +6 -3
- data/sig/generated/wardite/load.rbs +44 -6
- data/sig/generated/wardite/value.rbs +82 -80
- data/sig/generated/wardite/wasi.rbs +4 -4
- data/sig/generated/wardite.rbs +97 -17
- data/sig/wardite.rbs +1 -3
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f92001daa1c57ae535fd1556fabee90a61dbe741e4e5b9f313c26e5d75d68b3e
|
4
|
+
data.tar.gz: 237df98e70875e1b6e69fbf0019cc298c3df26fa69cd4e62df8a04eaeff37522
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 94b5d318cebff3c8d87ea03fa0c5489ece3ef26ca7fcd6e6324febaf55a63f0a9ecb0a76d01b5adf5712737d8daf79ac55f5e2149ff8f85612acbaee1a2ace8c
|
7
|
+
data.tar.gz: c5991f43b9a62a7df87f23ec71350a77bf9493ccd083c6d0dba596c55976460e0c89625294048389a5fec1e35826bfbddd205718b45e04353b8e1627ccc4bb57
|
data/examples/break.wat
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
;; https://developer.mozilla.org/en-US/docs/WebAssembly/Reference/Control_flow/block
|
2
|
+
(module
|
3
|
+
(func (export "ret_if_100") (param $num i32) (result i32)
|
4
|
+
(block $my_block
|
5
|
+
local.get $num
|
6
|
+
i32.const 100
|
7
|
+
i32.eq
|
8
|
+
(if
|
9
|
+
(then
|
10
|
+
br $my_block))
|
11
|
+
i32.const -1
|
12
|
+
local.set $num)
|
13
|
+
local.get $num))
|
@@ -0,0 +1,15 @@
|
|
1
|
+
(module
|
2
|
+
;; ref https://ukyo.github.io/wasm-usui-book/webroot/get-started-webassembly.html
|
3
|
+
;; and https://developer.mozilla.org/ja/docs/WebAssembly/Understanding_the_text_format
|
4
|
+
(type $return_i32 (func (result i32)))
|
5
|
+
(table 3 funcref)
|
6
|
+
(elem (i32.const 0) $f1 $f2 $f3)
|
7
|
+
|
8
|
+
(func $f1 (result i32) i32.const 111)
|
9
|
+
(func $f2 (result i32) i32.const 222)
|
10
|
+
(func $f3 (result i32) i32.const 333)
|
11
|
+
|
12
|
+
(func (export "call_indirect") (param $i i32) (result i32)
|
13
|
+
local.get $i
|
14
|
+
call_indirect (type $return_i32))
|
15
|
+
)
|
data/examples/loop.wat
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
(module ;; https://developer.mozilla.org/en-US/docs/WebAssembly/Reference/Control_flow/br
|
2
|
+
(global $i (mut i32) (i32.const 0))
|
3
|
+
|
4
|
+
(func $count (result i32)
|
5
|
+
(loop $my_loop (result i32)
|
6
|
+
global.get $i
|
7
|
+
i32.const 1
|
8
|
+
i32.add
|
9
|
+
global.set $i
|
10
|
+
|
11
|
+
global.get $i
|
12
|
+
global.get $i
|
13
|
+
i32.const 10
|
14
|
+
i32.lt_s
|
15
|
+
br_if $my_loop
|
16
|
+
)
|
17
|
+
)
|
18
|
+
|
19
|
+
(export "count" (func $count))
|
20
|
+
)
|
data/examples/start.wat
ADDED
data/lib/wardite/instruction.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
# rbs_inline: enabled
|
2
2
|
|
3
3
|
module Wardite
|
4
|
+
# @rbs!
|
5
|
+
# type operandItem = Integer | Array[Integer] | Float | Block
|
6
|
+
|
4
7
|
class Op
|
5
8
|
# @see https://pengowray.github.io/wasm-ops/
|
6
9
|
SYMS = %i[
|
@@ -50,11 +53,11 @@ module Wardite
|
|
50
53
|
attr_accessor :code #: Symbol
|
51
54
|
|
52
55
|
# TODO: add types of potential operands
|
53
|
-
attr_accessor :operand #: Array[
|
56
|
+
attr_accessor :operand #: Array[operandItem]
|
54
57
|
|
55
58
|
# @rbs namespace: Symbol
|
56
59
|
# @rbs code: Symbol
|
57
|
-
# @rbs operand: Array[
|
60
|
+
# @rbs operand: Array[operandItem]
|
58
61
|
def initialize(namespace, code, operand)
|
59
62
|
@namespace = namespace
|
60
63
|
@code = code
|
@@ -102,9 +105,7 @@ module Wardite
|
|
102
105
|
[:f32]
|
103
106
|
when :f64_const
|
104
107
|
[:f64]
|
105
|
-
when :if
|
106
|
-
[:u8_if_block]
|
107
|
-
when :block, :loop
|
108
|
+
when :if, :block, :loop
|
108
109
|
[:u8_block]
|
109
110
|
else
|
110
111
|
[]
|
@@ -112,10 +113,15 @@ module Wardite
|
|
112
113
|
end
|
113
114
|
|
114
115
|
# @see https://www.w3.org/TR/wasm-core-1/#value-types%E2%91%A2
|
116
|
+
# We use this for reftype conversion. https://webassembly.github.io/spec/core/binary/types.html#binary-reftype
|
115
117
|
# @rbs code: Integer
|
116
118
|
# @rbs return: Symbol
|
117
119
|
def self.i2type(code)
|
118
120
|
case code
|
121
|
+
when 0x6f
|
122
|
+
:externref
|
123
|
+
when 0x70
|
124
|
+
:funcref
|
119
125
|
when 0x7f
|
120
126
|
:i32
|
121
127
|
when 0x7e
|
data/lib/wardite/load.rb
CHANGED
@@ -35,8 +35,23 @@ module Wardite
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
+
class TableSection < Section
|
39
|
+
attr_accessor :table_types #: Array[Symbol]
|
40
|
+
|
41
|
+
attr_accessor :table_limits #: Array[[Integer, Integer?]]
|
42
|
+
|
43
|
+
# @rbs return: void
|
44
|
+
def initialize
|
45
|
+
self.name = "Table"
|
46
|
+
self.code = 0x4
|
47
|
+
|
48
|
+
@table_types = []
|
49
|
+
@table_limits = []
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
38
53
|
class MemorySection < Section
|
39
|
-
attr_accessor :limits #: Array[[Integer, Integer
|
54
|
+
attr_accessor :limits #: Array[[Integer, Integer?]]
|
40
55
|
|
41
56
|
# @rbs return: void
|
42
57
|
def initialize
|
@@ -56,7 +71,7 @@ module Wardite
|
|
56
71
|
# TODO: unused in wasm 1.0 spec?
|
57
72
|
attr_accessor :shared #: bool
|
58
73
|
|
59
|
-
attr_accessor :value #:
|
74
|
+
attr_accessor :value #: wasmValue
|
60
75
|
|
61
76
|
# @rbs &blk: (Global) -> void
|
62
77
|
# @rbs return: void
|
@@ -76,6 +91,35 @@ module Wardite
|
|
76
91
|
end
|
77
92
|
end
|
78
93
|
|
94
|
+
class StartSection < Section
|
95
|
+
attr_accessor :func_index #: Integer
|
96
|
+
|
97
|
+
# @rbs return: void
|
98
|
+
def initialize
|
99
|
+
self.name = "Start"
|
100
|
+
self.code = 0x8
|
101
|
+
self.func_index = -1
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
class ElemSection < Section
|
106
|
+
attr_accessor :table_indices #: Array[Integer]
|
107
|
+
|
108
|
+
attr_accessor :table_offsets #: Array[Integer]
|
109
|
+
|
110
|
+
attr_accessor :element_indices #: Array[Array[Integer]]
|
111
|
+
|
112
|
+
# @rbs return: void
|
113
|
+
def initialize
|
114
|
+
self.name = "Elem"
|
115
|
+
self.code = 0x9
|
116
|
+
|
117
|
+
@table_indices = []
|
118
|
+
@table_offsets = []
|
119
|
+
@element_indices = []
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
79
123
|
class CodeSection < Section
|
80
124
|
class CodeBody
|
81
125
|
attr_accessor :locals_count #: Array[Integer]
|
@@ -186,8 +230,10 @@ module Wardite
|
|
186
230
|
extend Wardite::Leb128Helper
|
187
231
|
extend Wardite::ValueHelper
|
188
232
|
|
233
|
+
# @rbs self.@buf: File|StringIO
|
234
|
+
|
189
235
|
# @rbs buf: File|StringIO
|
190
|
-
# @rbs import_object: Hash[Symbol, Hash[Symbol,
|
236
|
+
# @rbs import_object: Hash[Symbol, Hash[Symbol, wasmCallable]]
|
191
237
|
# @rbs enable_wasi: boolish
|
192
238
|
# @rbs return: Instance
|
193
239
|
def self.load_from_buffer(buf, import_object: {}, enable_wasi: true)
|
@@ -249,7 +295,7 @@ module Wardite
|
|
249
295
|
when Wardite::SectionFunction
|
250
296
|
function_section
|
251
297
|
when Wardite::SectionTable
|
252
|
-
|
298
|
+
table_section
|
253
299
|
when Wardite::SectionMemory
|
254
300
|
memory_section
|
255
301
|
when Wardite::SectionGlobal
|
@@ -257,9 +303,9 @@ module Wardite
|
|
257
303
|
when Wardite::SectionExport
|
258
304
|
export_section
|
259
305
|
when Wardite::SectionStart
|
260
|
-
|
306
|
+
start_section
|
261
307
|
when Wardite::SectionElement
|
262
|
-
|
308
|
+
elem_section
|
263
309
|
when Wardite::SectionCode
|
264
310
|
code_section
|
265
311
|
when Wardite::SectionData
|
@@ -387,6 +433,50 @@ module Wardite
|
|
387
433
|
dest
|
388
434
|
end
|
389
435
|
|
436
|
+
# @rbs return: StartSection
|
437
|
+
def self.start_section
|
438
|
+
dest = StartSection.new
|
439
|
+
size = fetch_uleb128(@buf)
|
440
|
+
dest.size = size
|
441
|
+
# StartSection won't use size
|
442
|
+
func_index = fetch_uleb128(@buf)
|
443
|
+
dest.func_index = func_index
|
444
|
+
dest
|
445
|
+
end
|
446
|
+
|
447
|
+
# @rbs return: ElemSection
|
448
|
+
def self.elem_section
|
449
|
+
dest = ElemSection.new
|
450
|
+
size = fetch_uleb128(@buf)
|
451
|
+
dest.size = size
|
452
|
+
sbuf = StringIO.new(@buf.read(size) || raise("buffer too short"))
|
453
|
+
|
454
|
+
len = fetch_uleb128(sbuf)
|
455
|
+
len.times do |i|
|
456
|
+
etype = fetch_uleb128(sbuf)
|
457
|
+
case etype
|
458
|
+
when 0x0 # expr, vec(funcidx)
|
459
|
+
dest.table_indices << 0 # default and fixed to table[0]
|
460
|
+
|
461
|
+
code = fetch_insn_while_end(sbuf)
|
462
|
+
ops = code_body(StringIO.new(code))
|
463
|
+
offset = decode_expr(ops)
|
464
|
+
dest.table_offsets << offset
|
465
|
+
|
466
|
+
elms = []
|
467
|
+
elen = fetch_uleb128(sbuf)
|
468
|
+
elen.times do |i|
|
469
|
+
index = fetch_uleb128(sbuf)
|
470
|
+
elms << index
|
471
|
+
end
|
472
|
+
dest.element_indices << elms
|
473
|
+
else
|
474
|
+
raise NotImplementedError, "element section type #{etype} is a TODO!"
|
475
|
+
end
|
476
|
+
end
|
477
|
+
dest
|
478
|
+
end
|
479
|
+
|
390
480
|
# @rbs return: GlobalSection
|
391
481
|
def self.global_section
|
392
482
|
dest = GlobalSection.new
|
@@ -433,6 +523,30 @@ module Wardite
|
|
433
523
|
dest
|
434
524
|
end
|
435
525
|
|
526
|
+
# @rbs return: TableSection
|
527
|
+
def self.table_section
|
528
|
+
dest = TableSection.new
|
529
|
+
size = fetch_uleb128(@buf)
|
530
|
+
dest.size = size
|
531
|
+
sbuf = StringIO.new(@buf.read(size) || raise("buffer too short"))
|
532
|
+
|
533
|
+
len = fetch_uleb128(sbuf)
|
534
|
+
len.times do |i|
|
535
|
+
code = fetch_uleb128(sbuf)
|
536
|
+
type = Op.i2type(code)
|
537
|
+
dest.table_types << type
|
538
|
+
|
539
|
+
flags = fetch_uleb128(sbuf)
|
540
|
+
min = fetch_uleb128(sbuf)
|
541
|
+
max = nil
|
542
|
+
if flags != 0
|
543
|
+
max = fetch_uleb128(sbuf)
|
544
|
+
end
|
545
|
+
dest.table_limits << [min, max]
|
546
|
+
end
|
547
|
+
dest
|
548
|
+
end
|
549
|
+
|
436
550
|
# @rbs return: CodeSection
|
437
551
|
def self.code_section
|
438
552
|
dest = CodeSection.new
|
@@ -478,7 +592,7 @@ module Wardite
|
|
478
592
|
while c = buf.read(1)
|
479
593
|
namespace, code = Op.to_sym(c)
|
480
594
|
operand_types = Op.operand_of(code)
|
481
|
-
operand = [] #: Array[
|
595
|
+
operand = [] #: Array[operandItem]
|
482
596
|
operand_types.each do |typ|
|
483
597
|
case typ
|
484
598
|
when :u8
|
@@ -489,6 +603,13 @@ module Wardite
|
|
489
603
|
operand << ope.ord
|
490
604
|
when :u32
|
491
605
|
operand << fetch_uleb128(buf)
|
606
|
+
when :u32_vec
|
607
|
+
len = fetch_uleb128(buf)
|
608
|
+
vec = [] #: Array[Integer]
|
609
|
+
len.times do
|
610
|
+
vec << fetch_uleb128(buf)
|
611
|
+
end
|
612
|
+
operand << vec
|
492
613
|
when :i32
|
493
614
|
operand << fetch_sleb128(buf)
|
494
615
|
when :i64
|
@@ -509,7 +630,7 @@ module Wardite
|
|
509
630
|
v = data.unpack("E")[0]
|
510
631
|
raise "String#unpack is broken" if !v.is_a?(Float)
|
511
632
|
operand << v
|
512
|
-
when :
|
633
|
+
when :u8_block
|
513
634
|
block_ope = buf.read 1
|
514
635
|
if ! block_ope
|
515
636
|
raise LoadError, "buffer too short for if"
|
@@ -599,7 +720,7 @@ module Wardite
|
|
599
720
|
end
|
600
721
|
|
601
722
|
# @rbs ops: Array[Op]
|
602
|
-
# @rbs return:
|
723
|
+
# @rbs return: wasmValue
|
603
724
|
def self.decode_global_expr(ops)
|
604
725
|
# sees first opcode
|
605
726
|
op = ops.first
|
data/lib/wardite/value.rb
CHANGED
@@ -1,12 +1,15 @@
|
|
1
1
|
# rbs_inline: enabled
|
2
2
|
|
3
3
|
module Wardite
|
4
|
+
# @rbs!
|
5
|
+
# type wasmValue = I32 | I64 | F32 | F64
|
6
|
+
|
4
7
|
module ValueHelper
|
5
8
|
# @rbs value: Integer
|
6
9
|
# @rbs return: I32
|
7
10
|
def I32(value)
|
8
11
|
if value < 0
|
9
|
-
$stderr.puts "
|
12
|
+
# $stderr.puts "trace: negative i32 value #{value} is passed, convert to unsigned"
|
10
13
|
value = as_u32(value)
|
11
14
|
end
|
12
15
|
I32.new.tap{|i| i.value = value & I32::I32_MAX }
|
@@ -16,7 +19,7 @@ module Wardite
|
|
16
19
|
# @rbs return: I64
|
17
20
|
def I64(value)
|
18
21
|
if value < 0
|
19
|
-
$stderr.puts "
|
22
|
+
# $stderr.puts "trace: negative i64 value #{value} is passed, convert to unsigned"
|
20
23
|
value = as_u64(value)
|
21
24
|
end
|
22
25
|
I64.new.tap{|i| i.value = value & I64::I64_MAX }
|
@@ -107,39 +110,39 @@ module Wardite
|
|
107
110
|
end
|
108
111
|
|
109
112
|
# @rbs to: Symbol
|
110
|
-
# @rbs return:
|
113
|
+
# @rbs return: wasmValue
|
111
114
|
def wrap(to:)
|
112
115
|
raise EvalError, "unsupported operation"
|
113
116
|
end
|
114
117
|
|
115
118
|
# @rbs to: Symbol
|
116
|
-
# @rbs return:
|
119
|
+
# @rbs return: wasmValue
|
117
120
|
def extend_s(to:)
|
118
121
|
raise EvalError, "unsupported operation" if to != :i64
|
119
122
|
I64(value_s)
|
120
123
|
end
|
121
124
|
|
122
125
|
# @rbs to: Symbol
|
123
|
-
# @rbs return:
|
126
|
+
# @rbs return: wasmValue
|
124
127
|
def extend_u(to:)
|
125
128
|
raise EvalError, "unsupported operation" if to != :i64
|
126
129
|
I64(value)
|
127
130
|
end
|
128
131
|
|
129
132
|
# @rbs to: Symbol
|
130
|
-
# @rbs return:
|
133
|
+
# @rbs return: wasmValue
|
131
134
|
def trunc_s(to:)
|
132
135
|
raise EvalError, "unsupported operation"
|
133
136
|
end
|
134
137
|
|
135
138
|
# @rbs to: Symbol
|
136
|
-
# @rbs return:
|
139
|
+
# @rbs return: wasmValue
|
137
140
|
def trunc_u(to:)
|
138
141
|
raise EvalError, "unsupported operation"
|
139
142
|
end
|
140
143
|
|
141
144
|
# @rbs to: Symbol
|
142
|
-
# @rbs return:
|
145
|
+
# @rbs return: wasmValue
|
143
146
|
def convert_s(to:)
|
144
147
|
case to
|
145
148
|
when :f32
|
@@ -152,7 +155,7 @@ module Wardite
|
|
152
155
|
end
|
153
156
|
|
154
157
|
# @rbs to: Symbol
|
155
|
-
# @rbs return:
|
158
|
+
# @rbs return: wasmValue
|
156
159
|
def convert_u(to:)
|
157
160
|
case to
|
158
161
|
when :f32
|
@@ -165,21 +168,21 @@ module Wardite
|
|
165
168
|
end
|
166
169
|
|
167
170
|
# @rbs to: Symbol
|
168
|
-
# @rbs return:
|
171
|
+
# @rbs return: wasmValue
|
169
172
|
def demote(to:)
|
170
173
|
raise EvalError, "unsupported operation"
|
171
174
|
|
172
175
|
end
|
173
176
|
|
174
177
|
# @rbs to: Symbol
|
175
|
-
# @rbs return:
|
178
|
+
# @rbs return: wasmValue
|
176
179
|
def promote(to:)
|
177
180
|
raise EvalError, "unsupported operation"
|
178
181
|
|
179
182
|
end
|
180
183
|
|
181
184
|
# @rbs to: Symbol
|
182
|
-
# @rbs return:
|
185
|
+
# @rbs return: wasmValue
|
183
186
|
def reinterpret(to:)
|
184
187
|
raise EvalError, "unsupported operation" if to != :f32
|
185
188
|
v = [value].pack("I!").unpack("f")[0]
|
@@ -252,7 +255,7 @@ module Wardite
|
|
252
255
|
end
|
253
256
|
|
254
257
|
# @rbs to: Symbol
|
255
|
-
# @rbs return:
|
258
|
+
# @rbs return: wasmValue
|
256
259
|
def wrap(to:)
|
257
260
|
if to != :i32
|
258
261
|
raise EvalError, "unsupported operation #{to}"
|
@@ -261,31 +264,31 @@ module Wardite
|
|
261
264
|
end
|
262
265
|
|
263
266
|
# @rbs to: Symbol
|
264
|
-
# @rbs return:
|
267
|
+
# @rbs return: wasmValue
|
265
268
|
def extend_s(to:)
|
266
269
|
raise EvalError, "unsupported operation"
|
267
270
|
end
|
268
271
|
|
269
272
|
# @rbs to: Symbol
|
270
|
-
# @rbs return:
|
273
|
+
# @rbs return: wasmValue
|
271
274
|
def extend_u(to:)
|
272
275
|
raise EvalError, "unsupported operation"
|
273
276
|
end
|
274
277
|
|
275
278
|
# @rbs to: Symbol
|
276
|
-
# @rbs return:
|
279
|
+
# @rbs return: wasmValue
|
277
280
|
def trunc_s(to:)
|
278
281
|
raise EvalError, "unsupported operation"
|
279
282
|
end
|
280
283
|
|
281
284
|
# @rbs to: Symbol
|
282
|
-
# @rbs return:
|
285
|
+
# @rbs return: wasmValue
|
283
286
|
def trunc_u(to:)
|
284
287
|
raise EvalError, "unsupported operation"
|
285
288
|
end
|
286
289
|
|
287
290
|
# @rbs to: Symbol
|
288
|
-
# @rbs return:
|
291
|
+
# @rbs return: wasmValue
|
289
292
|
def convert_s(to:)
|
290
293
|
case to
|
291
294
|
when :f32
|
@@ -298,7 +301,7 @@ module Wardite
|
|
298
301
|
end
|
299
302
|
|
300
303
|
# @rbs to: Symbol
|
301
|
-
# @rbs return:
|
304
|
+
# @rbs return: wasmValue
|
302
305
|
def convert_u(to:)
|
303
306
|
case to
|
304
307
|
when :f32
|
@@ -311,19 +314,19 @@ module Wardite
|
|
311
314
|
end
|
312
315
|
|
313
316
|
# @rbs to: Symbol
|
314
|
-
# @rbs return:
|
317
|
+
# @rbs return: wasmValue
|
315
318
|
def demote(to:)
|
316
319
|
raise EvalError, "unsupported operation"
|
317
320
|
end
|
318
321
|
|
319
322
|
# @rbs to: Symbol
|
320
|
-
# @rbs return:
|
323
|
+
# @rbs return: wasmValue
|
321
324
|
def promote(to:)
|
322
325
|
raise EvalError, "unsupported operation"
|
323
326
|
end
|
324
327
|
|
325
328
|
# @rbs to: Symbol
|
326
|
-
# @rbs return:
|
329
|
+
# @rbs return: wasmValue
|
327
330
|
def reinterpret(to:)
|
328
331
|
raise EvalError, "unsupported operation" if to != :f64
|
329
332
|
v = [value].pack("L!").unpack("d")[0]
|
@@ -373,19 +376,19 @@ module Wardite
|
|
373
376
|
end
|
374
377
|
|
375
378
|
# @rbs to: Symbol
|
376
|
-
# @rbs return:
|
379
|
+
# @rbs return: wasmValue
|
377
380
|
def wrap(to:)
|
378
381
|
raise EvalError, "unsupported operation"
|
379
382
|
end
|
380
383
|
|
381
384
|
# @rbs to: Symbol
|
382
|
-
# @rbs return:
|
385
|
+
# @rbs return: wasmValue
|
383
386
|
def extend_s(to:)
|
384
387
|
raise EvalError, "unsupported operation"
|
385
388
|
end
|
386
389
|
|
387
390
|
# @rbs to: Symbol
|
388
|
-
# @rbs return:
|
391
|
+
# @rbs return: wasmValue
|
389
392
|
def extend_u(to:)
|
390
393
|
raise EvalError, "unsupported operation"
|
391
394
|
end
|
@@ -393,7 +396,7 @@ module Wardite
|
|
393
396
|
# @todo need more testcase...
|
394
397
|
# @see https://webassembly.github.io/spec/core/exec/numerics.html#xref-exec-numerics-op-trunc-s-mathrm-trunc-mathsf-s-m-n-z
|
395
398
|
# @rbs to: Symbol
|
396
|
-
# @rbs return:
|
399
|
+
# @rbs return: wasmValue
|
397
400
|
def trunc_s(to:)
|
398
401
|
v = value.to_i
|
399
402
|
case to
|
@@ -424,7 +427,7 @@ module Wardite
|
|
424
427
|
|
425
428
|
# @see https://webassembly.github.io/spec/core/exec/numerics.html#xref-exec-numerics-op-trunc-u-mathrm-trunc-mathsf-u-m-n-z
|
426
429
|
# @rbs to: Symbol
|
427
|
-
# @rbs return:
|
430
|
+
# @rbs return: wasmValue
|
428
431
|
def trunc_u(to:)
|
429
432
|
v = value.to_i
|
430
433
|
if v < 0
|
@@ -443,32 +446,32 @@ module Wardite
|
|
443
446
|
end
|
444
447
|
|
445
448
|
# @rbs to: Symbol
|
446
|
-
# @rbs return:
|
449
|
+
# @rbs return: wasmValue
|
447
450
|
def convert_s(to:)
|
448
451
|
raise EvalError, "unsupported operation"
|
449
452
|
end
|
450
453
|
|
451
454
|
# @rbs to: Symbol
|
452
|
-
# @rbs return:
|
455
|
+
# @rbs return: wasmValue
|
453
456
|
def convert_u(to:)
|
454
457
|
raise EvalError, "unsupported operation"
|
455
458
|
end
|
456
459
|
|
457
460
|
# @rbs to: Symbol
|
458
|
-
# @rbs return:
|
461
|
+
# @rbs return: wasmValue
|
459
462
|
def demote(to:)
|
460
463
|
raise EvalError, "unsupported operation"
|
461
464
|
end
|
462
465
|
|
463
466
|
# @rbs to: Symbol
|
464
|
-
# @rbs return:
|
467
|
+
# @rbs return: wasmValue
|
465
468
|
def promote(to:)
|
466
469
|
raise EvalError, "unsupported operation" if to != :f64
|
467
470
|
F64(value)
|
468
471
|
end
|
469
472
|
|
470
473
|
# @rbs to: Symbol
|
471
|
-
# @rbs return:
|
474
|
+
# @rbs return: wasmValue
|
472
475
|
def reinterpret(to:)
|
473
476
|
raise EvalError, "unsupported operation" if to != :i32
|
474
477
|
v = [value].pack("f").unpack("I!")[0]
|
@@ -517,26 +520,26 @@ module Wardite
|
|
517
520
|
end
|
518
521
|
|
519
522
|
# @rbs to: Symbol
|
520
|
-
# @rbs return:
|
523
|
+
# @rbs return: wasmValue
|
521
524
|
def wrap(to:)
|
522
525
|
raise EvalError, "unsupported operation"
|
523
526
|
end
|
524
527
|
|
525
528
|
# @rbs to: Symbol
|
526
|
-
# @rbs return:
|
529
|
+
# @rbs return: wasmValue
|
527
530
|
def extend_s(to:)
|
528
531
|
raise EvalError, "unsupported operation"
|
529
532
|
end
|
530
533
|
|
531
534
|
# @rbs to: Symbol
|
532
|
-
# @rbs return:
|
535
|
+
# @rbs return: wasmValue
|
533
536
|
def extend_u(to:)
|
534
537
|
raise EvalError, "unsupported operation"
|
535
538
|
end
|
536
539
|
|
537
540
|
# @see the same as F32
|
538
541
|
# @rbs to: Symbol
|
539
|
-
# @rbs return:
|
542
|
+
# @rbs return: wasmValue
|
540
543
|
def trunc_s(to:)
|
541
544
|
v = value.to_i
|
542
545
|
case to
|
@@ -567,7 +570,7 @@ module Wardite
|
|
567
570
|
|
568
571
|
# @see the same as F32
|
569
572
|
# @rbs to: Symbol
|
570
|
-
# @rbs return:
|
573
|
+
# @rbs return: wasmValue
|
571
574
|
def trunc_u(to:)
|
572
575
|
v = value.to_i
|
573
576
|
if v < 0
|
@@ -586,33 +589,33 @@ module Wardite
|
|
586
589
|
end
|
587
590
|
|
588
591
|
# @rbs to: Symbol
|
589
|
-
# @rbs return:
|
592
|
+
# @rbs return: wasmValue
|
590
593
|
def convert_s(to:)
|
591
594
|
raise EvalError, "unsupported operation"
|
592
595
|
end
|
593
596
|
|
594
597
|
# @rbs to: Symbol
|
595
|
-
# @rbs return:
|
598
|
+
# @rbs return: wasmValue
|
596
599
|
def convert_u(to:)
|
597
600
|
raise EvalError, "unsupported operation"
|
598
601
|
end
|
599
602
|
|
600
603
|
# @todo no loss of digits...
|
601
604
|
# @rbs to: Symbol
|
602
|
-
# @rbs return:
|
605
|
+
# @rbs return: wasmValue
|
603
606
|
def demote(to:)
|
604
607
|
raise EvalError, "unsupported operation" if to != :f32
|
605
608
|
F32(value)
|
606
609
|
end
|
607
610
|
|
608
611
|
# @rbs to: Symbol
|
609
|
-
# @rbs return:
|
612
|
+
# @rbs return: wasmValue
|
610
613
|
def promote(to:)
|
611
614
|
raise EvalError, "unsupported operation"
|
612
615
|
end
|
613
616
|
|
614
617
|
# @rbs to: Symbol
|
615
|
-
# @rbs return:
|
618
|
+
# @rbs return: wasmValue
|
616
619
|
def reinterpret(to:)
|
617
620
|
raise EvalError, "unsupported operation" if to != :i64
|
618
621
|
v = [value].pack("d").unpack("L!")[0]
|
data/lib/wardite/version.rb
CHANGED