Sha256: bd84d322cbcdc32fde06d230d86e5f9fb7b983c6745d804574a7898d68661495

Contents?: true

Size: 1.38 KB

Versions: 2

Compression:

Stored size: 1.38 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
    def initialize
      @offset = 0
      # for proper decoding of direct replies according to declared types
      @unpacker = ""
      @vars = {}
    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

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

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

    # compile
    def bytesize
      @offset
    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

2 entries across 2 versions & 1 rubygems

Version Path
lignite-0.4.0 lib/lignite/variables.rb
lignite-0.3.0 lib/lignite/variables.rb