ffi-struct_ex 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Rakefile +1 -1
- data/lib/ffi/struct_ex/struct_ex.rb +1 -1
- data/lib/ffi/struct_ex/version.rb +1 -1
- data/spec/ffi/struct_ex_spec.rb +88 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4ac19c3923f1ad0b4d6fafbb45239e3033612d71
|
4
|
+
data.tar.gz: b06348fa797179ad6383242ca04ee1a9eb7993fb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 33f293223f2122c75b6535e2f0e8025f76dd239d47a2bad68b48afe198674246a7198f8debc5eddce9f8f365764c306f20b8ab91e29062bb5e80cc376174f325
|
7
|
+
data.tar.gz: f6f4a4a34bc5ee680742bb0d38fecc3cfeb1345b1964cd39a2c398c9e13ae572ecd810238737671ccc8b2a24813f628e353644ee66e2f0f25c489e505d8814f9
|
data/Rakefile
CHANGED
@@ -141,7 +141,7 @@ module FFI
|
|
141
141
|
if bits_unit && bits_unit[:ffi_type].size == ffi_type.size && bits_unit[:bits_size] + bits_size <= bits_unit[:ffi_type].size * 8
|
142
142
|
bits_unit[:bits_size] += bits_size
|
143
143
|
else
|
144
|
-
offset = builder.send(:align, builder.size, [@min_alignment || 1, ffi_type.alignment].max)
|
144
|
+
offset = builder.send(:align, builder.size, @packed ? [@packed, ffi_type.alignment].min : [@min_alignment || 1, ffi_type.alignment].max)
|
145
145
|
bits_unit = {ffi_type: ffi_type, bits_size: bits_size}
|
146
146
|
end
|
147
147
|
|
data/spec/ffi/struct_ex_spec.rb
CHANGED
@@ -121,6 +121,94 @@ describe FFI::StructEx do
|
|
121
121
|
end
|
122
122
|
end
|
123
123
|
|
124
|
+
describe "#size and #alignment with pack 1" do
|
125
|
+
def test_size_and_alignment(specs, size, alignment)
|
126
|
+
klass = Class.new(described_class) do
|
127
|
+
pack 1
|
128
|
+
layout(*specs)
|
129
|
+
end
|
130
|
+
|
131
|
+
klass.size.should == size
|
132
|
+
klass.alignment.should == alignment
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should work by declaring ffi type" do
|
136
|
+
test_size_and_alignment([:f0, :short,
|
137
|
+
:f1, :char,
|
138
|
+
:f2, :char], 4, 1)
|
139
|
+
|
140
|
+
test_size_and_alignment([:f0, :short,
|
141
|
+
:f1, :char], 3, 1)
|
142
|
+
test_size_and_alignment([:f0, :char,
|
143
|
+
:f1, :short], 3, 1)
|
144
|
+
end
|
145
|
+
|
146
|
+
it "should work by only declaring bit field with default type" do
|
147
|
+
test_size_and_alignment([:f0, 31,
|
148
|
+
:f1, 31], 8, 1)
|
149
|
+
|
150
|
+
test_size_and_alignment([:f0, 8,
|
151
|
+
:f1, 16], 3, 1)
|
152
|
+
test_size_and_alignment([:f0, 16,
|
153
|
+
:f1, 8], 3, 1)
|
154
|
+
|
155
|
+
test_size_and_alignment([:f0, 1,
|
156
|
+
:f1, 16,
|
157
|
+
:f2, 1], 4, 1)
|
158
|
+
end
|
159
|
+
|
160
|
+
it "should work by declaring bit field and ffi type" do
|
161
|
+
test_size_and_alignment([:f0, 'uint32: 1',
|
162
|
+
:f1, :uint16], 6, 1)
|
163
|
+
end
|
164
|
+
let(:klass1) {
|
165
|
+
|
166
|
+
}
|
167
|
+
|
168
|
+
let(:klass1) {
|
169
|
+
klass = Class.new(FFI::StructEx) do
|
170
|
+
pack 1
|
171
|
+
layout :bits_0_2, 'uint16: 3',
|
172
|
+
:bit_3, 'uint16: 1',
|
173
|
+
:bit_4, 'uint16: 1',
|
174
|
+
:bits_5_7, 'uint16: 3',
|
175
|
+
:bits_8_15, :uint8
|
176
|
+
end
|
177
|
+
Class.new(FFI::StructEx) do
|
178
|
+
pack 1
|
179
|
+
layout :f0, klass,
|
180
|
+
:f1, :uint8,
|
181
|
+
:f2, :uint8,
|
182
|
+
:f3, :uint8
|
183
|
+
end
|
184
|
+
}
|
185
|
+
|
186
|
+
let(:klass2) {
|
187
|
+
klass = Class.new(FFI::StructEx) do
|
188
|
+
layout :bits_0_2, 'uint16: 3',
|
189
|
+
:bit_3, 'uint16: 1',
|
190
|
+
:bit_4, 'uint16: 1',
|
191
|
+
:bits_5_7, 'uint16: 3',
|
192
|
+
:bits_8_15, :uint8
|
193
|
+
end
|
194
|
+
Class.new(FFI::StructEx) do
|
195
|
+
pack 1
|
196
|
+
layout :f0, klass,
|
197
|
+
:f1, :uint8,
|
198
|
+
:f2, :uint8,
|
199
|
+
:f3, :uint8
|
200
|
+
end
|
201
|
+
}
|
202
|
+
|
203
|
+
it "should work by declaring embedded field" do
|
204
|
+
klass1.size.should == 6
|
205
|
+
klass1.offset_of(:f1).should == 3
|
206
|
+
|
207
|
+
klass2.size.should == 7
|
208
|
+
klass2.offset_of(:f1).should == 4
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
124
212
|
describe "#==" do
|
125
213
|
context "when given embedded struct" do
|
126
214
|
let(:hash) { {f0: {bits_0_2: 0b001, bit_3: 0b1, bit_4: 0b0, bits_5_7: 0b011}, f1: 0x1} }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ffi-struct_ex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ruijia Li
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-06-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|