wardite 0.4.1 → 0.4.3
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|