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.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.gitlab-ci.yml +15 -0
- data/.rspec +3 -0
- data/.rubocop.yml +32 -0
- data/.travis.yml +6 -0
- data/Gemfile +13 -0
- data/Gemfile.lock +66 -0
- data/LICENSE.txt +40 -0
- data/README.md +170 -0
- data/Rakefile +8 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/lib/wag.rb +42 -0
- data/lib/wag/data.rb +18 -0
- data/lib/wag/element.rb +18 -0
- data/lib/wag/encodable.rb +23 -0
- data/lib/wag/export.rb +39 -0
- data/lib/wag/f32_instructions.rb +21 -0
- data/lib/wag/f64_instructions.rb +21 -0
- data/lib/wag/function.rb +33 -0
- data/lib/wag/function_type.rb +16 -0
- data/lib/wag/global.rb +18 -0
- data/lib/wag/global_instructions.rb +19 -0
- data/lib/wag/i32_instructions.rb +22 -0
- data/lib/wag/i64_instructions.rb +23 -0
- data/lib/wag/import.rb +42 -0
- data/lib/wag/indices.rb +14 -0
- data/lib/wag/indices/base.rb +16 -0
- data/lib/wag/indices/func.rb +8 -0
- data/lib/wag/indices/global.rb +8 -0
- data/lib/wag/indices/label.rb +8 -0
- data/lib/wag/indices/local.rb +8 -0
- data/lib/wag/indices/mem.rb +8 -0
- data/lib/wag/indices/table.rb +8 -0
- data/lib/wag/indices/type.rb +8 -0
- data/lib/wag/inflector.rb +13 -0
- data/lib/wag/instructable.rb +65 -0
- data/lib/wag/instruction.rb +193 -0
- data/lib/wag/instructions/base.rb +24 -0
- data/lib/wag/instructions/block.rb +21 -0
- data/lib/wag/instructions/br.rb +18 -0
- data/lib/wag/instructions/br_if.rb +18 -0
- data/lib/wag/instructions/br_table.rb +18 -0
- data/lib/wag/instructions/call.rb +18 -0
- data/lib/wag/instructions/call_indirect.rb +18 -0
- data/lib/wag/instructions/drop.rb +8 -0
- data/lib/wag/instructions/else.rb +9 -0
- data/lib/wag/instructions/end.rb +8 -0
- data/lib/wag/instructions/f32/abs.rb +11 -0
- data/lib/wag/instructions/f32/add.rb +11 -0
- data/lib/wag/instructions/f32/base.rb +13 -0
- data/lib/wag/instructions/f32/ceil.rb +11 -0
- data/lib/wag/instructions/f32/const.rb +20 -0
- data/lib/wag/instructions/f32/convert_i32_s.rb +11 -0
- data/lib/wag/instructions/f32/convert_i32_u.rb +11 -0
- data/lib/wag/instructions/f32/convert_i64_s.rb +11 -0
- data/lib/wag/instructions/f32/convert_i64_u.rb +11 -0
- data/lib/wag/instructions/f32/copysign.rb +11 -0
- data/lib/wag/instructions/f32/demote_f64.rb +11 -0
- data/lib/wag/instructions/f32/div.rb +11 -0
- data/lib/wag/instructions/f32/eq.rb +11 -0
- data/lib/wag/instructions/f32/floor.rb +11 -0
- data/lib/wag/instructions/f32/ge.rb +11 -0
- data/lib/wag/instructions/f32/gt.rb +11 -0
- data/lib/wag/instructions/f32/le.rb +11 -0
- data/lib/wag/instructions/f32/load.rb +11 -0
- data/lib/wag/instructions/f32/lt.rb +11 -0
- data/lib/wag/instructions/f32/max.rb +11 -0
- data/lib/wag/instructions/f32/min.rb +11 -0
- data/lib/wag/instructions/f32/mul.rb +11 -0
- data/lib/wag/instructions/f32/ne.rb +11 -0
- data/lib/wag/instructions/f32/nearest.rb +11 -0
- data/lib/wag/instructions/f32/neg.rb +11 -0
- data/lib/wag/instructions/f32/reinterpret_i32.rb +11 -0
- data/lib/wag/instructions/f32/sqrt.rb +11 -0
- data/lib/wag/instructions/f32/store.rb +11 -0
- data/lib/wag/instructions/f32/sub.rb +11 -0
- data/lib/wag/instructions/f32/trunc.rb +11 -0
- data/lib/wag/instructions/f64/abs.rb +11 -0
- data/lib/wag/instructions/f64/add.rb +11 -0
- data/lib/wag/instructions/f64/base.rb +13 -0
- data/lib/wag/instructions/f64/ceil.rb +11 -0
- data/lib/wag/instructions/f64/const.rb +20 -0
- data/lib/wag/instructions/f64/convert_i32_s.rb +11 -0
- data/lib/wag/instructions/f64/convert_i32_u.rb +11 -0
- data/lib/wag/instructions/f64/convert_i64_s.rb +11 -0
- data/lib/wag/instructions/f64/convert_i64_u.rb +11 -0
- data/lib/wag/instructions/f64/copysign.rb +11 -0
- data/lib/wag/instructions/f64/div.rb +11 -0
- data/lib/wag/instructions/f64/eq.rb +11 -0
- data/lib/wag/instructions/f64/floor.rb +11 -0
- data/lib/wag/instructions/f64/ge.rb +11 -0
- data/lib/wag/instructions/f64/gt.rb +11 -0
- data/lib/wag/instructions/f64/le.rb +11 -0
- data/lib/wag/instructions/f64/load.rb +11 -0
- data/lib/wag/instructions/f64/lt.rb +11 -0
- data/lib/wag/instructions/f64/max.rb +11 -0
- data/lib/wag/instructions/f64/min.rb +11 -0
- data/lib/wag/instructions/f64/mul.rb +11 -0
- data/lib/wag/instructions/f64/ne.rb +11 -0
- data/lib/wag/instructions/f64/nearest.rb +11 -0
- data/lib/wag/instructions/f64/neg.rb +11 -0
- data/lib/wag/instructions/f64/promote_f32.rb +11 -0
- data/lib/wag/instructions/f64/reinterpret_i64.rb +11 -0
- data/lib/wag/instructions/f64/sqrt.rb +11 -0
- data/lib/wag/instructions/f64/store.rb +11 -0
- data/lib/wag/instructions/f64/sub.rb +11 -0
- data/lib/wag/instructions/f64/trunc.rb +11 -0
- data/lib/wag/instructions/global/base.rb +13 -0
- data/lib/wag/instructions/global/get.rb +20 -0
- data/lib/wag/instructions/global/set.rb +20 -0
- data/lib/wag/instructions/i32/add.rb +11 -0
- data/lib/wag/instructions/i32/and.rb +11 -0
- data/lib/wag/instructions/i32/base.rb +13 -0
- data/lib/wag/instructions/i32/clz.rb +11 -0
- data/lib/wag/instructions/i32/const.rb +20 -0
- data/lib/wag/instructions/i32/ctz.rb +11 -0
- data/lib/wag/instructions/i32/div_s.rb +11 -0
- data/lib/wag/instructions/i32/div_u.rb +11 -0
- data/lib/wag/instructions/i32/eq.rb +11 -0
- data/lib/wag/instructions/i32/eqz.rb +11 -0
- data/lib/wag/instructions/i32/ge_s.rb +11 -0
- data/lib/wag/instructions/i32/ge_u.rb +11 -0
- data/lib/wag/instructions/i32/gt_s.rb +11 -0
- data/lib/wag/instructions/i32/gt_u.rb +11 -0
- data/lib/wag/instructions/i32/le_s.rb +11 -0
- data/lib/wag/instructions/i32/le_u.rb +11 -0
- data/lib/wag/instructions/i32/load.rb +11 -0
- data/lib/wag/instructions/i32/load16_s.rb +11 -0
- data/lib/wag/instructions/i32/load16_u.rb +11 -0
- data/lib/wag/instructions/i32/load8_s.rb +11 -0
- data/lib/wag/instructions/i32/load8_u.rb +11 -0
- data/lib/wag/instructions/i32/lt_s.rb +11 -0
- data/lib/wag/instructions/i32/lt_u.rb +11 -0
- data/lib/wag/instructions/i32/mul.rb +11 -0
- data/lib/wag/instructions/i32/ne.rb +11 -0
- data/lib/wag/instructions/i32/or.rb +11 -0
- data/lib/wag/instructions/i32/popcnt.rb +11 -0
- data/lib/wag/instructions/i32/reinterpret_f32.rb +11 -0
- data/lib/wag/instructions/i32/rem_s.rb +11 -0
- data/lib/wag/instructions/i32/rem_u.rb +11 -0
- data/lib/wag/instructions/i32/rotl.rb +11 -0
- data/lib/wag/instructions/i32/rotr.rb +11 -0
- data/lib/wag/instructions/i32/shl.rb +11 -0
- data/lib/wag/instructions/i32/shr_s.rb +11 -0
- data/lib/wag/instructions/i32/shr_u.rb +11 -0
- data/lib/wag/instructions/i32/store.rb +11 -0
- data/lib/wag/instructions/i32/store16.rb +11 -0
- data/lib/wag/instructions/i32/store8.rb +11 -0
- data/lib/wag/instructions/i32/sub.rb +11 -0
- data/lib/wag/instructions/i32/trunc_f32_s.rb +11 -0
- data/lib/wag/instructions/i32/trunc_f32_u.rb +11 -0
- data/lib/wag/instructions/i32/trunc_f64_s.rb +11 -0
- data/lib/wag/instructions/i32/trunc_f64_u.rb +11 -0
- data/lib/wag/instructions/i32/wrap_i64.rb +11 -0
- data/lib/wag/instructions/i32/xor.rb +11 -0
- data/lib/wag/instructions/i64/add.rb +11 -0
- data/lib/wag/instructions/i64/and.rb +11 -0
- data/lib/wag/instructions/i64/base.rb +13 -0
- data/lib/wag/instructions/i64/clz.rb +11 -0
- data/lib/wag/instructions/i64/const.rb +20 -0
- data/lib/wag/instructions/i64/ctz.rb +11 -0
- data/lib/wag/instructions/i64/div_s.rb +11 -0
- data/lib/wag/instructions/i64/div_u.rb +11 -0
- data/lib/wag/instructions/i64/eq.rb +11 -0
- data/lib/wag/instructions/i64/eqz.rb +11 -0
- data/lib/wag/instructions/i64/extend_i32_s.rb +11 -0
- data/lib/wag/instructions/i64/extend_i32_u.rb +11 -0
- data/lib/wag/instructions/i64/ge_s.rb +11 -0
- data/lib/wag/instructions/i64/ge_u.rb +11 -0
- data/lib/wag/instructions/i64/gt_s.rb +11 -0
- data/lib/wag/instructions/i64/gt_u.rb +11 -0
- data/lib/wag/instructions/i64/le_s.rb +11 -0
- data/lib/wag/instructions/i64/le_u.rb +11 -0
- data/lib/wag/instructions/i64/load.rb +11 -0
- data/lib/wag/instructions/i64/load16_s.rb +11 -0
- data/lib/wag/instructions/i64/load16_u.rb +11 -0
- data/lib/wag/instructions/i64/load32_s.rb +11 -0
- data/lib/wag/instructions/i64/load32_u.rb +11 -0
- data/lib/wag/instructions/i64/load8_s.rb +11 -0
- data/lib/wag/instructions/i64/load8_u.rb +11 -0
- data/lib/wag/instructions/i64/lt_s.rb +11 -0
- data/lib/wag/instructions/i64/lt_u.rb +11 -0
- data/lib/wag/instructions/i64/mul.rb +11 -0
- data/lib/wag/instructions/i64/ne.rb +11 -0
- data/lib/wag/instructions/i64/or.rb +11 -0
- data/lib/wag/instructions/i64/popcnt.rb +11 -0
- data/lib/wag/instructions/i64/reinterpret_f64.rb +11 -0
- data/lib/wag/instructions/i64/rem_s.rb +11 -0
- data/lib/wag/instructions/i64/rem_u.rb +11 -0
- data/lib/wag/instructions/i64/rotl.rb +11 -0
- data/lib/wag/instructions/i64/rotr.rb +11 -0
- data/lib/wag/instructions/i64/shl.rb +11 -0
- data/lib/wag/instructions/i64/shr_s.rb +11 -0
- data/lib/wag/instructions/i64/shr_u.rb +11 -0
- data/lib/wag/instructions/i64/store.rb +11 -0
- data/lib/wag/instructions/i64/store16.rb +11 -0
- data/lib/wag/instructions/i64/store32.rb +11 -0
- data/lib/wag/instructions/i64/store8.rb +11 -0
- data/lib/wag/instructions/i64/sub.rb +11 -0
- data/lib/wag/instructions/i64/trunc_f32_s.rb +11 -0
- data/lib/wag/instructions/i64/trunc_f32_u.rb +11 -0
- data/lib/wag/instructions/i64/trunc_f64_s.rb +11 -0
- data/lib/wag/instructions/i64/trunc_f64_u.rb +11 -0
- data/lib/wag/instructions/i64/xor.rb +11 -0
- data/lib/wag/instructions/if.rb +26 -0
- data/lib/wag/instructions/local/base.rb +13 -0
- data/lib/wag/instructions/local/get.rb +20 -0
- data/lib/wag/instructions/local/set.rb +20 -0
- data/lib/wag/instructions/local/tee.rb +20 -0
- data/lib/wag/instructions/loop.rb +9 -0
- data/lib/wag/instructions/memory/base.rb +13 -0
- data/lib/wag/instructions/memory/grow.rb +11 -0
- data/lib/wag/instructions/memory/size.rb +11 -0
- data/lib/wag/instructions/nop.rb +8 -0
- data/lib/wag/instructions/return.rb +9 -0
- data/lib/wag/instructions/select.rb +9 -0
- data/lib/wag/instructions/unreachable.rb +8 -0
- data/lib/wag/label.rb +32 -0
- data/lib/wag/local.rb +19 -0
- data/lib/wag/local_instructions.rb +19 -0
- data/lib/wag/memory.rb +26 -0
- data/lib/wag/memory_instructions.rb +19 -0
- data/lib/wag/module.rb +100 -0
- data/lib/wag/param.rb +20 -0
- data/lib/wag/result.rb +17 -0
- data/lib/wag/table.rb +17 -0
- data/lib/wag/then.rb +13 -0
- data/lib/wag/type.rb +19 -0
- data/lib/wag/types/base.rb +16 -0
- data/lib/wag/types/f32.rb +8 -0
- data/lib/wag/types/f64.rb +8 -0
- data/lib/wag/types/i32.rb +8 -0
- data/lib/wag/types/i64.rb +8 -0
- data/lib/wag/version.rb +5 -0
- data/lib/wag/wabt.rb +45 -0
- data/lib/wag/wasm.rb +22 -0
- data/lib/wag/wat.rb +18 -0
- data/wag.gemspec +35 -0
- 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
         | 
    
        data/lib/wag/element.rb
    ADDED
    
    | @@ -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
         | 
    
        data/lib/wag/function.rb
    ADDED
    
    | @@ -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
         | 
    
        data/lib/wag/indices.rb
    ADDED
    
    | @@ -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
         |