class Lignite::Variables

Allocate local or global variables

Public Class Methods

new() click to toggle source
# File lib/lignite/variables.rb, line 6
def initialize
  @offset = 0
  # for proper decoding of direct replies according to declared types
  @unpacker = ""
  @vars = {}
  @param_count = 0
  @param_decl_bytes = ""
end

Public Instance Methods

add(id, size, count, unpacker) click to toggle source

Declare a variable/parameter id @param id [Symbol] @param size [Integer] byte size of one element of the data @param count [Integer] 1 for scalars, more for arrays @param unpacker [String] for String#unpack for direct commands

# File lib/lignite/variables.rb, line 20
def add(id, size, count, unpacker)
  raise "Duplicate variable #{id}" if @vars.key?(id)
  @offset = align(@offset, size)
  @vars[id] = { offset: @offset, size: size * count }
  @offset += size * count
  @unpacker += unpacker
end
bytesize() click to toggle source

compile

# File lib/lignite/variables.rb, line 52
def bytesize
  @offset
end
key?(sym) click to toggle source

use

# File lib/lignite/variables.rb, line 42
def key?(sym)
  @vars.key?(sym)
end
offset(sym) click to toggle source

use

# File lib/lignite/variables.rb, line 47
def offset(sym)
  @vars[sym][:offset]
end
param(name, size, count, size_code, direction) click to toggle source

declare a subroutine parameter

# File lib/lignite/variables.rb, line 29
def param(name, size, count, size_code, direction)
  raise "Duplicate parameter #{name}" if @vars.key?(name)
  unless @offset == align(@offset, size)
    raise "Misaligned parameter #{name} of size #{size} at #{@offset}"
  end
  nonsense_unpacker = "," # FIXME: better
  add(name, size, count, nonsense_unpacker)

  @param_count += 1
  @param_decl_bytes += u8(size_code | direction)
end
param_decl_header() click to toggle source
# File lib/lignite/variables.rb, line 56
def param_decl_header
  u8(@param_count) + @param_decl_bytes
end
unpack(buf) click to toggle source

decode reply

# File lib/lignite/variables.rb, line 61
def unpack(buf)
  values = buf.unpack(@unpacker)
  values.size == 1 ? values.first : values
end

Private Instance Methods

align(n, size) click to toggle source

Round n up to a next multiple of size

# File lib/lignite/variables.rb, line 69
def align(n, size)
  (n + size - 1).div(size) * size
end