wardite 0.4.1 → 0.4.3
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/README.md +1 -1
- data/lib/wardite/convert.generated.rb +5 -5
- data/lib/wardite/load.rb +2 -2
- data/lib/wardite/value.rb +16 -0
- data/lib/wardite/version.rb +1 -1
- data/lib/wardite.rb +67 -20
- data/scripts/gen_conv.rb +1 -1
- data/sig/generated/wardite/load.rbs +1 -1
- data/sig/generated/wardite/value.rbs +8 -0
- data/sig/generated/wardite.rbs +13 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f1960efc493205587db2fbb0e21504247d120831417b081dc169c0b7c10fccaf
|
4
|
+
data.tar.gz: cbdbf5e122fe118ccee7a615b184be2032b6000a043b3642a9b5336f6b0fbe19
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 207a1cd23ab5f25fdf9dd421ab42c70528be1987e57f41d656f47e205ee78ba321b9553364f988f6f039f87a77878e040075e690b00b97ace0bf91e35c07431f
|
7
|
+
data.tar.gz: 944b8112be80c9c3b78dd7cdec01ac3c72f7e4e077196a315bfaa14ffeb4dfa6cdb868570ae0bc55fb4f07da858f968807fee8bb50d5846fa763dd7b82359f98
|
data/README.md
CHANGED
@@ -58,7 +58,7 @@ module Wardite
|
|
58
58
|
runtime.stack.push(to)
|
59
59
|
|
60
60
|
|
61
|
-
when :
|
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 :
|
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 :
|
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 :
|
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 :
|
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)
|
data/lib/wardite/load.rb
CHANGED
@@ -193,7 +193,7 @@ module Wardite
|
|
193
193
|
|
194
194
|
attr_accessor :kind #: Integer
|
195
195
|
|
196
|
-
attr_accessor :
|
196
|
+
attr_accessor :index #: Integer
|
197
197
|
end
|
198
198
|
|
199
199
|
attr_accessor :exports #: Hash[String, ExportDesc]
|
@@ -840,7 +840,7 @@ module Wardite
|
|
840
840
|
dest.add_desc do |desc|
|
841
841
|
desc.name = name
|
842
842
|
desc.kind = kind
|
843
|
-
desc.
|
843
|
+
desc.index = index
|
844
844
|
end
|
845
845
|
end
|
846
846
|
|
data/lib/wardite/value.rb
CHANGED
@@ -237,6 +237,10 @@ module Wardite
|
|
237
237
|
def inspect
|
238
238
|
"I32(#{value_s})"
|
239
239
|
end
|
240
|
+
|
241
|
+
def ==(other)
|
242
|
+
return self.class == other.class && self.value == other.value
|
243
|
+
end
|
240
244
|
end
|
241
245
|
|
242
246
|
class I64
|
@@ -400,6 +404,10 @@ module Wardite
|
|
400
404
|
def inspect
|
401
405
|
"I64(#{@value})"
|
402
406
|
end
|
407
|
+
|
408
|
+
def ==(other)
|
409
|
+
return self.class == other.class && self.value == other.value
|
410
|
+
end
|
403
411
|
end
|
404
412
|
|
405
413
|
class F32
|
@@ -601,6 +609,10 @@ module Wardite
|
|
601
609
|
def inspect
|
602
610
|
"F32(#{@value})"
|
603
611
|
end
|
612
|
+
|
613
|
+
def ==(other)
|
614
|
+
return self.class == other.class && self.value == other.value
|
615
|
+
end
|
604
616
|
end
|
605
617
|
|
606
618
|
class F64
|
@@ -800,5 +812,9 @@ module Wardite
|
|
800
812
|
def inspect
|
801
813
|
"F64(#{@value})"
|
802
814
|
end
|
815
|
+
|
816
|
+
def ==(other)
|
817
|
+
return self.class == other.class && self.value == other.value
|
818
|
+
end
|
803
819
|
end
|
804
820
|
end
|
data/lib/wardite/version.rb
CHANGED
data/lib/wardite.rb
CHANGED
@@ -258,10 +258,13 @@ module Wardite
|
|
258
258
|
if !callable?(name)
|
259
259
|
raise ::NoMethodError, "function #{name} not found"
|
260
260
|
end
|
261
|
-
kind, fn = @instance.exports[name.to_s]
|
261
|
+
kind, fn = @instance.exports.mappings[name.to_s]
|
262
262
|
if kind != 0
|
263
263
|
raise ::NoMethodError, "#{name} is not a function"
|
264
264
|
end
|
265
|
+
if !fn.is_a?(WasmFunction) && !fn.is_a?(ExternalFunction)
|
266
|
+
raise ::NoMethodError, "#{name} is not a function"
|
267
|
+
end
|
265
268
|
if fn.callsig.size != args.size
|
266
269
|
raise ArgumentError, "unmatch arg size"
|
267
270
|
end
|
@@ -310,20 +313,28 @@ module Wardite
|
|
310
313
|
end
|
311
314
|
self.stack = drained_stack(local_start)
|
312
315
|
|
313
|
-
wasm_function.
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
316
|
+
wasm_function.locals_count.each_with_index do |count, i|
|
317
|
+
typ = wasm_function.locals_type[i]
|
318
|
+
count.times do
|
319
|
+
case typ
|
320
|
+
when :i32, :u32
|
321
|
+
locals.push I32(0)
|
322
|
+
when :i64, :u64
|
323
|
+
locals.push I64(0)
|
324
|
+
when :f32
|
325
|
+
locals.push F32(0.0)
|
326
|
+
when :f64
|
327
|
+
locals.push F64(0.0)
|
328
|
+
else
|
329
|
+
$stderr.puts "warning: unknown type #{typ.inspect}. default to I32"
|
330
|
+
locals.push I32(0)
|
331
|
+
end
|
322
332
|
end
|
323
333
|
end
|
324
334
|
|
325
335
|
arity = wasm_function.retsig.size
|
326
336
|
frame = Frame.new(-1, stack.size, wasm_function.body, arity, locals)
|
337
|
+
frame.findex = wasm_function.findex
|
327
338
|
self.call_stack.push(frame)
|
328
339
|
end
|
329
340
|
|
@@ -593,7 +604,8 @@ module Wardite
|
|
593
604
|
end
|
594
605
|
local = frame.locals[idx]
|
595
606
|
if !local
|
596
|
-
|
607
|
+
# require "irb"; binding.irb
|
608
|
+
raise EvalError, "local not found, idx = #{idx}"
|
597
609
|
end
|
598
610
|
stack.push(local)
|
599
611
|
|
@@ -718,10 +730,12 @@ module Wardite
|
|
718
730
|
end
|
719
731
|
|
720
732
|
rescue => e
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
733
|
+
if ENV["DEBUG"]
|
734
|
+
require "pp"
|
735
|
+
$stderr.puts "instance:::\n#{self.instance.pretty_inspect}"
|
736
|
+
$stderr.puts "frame:::\n#{frame.pretty_inspect}"
|
737
|
+
$stderr.puts "stack:::\n#{stack.pretty_inspect}"
|
738
|
+
end
|
725
739
|
raise e
|
726
740
|
end
|
727
741
|
|
@@ -884,6 +898,8 @@ module Wardite
|
|
884
898
|
|
885
899
|
attr_accessor :locals #: Array[wasmValue]
|
886
900
|
|
901
|
+
attr_accessor :findex #: Integer
|
902
|
+
|
887
903
|
# @rbs pc: Integer
|
888
904
|
# @rbs sp: Integer
|
889
905
|
# @rbs body: Array[Op]
|
@@ -897,6 +913,8 @@ module Wardite
|
|
897
913
|
@arity = arity
|
898
914
|
@locals = locals
|
899
915
|
@labels = []
|
916
|
+
|
917
|
+
@findex = 0
|
900
918
|
end
|
901
919
|
end
|
902
920
|
|
@@ -970,6 +988,8 @@ module Wardite
|
|
970
988
|
retsig = type_section.defined_results[sigindex]
|
971
989
|
codes = code_section.func_codes[findex]
|
972
990
|
wasm_function = WasmFunction.new(callsig, retsig, codes)
|
991
|
+
idx = self.funcs.size
|
992
|
+
wasm_function.findex = idx
|
973
993
|
self.funcs << wasm_function
|
974
994
|
end
|
975
995
|
end
|
@@ -1204,8 +1224,11 @@ module Wardite
|
|
1204
1224
|
end
|
1205
1225
|
end
|
1206
1226
|
|
1227
|
+
# @rbs!
|
1228
|
+
# type exportHandle = WasmFunction | ExternalFunction | Table | Global | Memory
|
1229
|
+
|
1207
1230
|
class Exports
|
1208
|
-
attr_accessor :mappings #: Hash[String, [Integer,
|
1231
|
+
attr_accessor :mappings #: Hash[String, [Integer, exportHandle]]
|
1209
1232
|
|
1210
1233
|
# @rbs export_section: ExportSection
|
1211
1234
|
# @rbs store: Store
|
@@ -1213,15 +1236,36 @@ module Wardite
|
|
1213
1236
|
def initialize(export_section, store)
|
1214
1237
|
@mappings = {}
|
1215
1238
|
export_section.exports.each_pair do |name, desc|
|
1216
|
-
|
1217
|
-
|
1239
|
+
case desc.kind
|
1240
|
+
when 0x0
|
1241
|
+
@mappings[name] = [desc.kind, store.funcs[desc.index]]
|
1242
|
+
when 0x1
|
1243
|
+
@mappings[name] = [desc.kind, store.tables[desc.index]]
|
1244
|
+
when 0x2
|
1245
|
+
@mappings[name] = [desc.kind, store.memories[desc.index]]
|
1246
|
+
when 0x3
|
1247
|
+
@mappings[name] = [desc.kind, store.globals[desc.index]]
|
1248
|
+
else
|
1249
|
+
end
|
1218
1250
|
end
|
1219
1251
|
end
|
1220
1252
|
|
1221
1253
|
# @rbs name: String
|
1222
|
-
# @rbs return:
|
1254
|
+
# @rbs return: exportHandle|nil
|
1223
1255
|
def [](name)
|
1224
|
-
@mappings[name]
|
1256
|
+
@mappings[name]&.[](1)
|
1257
|
+
end
|
1258
|
+
|
1259
|
+
def respond_to?(name)
|
1260
|
+
!!self[name.to_s] || super
|
1261
|
+
end
|
1262
|
+
|
1263
|
+
def method_missing(name, *_args)
|
1264
|
+
if self[name.to_s]
|
1265
|
+
self[name.to_s]
|
1266
|
+
else
|
1267
|
+
super
|
1268
|
+
end
|
1225
1269
|
end
|
1226
1270
|
end
|
1227
1271
|
|
@@ -1233,6 +1277,8 @@ module Wardite
|
|
1233
1277
|
|
1234
1278
|
attr_accessor :code_body #: CodeSection::CodeBody
|
1235
1279
|
|
1280
|
+
attr_accessor :findex #: Integer
|
1281
|
+
|
1236
1282
|
# @rbs callsig: Array[Symbol]
|
1237
1283
|
# @rbs retsig: Array[Symbol]
|
1238
1284
|
# @rbs code_body: CodeSection::CodeBody
|
@@ -1242,6 +1288,7 @@ module Wardite
|
|
1242
1288
|
@retsig = retsig
|
1243
1289
|
|
1244
1290
|
@code_body = code_body
|
1291
|
+
@findex = 0 # for debug
|
1245
1292
|
end
|
1246
1293
|
|
1247
1294
|
# @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}
|
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)$/, "")
|
@@ -115,6 +115,8 @@ module Wardite
|
|
115
115
|
|
116
116
|
# I32#inspect shows signed value for convinience
|
117
117
|
def inspect: () -> untyped
|
118
|
+
|
119
|
+
def ==: (untyped other) -> untyped
|
118
120
|
end
|
119
121
|
|
120
122
|
class I64
|
@@ -196,6 +198,8 @@ module Wardite
|
|
196
198
|
|
197
199
|
# I64#inspect shows signed value
|
198
200
|
def inspect: () -> untyped
|
201
|
+
|
202
|
+
def ==: (untyped other) -> untyped
|
199
203
|
end
|
200
204
|
|
201
205
|
class F32
|
@@ -278,6 +282,8 @@ module Wardite
|
|
278
282
|
def trunc_sat_s: (to: Symbol) -> wasmValue
|
279
283
|
|
280
284
|
def inspect: () -> untyped
|
285
|
+
|
286
|
+
def ==: (untyped other) -> untyped
|
281
287
|
end
|
282
288
|
|
283
289
|
class F64
|
@@ -358,5 +364,7 @@ module Wardite
|
|
358
364
|
def trunc_sat_s: (to: Symbol) -> wasmValue
|
359
365
|
|
360
366
|
def inspect: () -> untyped
|
367
|
+
|
368
|
+
def ==: (untyped other) -> untyped
|
361
369
|
end
|
362
370
|
end
|
data/sig/generated/wardite.rbs
CHANGED
@@ -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]
|
@@ -313,8 +315,10 @@ module Wardite
|
|
313
315
|
def result_size: () -> Integer
|
314
316
|
end
|
315
317
|
|
318
|
+
type exportHandle = WasmFunction | ExternalFunction | Table | Global | Memory
|
319
|
+
|
316
320
|
class Exports
|
317
|
-
attr_accessor mappings: Hash[String, [ Integer,
|
321
|
+
attr_accessor mappings: Hash[String, [ Integer, exportHandle ]]
|
318
322
|
|
319
323
|
# @rbs export_section: ExportSection
|
320
324
|
# @rbs store: Store
|
@@ -322,8 +326,12 @@ module Wardite
|
|
322
326
|
def initialize: (ExportSection export_section, Store store) -> void
|
323
327
|
|
324
328
|
# @rbs name: String
|
325
|
-
# @rbs return:
|
326
|
-
def []: (String name) ->
|
329
|
+
# @rbs return: exportHandle|nil
|
330
|
+
def []: (String name) -> (exportHandle | nil)
|
331
|
+
|
332
|
+
def respond_to?: (untyped name) -> untyped
|
333
|
+
|
334
|
+
def method_missing: (untyped name, *untyped _args) -> untyped
|
327
335
|
end
|
328
336
|
|
329
337
|
# TODO: common interface btw. WasmFunction and ExternalFunction?
|
@@ -334,6 +342,8 @@ module Wardite
|
|
334
342
|
|
335
343
|
attr_accessor code_body: CodeSection::CodeBody
|
336
344
|
|
345
|
+
attr_accessor findex: Integer
|
346
|
+
|
337
347
|
# @rbs callsig: Array[Symbol]
|
338
348
|
# @rbs retsig: Array[Symbol]
|
339
349
|
# @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.
|
4
|
+
version: 0.4.3
|
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-
|
11
|
+
date: 2024-11-17 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A pure-ruby webassembly runtime
|
14
14
|
email:
|