Sha256: 95969e77b53024cb6b83fcf160b5d8b3b23ab024bb39080f46207ed73b6eb408

Contents?: true

Size: 1.84 KB

Versions: 1

Compression:

Stored size: 1.84 KB

Contents

module Lignite
  # Allocate local or global variables
  # FIXME: the user can make bad alignment, resulting in VMError at runtime
  # bad:  data8 :speed; data32 :tacho; output_read(...)
  # good  data32 :tacho; data8 :speed; output_read(...)
  class Variables
    include Bytes

    def initialize
      @offset = 0
      # for proper decoding of direct replies according to declared types
      @unpacker = ""
      @vars = {}
      @param_count = 0
      @param_decl_bytes = ""
    end

    # declare
    def add(id, size, unpacker)
      raise "Duplicate variable #{id}" if @vars.key?(id)
      @vars[id] = { offset: @offset, size: size }
      @offset += size
      @unpacker += unpacker
    end

    # declare a subroutine parameter
    def param(name, size, size_code, direction)
      raise "Duplicate parameter #{name}" if @vars.key?(name)
      nonsense_unpacker = "," # FIXME: better
      add(name, size, nonsense_unpacker)

      @param_count += 1
      @param_decl_bytes += u8(size_code | direction)
    end

    # use
    def key?(sym)
      @vars.key?(sym)
    end

    # use
    def offset(sym)
      @vars[sym][:offset]
    end

    # compile
    def bytesize
      @offset
    end

    def param_decl_header
      u8(@param_count) + @param_decl_bytes
    end

    # decode reply
    def unpack(buf)
      values = buf.unpack(@unpacker)
      values.size == 1 ? values.first : values
    end
  end

  # `variables` are {Variables}
  module VariableDeclarer
    def data8(id)
      variables.add(id, 1, "C")
    end

    def data16(id)
      variables.add(id, 2, "S<")
    end

    def data32(id)
      variables.add(id, 4, "L<")
    end

    def dataf(id)
      variables.add(id, 4, "e")
    end

    def datas(id, size)
      variables.add(id, size, "a#{size}")
    end

    def array8(id, count)
      variables.add(id, count * 1, "C#{count}")
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
lignite-0.5.0 lib/lignite/variables.rb