cbor 0.5.9.9 → 0.5.10.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4a3fa9f403e4ae0b3e86d1f1edcb9c7326d7e40d5c81b622ba45c6fedb907dd3
4
- data.tar.gz: 735749121ea8c1baa84bb372bd069880032ff4378d4141b6e977327fb7c9be07
3
+ metadata.gz: fafbded4dd72295218759d12eea5b09b280ec06719eca7d646164173a2405fe2
4
+ data.tar.gz: abcc97eaa52ad9abd549b3bf18819ff2982f09d1ab283df06ff46d7f10a4c470
5
5
  SHA512:
6
- metadata.gz: 8950068d33324e6d341bb399ec2b4f36d1e62fe8a532c1f9b532712a6108f0241238d298aa2923d40de10f88fa07481d29f4fb1ef08114a5124278c1c102401d
7
- data.tar.gz: 7dcd27dd1df6dcd7f9f6e90c75e73ce6d8812f96196a9978afcfab73cd113de616810d684dfba62e0cb624b5cd29f6f0f636db0e3ea1e5c2d5306a614f1d099c
6
+ metadata.gz: 82e84122c5a22dc4a6644823d92a33de60a55f58ef0844637aad0e72a6fdf899afa1f016aafc1306e12ec323c55c035ef5a9148252c68f162fd75d222f61262f
7
+ data.tar.gz: a68bc717c4886e2dc5dd969941f2f33d620bcdbe8d9609ab06356ecc7d2de7e26699c21f8b56eb51d3b942204772e84413778aa7fb7fdcfb9a933c7a1923362a
@@ -73,8 +73,6 @@ static ID get_partial_read_method(VALUE io)
73
73
  {
74
74
  if(rb_respond_to(io, s_readpartial)) {
75
75
  return s_readpartial;
76
- } else if(rb_respond_to(io, s_read)) {
77
- return s_read;
78
76
  } else {
79
77
  return s_read;
80
78
  }
data/ext/cbor/packer.h CHANGED
@@ -170,17 +170,25 @@ static inline void msgpack_packer_write_double(msgpack_packer_t* pk, double v)
170
170
  msgpack_buffer_ensure_writable(PACKER_BUFFER_(pk), 5);
171
171
  castbuf.u32 = _msgpack_be_float(castbuf.u32);
172
172
  msgpack_buffer_write_byte_and_data(PACKER_BUFFER_(pk), IB_FLOAT4, castbuf.mem, 4);
173
- } else if (v != v) { /* NaN */
174
- cbor_encoder_write_head(pk, 0xe0, 0x7e00);
175
173
  } else {
176
- msgpack_buffer_ensure_writable(PACKER_BUFFER_(pk), 9);
177
174
  union {
178
175
  double d;
179
176
  uint64_t u64;
180
177
  char mem[8];
181
178
  } castbuf = { v };
182
- castbuf.u64 = _msgpack_be_double(castbuf.u64);
183
- msgpack_buffer_write_byte_and_data(PACKER_BUFFER_(pk), IB_FLOAT8, castbuf.mem, 8);
179
+ if (v != v && (castbuf.u64 & 0x1fffffffUL) == 0) { /* NaN && can narrow */
180
+ uint64_t sign = castbuf.u64 >> 63;
181
+ uint64_t mant = castbuf.u64 & 0xfffffffffffff; /* 52 bits */
182
+ if ((mant & 0x3ffffffffffUL) == 0) { /* 42 zero bits: narrow to f16 */
183
+ cbor_encoder_write_head(pk, 0xe0, sign << 15 | 0x7c00 | mant >> 42);
184
+ } else { /* 29 zero bits (checked above): narrow to f32 */
185
+ cbor_encoder_write_head(pk, 0xe0, sign << 31 | 0x7f800000 | mant >> 29);
186
+ }
187
+ } else { /* can't narrow */
188
+ msgpack_buffer_ensure_writable(PACKER_BUFFER_(pk), 9);
189
+ castbuf.u64 = _msgpack_be_double(castbuf.u64);
190
+ msgpack_buffer_write_byte_and_data(PACKER_BUFFER_(pk), IB_FLOAT8, castbuf.mem, 8);
191
+ }
184
192
  }
185
193
  }
186
194
 
data/ext/cbor/unpacker.c CHANGED
@@ -417,11 +417,21 @@ static int read_primitive(msgpack_unpacker_t* uk)
417
417
  switch (ai) {
418
418
  case AI_2: { // half
419
419
  int exp = (val >> 10) & 0x1f;
420
- int mant = val & 0x3ff;
420
+ int mant = val & 0x3ff; /* 10 bits */
421
421
  double res;
422
422
  if (exp == 0) res = ldexp(mant, -24);
423
423
  else if (exp != 31) res = ldexp11(mant + 1024, exp - 25);
424
- else res = mant == 0 ? INFINITY : NAN;
424
+ else {
425
+ if (mant == 0)
426
+ res = INFINITY;
427
+ else { /* NAN */
428
+ union {
429
+ uint64_t u64;
430
+ double d;
431
+ } castbuf = { (val & 0x8000) << 48 | 0x7ff0000000000000UL | (uint64_t)mant << 42 };
432
+ return object_complete(uk, rb_float_new(castbuf.d));
433
+ }
434
+ }
425
435
  return object_complete(uk, rb_float_new(val & 0x8000 ? -res : res));
426
436
  }
427
437
  case AI_4: // float
@@ -429,8 +439,17 @@ static int read_primitive(msgpack_unpacker_t* uk)
429
439
  union {
430
440
  uint32_t u32;
431
441
  float f;
432
- } castbuf = { (uint32_t)val };
433
- return object_complete(uk, rb_float_new(castbuf.f));
442
+ } castbuf = { (uint32_t)val }; /* sets Q to 1 for NAN */
443
+ if (castbuf.f == castbuf.f) {
444
+ return object_complete(uk, rb_float_new(castbuf.f));
445
+ } else { /* NAN */
446
+ uint64_t mant = val & 0x7fffff; /* 23 bits */
447
+ union {
448
+ uint64_t u64;
449
+ double d;
450
+ } castbuf1 = { (val & 0x80000000UL) << 32 | 0x7ff0000000000000UL | mant << 29 };
451
+ return object_complete(uk, rb_float_new(castbuf1.d));
452
+ }
434
453
  }
435
454
  case AI_8: // double
436
455
  {
@@ -664,6 +683,7 @@ int msgpack_unpacker_read(msgpack_unpacker_t* uk, size_t target_stack_depth)
664
683
  if(msgpack_unpacker_stack_pop(uk) <= target_stack_depth) {
665
684
  return PRIMITIVE_OBJECT_COMPLETE;
666
685
  }
686
+ r = PRIMITIVE_OBJECT_COMPLETE;
667
687
  goto container_completed;
668
688
  }
669
689
  }
data/lib/cbor/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module CBOR
2
- VERSION = "0.5.9.9"
2
+ VERSION = "0.5.10.2"
3
3
  end
data/spec/format_spec.rb CHANGED
@@ -334,6 +334,66 @@ describe MessagePack do
334
334
  }.should raise_error(MessagePack::MalformedFormatError)
335
335
  end
336
336
 
337
+ # Regression tests for https://github.com/cabo/cbor-ruby/issues/20
338
+ # Nested indefinite-length containers should decode correctly.
339
+
340
+ it "{_ 'a' => [_ 1]}" do
341
+ # indefinite map containing an indefinite array
342
+ check_decode "\xbf\x61a\x9f\x01\xff\xff", {"a" => [1]}
343
+ end
344
+
345
+ it "{_ 'a' => [_ 1], 'b' => [2, 3]}" do
346
+ # indefinite map containing an indefinite and a definite array
347
+ check_decode "\xbf\x61a\x9f\x01\xff\x61b\x82\x02\x03\xff", {"a" => [1], "b" => [2, 3]}
348
+ end
349
+
350
+ it "{_ 'a' => {_ 'b' => 1}}" do
351
+ # indefinite map containing an indefinite map
352
+ check_decode "\xbf\x61a\xbf\x61b\x01\xff\xff", {"a" => {"b" => 1}}
353
+ end
354
+
355
+ it "{_ 'a' => {_ }}" do
356
+ # indefinite map containing an empty indefinite map
357
+ check_decode "\xbf\x61a\xbf\xff\xff", {"a" => {}}
358
+ end
359
+
360
+ it "{_ 'a' => {_ NO BREAK}" do
361
+ # indefinite map containing an empty indefinite map
362
+ lambda {
363
+ check_decode "\xbf\x61a\xbf\xff", {"a" => {}}
364
+ }.should raise_error(EOFError)
365
+ end
366
+
367
+ it "{_ 'a' => {} NO BREAK" do
368
+ # indefinite map containing an empty indefinite map
369
+ lambda {
370
+ check_decode "\xbf\x61a\xa0", {"a" => {}}
371
+ }.should raise_error(EOFError)
372
+ end
373
+
374
+ it "{_ 'a' => {_ 'b' => 1}, 'b' => {'c' => 2}}" do
375
+ # indefinite map containing an indefinite and a definite map
376
+ check_decode "\xbf\x61a\xbf\x61b\x01\xff\x61b\xa1\x61c\x02\xff", {"a" => {"b" => 1}, "b" => {"c" => 2}}
377
+ end
378
+
379
+ it "[_ {_ 'a' => 1}]" do
380
+ # indefinite array containing an indefinite map
381
+ check_decode "\x9f\xbf\x61a\x01\xff\xff", [{"a" => 1}]
382
+ end
383
+
384
+ it "{_ 'files' => [{_ 'name' => 'foo'}]}" do
385
+ # indefinite map containing a definite array of indefinite maps
386
+ # (the exact pattern produced by Jackson's CBOR serializer)
387
+ check_decode "\xbf\x65files\x81\xbf\x64name\x63foo\xff\xff",
388
+ {"files" => [{"name" => "foo"}]}
389
+ end
390
+
391
+ it "deeply nested indefinite containers" do
392
+ # {_ "a" => {_ "b" => [_ {_ "c" => 1}]}}
393
+ check_decode "\xbf\x61a\xbf\x61b\x9f\xbf\x61c\x01\xff\xff\xff\xff",
394
+ {"a" => {"b" => [{"c" => 1}]}}
395
+ end
396
+
337
397
  it "(_ a b)" do
338
398
  check_decode "\x7f\xff", "".encode_as_utf8
339
399
  check_decode "\x5f\xff", "".b
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cbor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.9.9
4
+ version: 0.5.10.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carsten Bormann, standing on the tall shoulders of Sadayuki Furuhashi
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-08-02 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: bundler
@@ -173,7 +173,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
173
173
  - !ruby/object:Gem::Version
174
174
  version: '0'
175
175
  requirements: []
176
- rubygems_version: 3.6.2
176
+ rubygems_version: 4.0.2
177
177
  specification_version: 4
178
178
  summary: CBOR, Concise Binary Object Representation.
179
179
  test_files: