bindata 2.4.10 → 2.4.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ChangeLog.rdoc +8 -0
- data/lib/bindata/delayed_io.rb +7 -0
- data/lib/bindata/struct.rb +9 -2
- data/lib/bindata/version.rb +1 -1
- data/test/delayed_io_test.rb +45 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3688cea66b3a68f7f45ecd4b89b632e9e4438ee40ff4f59c57bbe0a68130e7d6
|
4
|
+
data.tar.gz: 647a570fd024d8938297d2fb4d2ac0123d03befaf0e5d3441627601d86694d8f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ddb2cd1156f3200fcc1bcce2d1a0bf5554f52babd692652debb71a8b56a9dced9c0f76db22884599f475b91d549f915344fcc1ec71a7f28be8dcb87192c968a5
|
7
|
+
data.tar.gz: ea223714bb2753b3b5dd626711dbffdc328ed326d2218a5ef2d8817ad797de66299d438dbf2ad8a9904ea774e758efd8c6bef47bafe51e391247d32acc92f5ee
|
data/ChangeLog.rdoc
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
= BinData Changelog
|
2
2
|
|
3
|
+
== Version 2.4.12 (2022-10-03)
|
4
|
+
|
5
|
+
* Do not include DelayedIO objects when :onlyif is false.
|
6
|
+
|
7
|
+
== Version 2.4.11 (2022-09-27)
|
8
|
+
|
9
|
+
* Make DelayedIO work with :onlyif. Reported by Spencer McIntyre.
|
10
|
+
|
3
11
|
== Version 2.4.10 (2021-05-18)
|
4
12
|
|
5
13
|
* Improve speed of dynamic object creation. Reported by Charlie Ablett.
|
data/lib/bindata/delayed_io.rb
CHANGED
@@ -116,9 +116,14 @@ module BinData
|
|
116
116
|
0
|
117
117
|
end
|
118
118
|
|
119
|
+
def include_obj?
|
120
|
+
! has_parameter?(:onlyif) || eval_parameter(:onlyif)
|
121
|
+
end
|
122
|
+
|
119
123
|
# DelayedIO objects aren't read when #read is called.
|
120
124
|
# The reading is delayed until this method is called.
|
121
125
|
def read_now!
|
126
|
+
return unless include_obj?
|
122
127
|
raise IOError, "read from where?" unless @read_io
|
123
128
|
|
124
129
|
@read_io.seekbytes(abs_offset - @read_io.offset)
|
@@ -130,7 +135,9 @@ module BinData
|
|
130
135
|
# DelayedIO objects aren't written when #write is called.
|
131
136
|
# The writing is delayed until this method is called.
|
132
137
|
def write_now!
|
138
|
+
return unless include_obj?
|
133
139
|
raise IOError, "write to where?" unless @write_io
|
140
|
+
|
134
141
|
@write_io.seekbytes(abs_offset - @write_io.offset)
|
135
142
|
@type.do_write(@write_io)
|
136
143
|
end
|
data/lib/bindata/struct.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'bindata/base'
|
2
|
+
require 'bindata/delayed_io'
|
2
3
|
|
3
4
|
module BinData
|
4
5
|
|
@@ -136,12 +137,12 @@ module BinData
|
|
136
137
|
|
137
138
|
def do_read(io) #:nodoc:
|
138
139
|
instantiate_all_objs
|
139
|
-
@field_objs.each { |f| f.do_read(io) if
|
140
|
+
@field_objs.each { |f| f.do_read(io) if include_obj_for_io?(f) }
|
140
141
|
end
|
141
142
|
|
142
143
|
def do_write(io) #:nodoc
|
143
144
|
instantiate_all_objs
|
144
|
-
@field_objs.each { |f| f.do_write(io) if
|
145
|
+
@field_objs.each { |f| f.do_write(io) if include_obj_for_io?(f) }
|
145
146
|
end
|
146
147
|
|
147
148
|
def do_num_bytes #:nodoc:
|
@@ -263,6 +264,12 @@ module BinData
|
|
263
264
|
end
|
264
265
|
end
|
265
266
|
|
267
|
+
def include_obj_for_io?(obj)
|
268
|
+
# Used by #do_read and #do_write, to ensure the stream is passed to
|
269
|
+
# DelayedIO objects for delayed processing.
|
270
|
+
include_obj?(obj) || DelayedIO === obj
|
271
|
+
end
|
272
|
+
|
266
273
|
def include_obj?(obj)
|
267
274
|
!obj.has_parameter?(:onlyif) || obj.eval_parameter(:onlyif)
|
268
275
|
end
|
data/lib/bindata/version.rb
CHANGED
data/test/delayed_io_test.rb
CHANGED
@@ -184,6 +184,51 @@ describe BinData::DelayedIO, "inside a Record" do
|
|
184
184
|
end
|
185
185
|
end
|
186
186
|
|
187
|
+
describe BinData::DelayedIO, "inside a Record with onlyif" do
|
188
|
+
class DelayedIOOnlyIfRecord < BinData::Record
|
189
|
+
endian :little
|
190
|
+
|
191
|
+
uint8 :flag
|
192
|
+
delayed_io :my_int1, read_abs_offset: 4, onlyif: -> { flag != 0 } do
|
193
|
+
uint16 initial_value: 6
|
194
|
+
end
|
195
|
+
delayed_io :my_int2, read_abs_offset: 2, onlyif: -> { flag == 0 } do
|
196
|
+
uint16 initial_value: 7
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
it "reads" do
|
201
|
+
obj = DelayedIOOnlyIfRecord.read "\x01\x00\x03\x0012345"
|
202
|
+
obj.num_bytes.must_equal 1
|
203
|
+
obj.snapshot.must_equal({flag: 1, my_int1: 6})
|
204
|
+
end
|
205
|
+
|
206
|
+
it "reads explicitly when flag is set" do
|
207
|
+
obj = DelayedIOOnlyIfRecord.read "\x01\xff\x01\x00\x02\x00"
|
208
|
+
obj.my_int1.read_now!
|
209
|
+
obj.my_int2.read_now!
|
210
|
+
obj.num_bytes.must_equal 1
|
211
|
+
obj.snapshot.must_equal({flag: 1, my_int1: 2})
|
212
|
+
end
|
213
|
+
|
214
|
+
it "reads explicitly when flag is not set" do
|
215
|
+
obj = DelayedIOOnlyIfRecord.read "\x00\xff\x01\x00\x02\x00"
|
216
|
+
obj.my_int1.read_now!
|
217
|
+
obj.my_int2.read_now!
|
218
|
+
obj.num_bytes.must_equal 1
|
219
|
+
obj.snapshot.must_equal({flag: 0, my_int2: 1})
|
220
|
+
end
|
221
|
+
|
222
|
+
it "writes" do
|
223
|
+
obj = DelayedIOOnlyIfRecord.new(flag:1, my_int1: 3, my_int2: 4)
|
224
|
+
io = StringIO.new
|
225
|
+
obj.write(io)
|
226
|
+
obj.my_int1.write_now!
|
227
|
+
obj.my_int2.write_now!
|
228
|
+
io.value.must_equal "\x01\x00\x00\x00\x03\x00"
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
187
232
|
describe BinData::DelayedIO, "with auto_call" do
|
188
233
|
class AutoCallDelayedIORecord < BinData::Record
|
189
234
|
auto_call_delayed_io
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bindata
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.4.
|
4
|
+
version: 2.4.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dion Mendel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-10-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|