wag 0.1.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.
Files changed (241) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.gitlab-ci.yml +15 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +32 -0
  6. data/.travis.yml +6 -0
  7. data/Gemfile +13 -0
  8. data/Gemfile.lock +66 -0
  9. data/LICENSE.txt +40 -0
  10. data/README.md +170 -0
  11. data/Rakefile +8 -0
  12. data/bin/console +15 -0
  13. data/bin/setup +8 -0
  14. data/lib/wag.rb +42 -0
  15. data/lib/wag/data.rb +18 -0
  16. data/lib/wag/element.rb +18 -0
  17. data/lib/wag/encodable.rb +23 -0
  18. data/lib/wag/export.rb +39 -0
  19. data/lib/wag/f32_instructions.rb +21 -0
  20. data/lib/wag/f64_instructions.rb +21 -0
  21. data/lib/wag/function.rb +33 -0
  22. data/lib/wag/function_type.rb +16 -0
  23. data/lib/wag/global.rb +18 -0
  24. data/lib/wag/global_instructions.rb +19 -0
  25. data/lib/wag/i32_instructions.rb +22 -0
  26. data/lib/wag/i64_instructions.rb +23 -0
  27. data/lib/wag/import.rb +42 -0
  28. data/lib/wag/indices.rb +14 -0
  29. data/lib/wag/indices/base.rb +16 -0
  30. data/lib/wag/indices/func.rb +8 -0
  31. data/lib/wag/indices/global.rb +8 -0
  32. data/lib/wag/indices/label.rb +8 -0
  33. data/lib/wag/indices/local.rb +8 -0
  34. data/lib/wag/indices/mem.rb +8 -0
  35. data/lib/wag/indices/table.rb +8 -0
  36. data/lib/wag/indices/type.rb +8 -0
  37. data/lib/wag/inflector.rb +13 -0
  38. data/lib/wag/instructable.rb +65 -0
  39. data/lib/wag/instruction.rb +193 -0
  40. data/lib/wag/instructions/base.rb +24 -0
  41. data/lib/wag/instructions/block.rb +21 -0
  42. data/lib/wag/instructions/br.rb +18 -0
  43. data/lib/wag/instructions/br_if.rb +18 -0
  44. data/lib/wag/instructions/br_table.rb +18 -0
  45. data/lib/wag/instructions/call.rb +18 -0
  46. data/lib/wag/instructions/call_indirect.rb +18 -0
  47. data/lib/wag/instructions/drop.rb +8 -0
  48. data/lib/wag/instructions/else.rb +9 -0
  49. data/lib/wag/instructions/end.rb +8 -0
  50. data/lib/wag/instructions/f32/abs.rb +11 -0
  51. data/lib/wag/instructions/f32/add.rb +11 -0
  52. data/lib/wag/instructions/f32/base.rb +13 -0
  53. data/lib/wag/instructions/f32/ceil.rb +11 -0
  54. data/lib/wag/instructions/f32/const.rb +20 -0
  55. data/lib/wag/instructions/f32/convert_i32_s.rb +11 -0
  56. data/lib/wag/instructions/f32/convert_i32_u.rb +11 -0
  57. data/lib/wag/instructions/f32/convert_i64_s.rb +11 -0
  58. data/lib/wag/instructions/f32/convert_i64_u.rb +11 -0
  59. data/lib/wag/instructions/f32/copysign.rb +11 -0
  60. data/lib/wag/instructions/f32/demote_f64.rb +11 -0
  61. data/lib/wag/instructions/f32/div.rb +11 -0
  62. data/lib/wag/instructions/f32/eq.rb +11 -0
  63. data/lib/wag/instructions/f32/floor.rb +11 -0
  64. data/lib/wag/instructions/f32/ge.rb +11 -0
  65. data/lib/wag/instructions/f32/gt.rb +11 -0
  66. data/lib/wag/instructions/f32/le.rb +11 -0
  67. data/lib/wag/instructions/f32/load.rb +11 -0
  68. data/lib/wag/instructions/f32/lt.rb +11 -0
  69. data/lib/wag/instructions/f32/max.rb +11 -0
  70. data/lib/wag/instructions/f32/min.rb +11 -0
  71. data/lib/wag/instructions/f32/mul.rb +11 -0
  72. data/lib/wag/instructions/f32/ne.rb +11 -0
  73. data/lib/wag/instructions/f32/nearest.rb +11 -0
  74. data/lib/wag/instructions/f32/neg.rb +11 -0
  75. data/lib/wag/instructions/f32/reinterpret_i32.rb +11 -0
  76. data/lib/wag/instructions/f32/sqrt.rb +11 -0
  77. data/lib/wag/instructions/f32/store.rb +11 -0
  78. data/lib/wag/instructions/f32/sub.rb +11 -0
  79. data/lib/wag/instructions/f32/trunc.rb +11 -0
  80. data/lib/wag/instructions/f64/abs.rb +11 -0
  81. data/lib/wag/instructions/f64/add.rb +11 -0
  82. data/lib/wag/instructions/f64/base.rb +13 -0
  83. data/lib/wag/instructions/f64/ceil.rb +11 -0
  84. data/lib/wag/instructions/f64/const.rb +20 -0
  85. data/lib/wag/instructions/f64/convert_i32_s.rb +11 -0
  86. data/lib/wag/instructions/f64/convert_i32_u.rb +11 -0
  87. data/lib/wag/instructions/f64/convert_i64_s.rb +11 -0
  88. data/lib/wag/instructions/f64/convert_i64_u.rb +11 -0
  89. data/lib/wag/instructions/f64/copysign.rb +11 -0
  90. data/lib/wag/instructions/f64/div.rb +11 -0
  91. data/lib/wag/instructions/f64/eq.rb +11 -0
  92. data/lib/wag/instructions/f64/floor.rb +11 -0
  93. data/lib/wag/instructions/f64/ge.rb +11 -0
  94. data/lib/wag/instructions/f64/gt.rb +11 -0
  95. data/lib/wag/instructions/f64/le.rb +11 -0
  96. data/lib/wag/instructions/f64/load.rb +11 -0
  97. data/lib/wag/instructions/f64/lt.rb +11 -0
  98. data/lib/wag/instructions/f64/max.rb +11 -0
  99. data/lib/wag/instructions/f64/min.rb +11 -0
  100. data/lib/wag/instructions/f64/mul.rb +11 -0
  101. data/lib/wag/instructions/f64/ne.rb +11 -0
  102. data/lib/wag/instructions/f64/nearest.rb +11 -0
  103. data/lib/wag/instructions/f64/neg.rb +11 -0
  104. data/lib/wag/instructions/f64/promote_f32.rb +11 -0
  105. data/lib/wag/instructions/f64/reinterpret_i64.rb +11 -0
  106. data/lib/wag/instructions/f64/sqrt.rb +11 -0
  107. data/lib/wag/instructions/f64/store.rb +11 -0
  108. data/lib/wag/instructions/f64/sub.rb +11 -0
  109. data/lib/wag/instructions/f64/trunc.rb +11 -0
  110. data/lib/wag/instructions/global/base.rb +13 -0
  111. data/lib/wag/instructions/global/get.rb +20 -0
  112. data/lib/wag/instructions/global/set.rb +20 -0
  113. data/lib/wag/instructions/i32/add.rb +11 -0
  114. data/lib/wag/instructions/i32/and.rb +11 -0
  115. data/lib/wag/instructions/i32/base.rb +13 -0
  116. data/lib/wag/instructions/i32/clz.rb +11 -0
  117. data/lib/wag/instructions/i32/const.rb +20 -0
  118. data/lib/wag/instructions/i32/ctz.rb +11 -0
  119. data/lib/wag/instructions/i32/div_s.rb +11 -0
  120. data/lib/wag/instructions/i32/div_u.rb +11 -0
  121. data/lib/wag/instructions/i32/eq.rb +11 -0
  122. data/lib/wag/instructions/i32/eqz.rb +11 -0
  123. data/lib/wag/instructions/i32/ge_s.rb +11 -0
  124. data/lib/wag/instructions/i32/ge_u.rb +11 -0
  125. data/lib/wag/instructions/i32/gt_s.rb +11 -0
  126. data/lib/wag/instructions/i32/gt_u.rb +11 -0
  127. data/lib/wag/instructions/i32/le_s.rb +11 -0
  128. data/lib/wag/instructions/i32/le_u.rb +11 -0
  129. data/lib/wag/instructions/i32/load.rb +11 -0
  130. data/lib/wag/instructions/i32/load16_s.rb +11 -0
  131. data/lib/wag/instructions/i32/load16_u.rb +11 -0
  132. data/lib/wag/instructions/i32/load8_s.rb +11 -0
  133. data/lib/wag/instructions/i32/load8_u.rb +11 -0
  134. data/lib/wag/instructions/i32/lt_s.rb +11 -0
  135. data/lib/wag/instructions/i32/lt_u.rb +11 -0
  136. data/lib/wag/instructions/i32/mul.rb +11 -0
  137. data/lib/wag/instructions/i32/ne.rb +11 -0
  138. data/lib/wag/instructions/i32/or.rb +11 -0
  139. data/lib/wag/instructions/i32/popcnt.rb +11 -0
  140. data/lib/wag/instructions/i32/reinterpret_f32.rb +11 -0
  141. data/lib/wag/instructions/i32/rem_s.rb +11 -0
  142. data/lib/wag/instructions/i32/rem_u.rb +11 -0
  143. data/lib/wag/instructions/i32/rotl.rb +11 -0
  144. data/lib/wag/instructions/i32/rotr.rb +11 -0
  145. data/lib/wag/instructions/i32/shl.rb +11 -0
  146. data/lib/wag/instructions/i32/shr_s.rb +11 -0
  147. data/lib/wag/instructions/i32/shr_u.rb +11 -0
  148. data/lib/wag/instructions/i32/store.rb +11 -0
  149. data/lib/wag/instructions/i32/store16.rb +11 -0
  150. data/lib/wag/instructions/i32/store8.rb +11 -0
  151. data/lib/wag/instructions/i32/sub.rb +11 -0
  152. data/lib/wag/instructions/i32/trunc_f32_s.rb +11 -0
  153. data/lib/wag/instructions/i32/trunc_f32_u.rb +11 -0
  154. data/lib/wag/instructions/i32/trunc_f64_s.rb +11 -0
  155. data/lib/wag/instructions/i32/trunc_f64_u.rb +11 -0
  156. data/lib/wag/instructions/i32/wrap_i64.rb +11 -0
  157. data/lib/wag/instructions/i32/xor.rb +11 -0
  158. data/lib/wag/instructions/i64/add.rb +11 -0
  159. data/lib/wag/instructions/i64/and.rb +11 -0
  160. data/lib/wag/instructions/i64/base.rb +13 -0
  161. data/lib/wag/instructions/i64/clz.rb +11 -0
  162. data/lib/wag/instructions/i64/const.rb +20 -0
  163. data/lib/wag/instructions/i64/ctz.rb +11 -0
  164. data/lib/wag/instructions/i64/div_s.rb +11 -0
  165. data/lib/wag/instructions/i64/div_u.rb +11 -0
  166. data/lib/wag/instructions/i64/eq.rb +11 -0
  167. data/lib/wag/instructions/i64/eqz.rb +11 -0
  168. data/lib/wag/instructions/i64/extend_i32_s.rb +11 -0
  169. data/lib/wag/instructions/i64/extend_i32_u.rb +11 -0
  170. data/lib/wag/instructions/i64/ge_s.rb +11 -0
  171. data/lib/wag/instructions/i64/ge_u.rb +11 -0
  172. data/lib/wag/instructions/i64/gt_s.rb +11 -0
  173. data/lib/wag/instructions/i64/gt_u.rb +11 -0
  174. data/lib/wag/instructions/i64/le_s.rb +11 -0
  175. data/lib/wag/instructions/i64/le_u.rb +11 -0
  176. data/lib/wag/instructions/i64/load.rb +11 -0
  177. data/lib/wag/instructions/i64/load16_s.rb +11 -0
  178. data/lib/wag/instructions/i64/load16_u.rb +11 -0
  179. data/lib/wag/instructions/i64/load32_s.rb +11 -0
  180. data/lib/wag/instructions/i64/load32_u.rb +11 -0
  181. data/lib/wag/instructions/i64/load8_s.rb +11 -0
  182. data/lib/wag/instructions/i64/load8_u.rb +11 -0
  183. data/lib/wag/instructions/i64/lt_s.rb +11 -0
  184. data/lib/wag/instructions/i64/lt_u.rb +11 -0
  185. data/lib/wag/instructions/i64/mul.rb +11 -0
  186. data/lib/wag/instructions/i64/ne.rb +11 -0
  187. data/lib/wag/instructions/i64/or.rb +11 -0
  188. data/lib/wag/instructions/i64/popcnt.rb +11 -0
  189. data/lib/wag/instructions/i64/reinterpret_f64.rb +11 -0
  190. data/lib/wag/instructions/i64/rem_s.rb +11 -0
  191. data/lib/wag/instructions/i64/rem_u.rb +11 -0
  192. data/lib/wag/instructions/i64/rotl.rb +11 -0
  193. data/lib/wag/instructions/i64/rotr.rb +11 -0
  194. data/lib/wag/instructions/i64/shl.rb +11 -0
  195. data/lib/wag/instructions/i64/shr_s.rb +11 -0
  196. data/lib/wag/instructions/i64/shr_u.rb +11 -0
  197. data/lib/wag/instructions/i64/store.rb +11 -0
  198. data/lib/wag/instructions/i64/store16.rb +11 -0
  199. data/lib/wag/instructions/i64/store32.rb +11 -0
  200. data/lib/wag/instructions/i64/store8.rb +11 -0
  201. data/lib/wag/instructions/i64/sub.rb +11 -0
  202. data/lib/wag/instructions/i64/trunc_f32_s.rb +11 -0
  203. data/lib/wag/instructions/i64/trunc_f32_u.rb +11 -0
  204. data/lib/wag/instructions/i64/trunc_f64_s.rb +11 -0
  205. data/lib/wag/instructions/i64/trunc_f64_u.rb +11 -0
  206. data/lib/wag/instructions/i64/xor.rb +11 -0
  207. data/lib/wag/instructions/if.rb +26 -0
  208. data/lib/wag/instructions/local/base.rb +13 -0
  209. data/lib/wag/instructions/local/get.rb +20 -0
  210. data/lib/wag/instructions/local/set.rb +20 -0
  211. data/lib/wag/instructions/local/tee.rb +20 -0
  212. data/lib/wag/instructions/loop.rb +9 -0
  213. data/lib/wag/instructions/memory/base.rb +13 -0
  214. data/lib/wag/instructions/memory/grow.rb +11 -0
  215. data/lib/wag/instructions/memory/size.rb +11 -0
  216. data/lib/wag/instructions/nop.rb +8 -0
  217. data/lib/wag/instructions/return.rb +9 -0
  218. data/lib/wag/instructions/select.rb +9 -0
  219. data/lib/wag/instructions/unreachable.rb +8 -0
  220. data/lib/wag/label.rb +32 -0
  221. data/lib/wag/local.rb +19 -0
  222. data/lib/wag/local_instructions.rb +19 -0
  223. data/lib/wag/memory.rb +26 -0
  224. data/lib/wag/memory_instructions.rb +19 -0
  225. data/lib/wag/module.rb +100 -0
  226. data/lib/wag/param.rb +20 -0
  227. data/lib/wag/result.rb +17 -0
  228. data/lib/wag/table.rb +17 -0
  229. data/lib/wag/then.rb +13 -0
  230. data/lib/wag/type.rb +19 -0
  231. data/lib/wag/types/base.rb +16 -0
  232. data/lib/wag/types/f32.rb +8 -0
  233. data/lib/wag/types/f64.rb +8 -0
  234. data/lib/wag/types/i32.rb +8 -0
  235. data/lib/wag/types/i64.rb +8 -0
  236. data/lib/wag/version.rb +5 -0
  237. data/lib/wag/wabt.rb +45 -0
  238. data/lib/wag/wasm.rb +22 -0
  239. data/lib/wag/wat.rb +18 -0
  240. data/wag.gemspec +35 -0
  241. metadata +299 -0
data/lib/wag/data.rb ADDED
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WAG
4
+ class Data
5
+ include WAG::Encodable
6
+
7
+ attr_reader :offset, :value
8
+
9
+ def initialize(offset, value)
10
+ @offset = offset.to_i
11
+ @value = value
12
+ end
13
+
14
+ def to_sexpr
15
+ [:data, [:"i32.const", offset], value]
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WAG
4
+ class Element
5
+ include WAG::Encodable
6
+
7
+ attr_reader :table_id, :labels
8
+
9
+ def initialize(table_id, *labels)
10
+ @table_id = table_id.to_i
11
+ @labels = labels.map { |l| WAG::Label.from(l) }
12
+ end
13
+
14
+ def to_sexpr
15
+ [:elem, [:"i32.const", table_id]].concat(labels.map(&:to_sexpr))
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WAG
4
+ # A simple mixin which formats s-expressions as WAT.
5
+ module Encodable
6
+ def to_wat
7
+ WAG::WAT.new(wat_encode(to_sexpr))
8
+ end
9
+
10
+ def to_wasm
11
+ to_wat.to_wasm
12
+ end
13
+
14
+ private
15
+
16
+ def wat_encode(data)
17
+ return "(#{data.map { |e| wat_encode(e) }.join(' ')})" if data.is_a?(Enumerable)
18
+ return data.inspect if data.is_a?(String)
19
+
20
+ data.to_s
21
+ end
22
+ end
23
+ end
data/lib/wag/export.rb ADDED
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WAG
4
+ class Export
5
+ include WAG::Encodable
6
+
7
+ attr_reader :name, :desc
8
+
9
+ def initialize(name)
10
+ @name = name
11
+ end
12
+
13
+ def func(label, &block)
14
+ @desc = Function.new(label)
15
+ @desc.instance_exec(&block) if block
16
+ @desc
17
+ end
18
+
19
+ def global(label, type)
20
+ @desc = Global.new(label, type)
21
+ end
22
+
23
+ def memory(number, min = nil, max = nil, &block)
24
+ @desc = Memory.new(number, min, max)
25
+ @desc.instance_exec(&block) if block
26
+ @desc
27
+ end
28
+
29
+ def table(number, type = :anyfunc, &block)
30
+ @desc = Table.new(number, type)
31
+ @desc.instance_exec(&block) if block
32
+ @desc
33
+ end
34
+
35
+ def to_sexpr
36
+ [:export, name, desc.to_sexpr]
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WAG
4
+ class F32Instructions
5
+ def initialize(instructions)
6
+ @instructions = instructions
7
+ end
8
+
9
+ %i[load store const eq ne lt gt le ge abs neg ceil floor trunc nearest
10
+ sqrt add sub mul div min max copysign convert_i32_s convert_i32_u
11
+ convert_i64_s convert_i64_u reinterpret_i32].each do |instruction_name|
12
+ camelised_name = "F32#{WAG::Inflector.inflector.camelize(instruction_name)}"
13
+ define_method(instruction_name) do |*args, &block|
14
+ instruction = WAG::Instruction.const_get(camelised_name).new(*args)
15
+ @instructions << instruction
16
+ instruction.instance_exec(&block) if block
17
+ instruction
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WAG
4
+ class F64Instructions
5
+ def initialize(instructions)
6
+ @instructions = instructions
7
+ end
8
+
9
+ %i[load store const eq ne lt gt le ge abs neg ceil floor trunc nearest sqrt
10
+ add sub mul div min max copysign convert_i32_s convert_i32_u
11
+ convert_i64_s convert_i64_u promote_f32 reinterpret_i64].each do |instruction_name|
12
+ camelised_name = "F64#{WAG::Inflector.inflector.camelize(instruction_name)}"
13
+ define_method(instruction_name) do |*args, &block|
14
+ instruction = WAG::Instruction.const_get(camelised_name).new(*args)
15
+ @instructions << instruction
16
+ instruction.instance_exec(&block) if block
17
+ instruction
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WAG
4
+ class Function
5
+ include WAG::Encodable
6
+ prepend WAG::Instructable
7
+
8
+ attr_reader :label, :params
9
+
10
+ def initialize(label = nil)
11
+ @label = WAG::Label.from(label) if label
12
+ @params = []
13
+ end
14
+
15
+ def param(label = nil, type)
16
+ @params.push(WAG::Param.new(type, label))
17
+ end
18
+
19
+ def result(*types)
20
+ return @result if types.empty?
21
+
22
+ @result = WAG::Result.new(*types)
23
+ end
24
+
25
+ def to_sexpr
26
+ [:func].tap do |func|
27
+ func.push(@label.to_sexpr) if @label
28
+ func.concat(@params.map(&:to_sexpr)) unless @params.empty?
29
+ func.push(@result.to_sexpr) if @result
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WAG
4
+ class FunctionType < Function
5
+ def to_sexpr
6
+ [:type].tap do |type|
7
+ type.push(@label.to_sexpr) if @label
8
+ [:func].tap do |func|
9
+ func.concat(@params.map(&:to_sexpr)) unless @params.empty?
10
+ func.push(@result.to_sexpr) if @result
11
+ type.push(func)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
data/lib/wag/global.rb ADDED
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WAG
4
+ class Global
5
+ include WAG::Encodable
6
+
7
+ attr_reader :label, :type
8
+
9
+ def initialize(label, type)
10
+ @label = WAG::Label.from(label)
11
+ @type = WAG::Type.from(type)
12
+ end
13
+
14
+ def to_sexpr
15
+ [:global, label.to_sexpr, type.to_sexpr]
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WAG
4
+ class GlobalInstructions
5
+ def initialize(instructions)
6
+ @instructions = instructions
7
+ end
8
+
9
+ %i[get set].each do |instruction_name|
10
+ camelised_name = "Global::#{WAG::Inflector.inflector.camelize(instruction_name)}"
11
+ define_method(instruction_name) do |*args, &block|
12
+ instruction = WAG::Instruction.const_get(camelised_name).new(*args)
13
+ @instructions << instruction
14
+ instruction.instance_exec(&block) if block
15
+ instruction
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WAG
4
+ class I32Instructions
5
+ def initialize(instructions)
6
+ @instructions = instructions
7
+ end
8
+
9
+ %i[load load8_s load8_u load16_s load16_u store store8 store16 const eqz eq
10
+ ne lt_s lt_u gt_s gt_u le_s le_u ge_s ge_u clz ctz popcnt add sub mul
11
+ div_s div_u rem_s rem_u and or xor shl shr_s shr_u rotl rotr trunc_f32_s
12
+ trunc_f32_u trunc_f64_s trunc_f64_u reinterpret_f32].each do |instruction_name|
13
+ camelised_name = "I32::#{WAG::Inflector.inflector.camelize(instruction_name)}"
14
+ define_method(instruction_name) do |*args, &block|
15
+ instruction = WAG::Instruction.const_get(camelised_name).new(*args)
16
+ @instructions << instruction
17
+ instruction.instance_exec(&block) if block
18
+ instruction
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WAG
4
+ class I64Instructions
5
+ def initialize(instructions)
6
+ @instructions = instructions
7
+ end
8
+
9
+ %i[load load8_s load8_u load16_s load16_u load32_s load32_u store store8
10
+ store16 store32 const eqz eq ne lt_s lt_u gt_s gt_u le_s le_u ge_s ge_u
11
+ clz ctz popcnt add sub mul div_s div_u rem_s rem_u and or xor shl shr_s
12
+ shr_u rotl rotr extend_i32_s extend_i32_u trunc_f32_s trunc_f32_u
13
+ trunc_f64_s trunc_f64_u reinterpret_f64].each do |instruction_name|
14
+ camelised_name = "I64::#{WAG::Inflector.inflector.camelize(instruction_name)}"
15
+ define_method(instruction_name) do |*args, &block|
16
+ instruction = WAG::Instruction.const_get(camelised_name).new(*args)
17
+ @instructions << instruction
18
+ instruction.instance_exec(&block) if block
19
+ instruction
20
+ end
21
+ end
22
+ end
23
+ end
data/lib/wag/import.rb ADDED
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WAG
4
+ class Import
5
+ include WAG::Encodable
6
+
7
+ attr_reader :module_name, :name, :desc
8
+
9
+ def initialize(module_name, name)
10
+ @module_name = module_name
11
+ @name = name
12
+ end
13
+
14
+ def func(label, &block)
15
+ @desc = Function.new(label)
16
+ @desc.instance_exec(&block) if block
17
+ @desc
18
+ end
19
+
20
+ def global(label, type, &block)
21
+ @desc = Global.new(label, type)
22
+ @desc.instance_exec(&block) if block
23
+ @desc
24
+ end
25
+
26
+ def memory(number, min = nil, max = nil, &block)
27
+ @desc = Memory.new(number, min, max)
28
+ @desc.instance_exec(&block) if block
29
+ @desc
30
+ end
31
+
32
+ def table(number, type = :anyfunc, &block)
33
+ @desc = Table.new(number, type)
34
+ @desc.instance_exec(&block) if block
35
+ @desc
36
+ end
37
+
38
+ def to_sexpr
39
+ [:import, module_name, name, desc.to_sexpr]
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WAG
4
+ module Indices
5
+ require 'wag/indices/base'
6
+ require 'wag/indices/func'
7
+ require 'wag/indices/global'
8
+ require 'wag/indices/label'
9
+ require 'wag/indices/local'
10
+ require 'wag/indices/mem'
11
+ require 'wag/indices/table'
12
+ require 'wag/indices/type'
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WAG
4
+ module Indices
5
+ class Base
6
+ RANGE = [0..0xFFFFFFFF].freeze
7
+ attr_reader :value
8
+
9
+ def initialize(value)
10
+ raise "Index 0x#{value.to_s(16)} does not fit in an i32" unless RANGE.cover?(value)
11
+
12
+ @value = value
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WAG
4
+ module Indices
5
+ class Func < Base
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WAG
4
+ module Indices
5
+ class Global < Base
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WAG
4
+ module Indices
5
+ class Label < Base
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WAG
4
+ module Indices
5
+ class Local < Base
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WAG
4
+ module Indices
5
+ class Mem < Base
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WAG
4
+ module Indices
5
+ class Table < Base
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WAG
4
+ module Indices
5
+ class Type < Base
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-inflector'
4
+
5
+ module WAG
6
+ module Inflector
7
+ module_function
8
+
9
+ def inflector
10
+ @inflector ||= Dry::Inflector.new
11
+ end
12
+ end
13
+ end