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