| Class | DL::Importable::Internal::Struct |
| In: |
dl/struct.rb
|
| Parent: | Object |
Public Class methods
# File dl/struct.rb, line 65
65: def initialize(types, contents)
66: @names = []
67: @ty = {}
68: @len = {}
69: @enc = {}
70: @dec = {}
71: @size = 0
72: @tys = ""
73: @types = types
74: parse(contents)
75: end
Public Instance methods
# File dl/struct.rb, line 92
92: def malloc(size = nil)
93: if( !size )
94: size = @size
95: end
96: ptr = DL::malloc(size)
97: return new(ptr)
98: end
ptr must be a PtrData object.
# File dl/struct.rb, line 86
86: def new(ptr)
87: ptr.struct!(@tys, *@names)
88: mem = Memory.new(ptr, @names, @ty, @len, @enc, @dec)
89: return mem
90: end
# File dl/struct.rb, line 100
100: def parse(contents)
101: contents.each{|elem|
102: name,ty,num,enc,dec = parse_elem(elem)
103: @names.push(name)
104: @ty[name] = ty
105: @len[name] = num
106: @enc[name] = enc
107: @dec[name] = dec
108: if( num )
109: @tys += "#{ty}#{num}"
110: else
111: @tys += ty
112: end
113: }
114: @size = DL.sizeof(@tys)
115: end
# File dl/struct.rb, line 117
117: def parse_elem(elem)
118: elem.strip!
119: case elem
120: when /^([\w\d_\*]+)([\*\s]+)([\w\d_]+)$/
121: ty = ($1 + $2).strip
122: name = $3
123: num = nil;
124: when /^([\w\d_\*]+)([\*\s]+)([\w\d_]+)\[(\d+)\]$/
125: ty = ($1 + $2).strip
126: name = $3
127: num = $4.to_i
128: else
129: raise(RuntimeError, "invalid element: #{elem}")
130: end
131: ty,enc,dec = @types.encode_struct_type(ty)
132: if( !ty )
133: raise(TypeError, "unsupported type: #{ty}")
134: end
135: return [name,ty,num,enc,dec]
136: end