ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/CBOR-XS/XS.xs
(Generate patch)

Comparing CBOR-XS/XS.xs (file contents):
Revision 1.32 by root, Thu Nov 28 12:08:07 2013 UTC vs.
Revision 1.33 by root, Sat Nov 30 15:23:59 2013 UTC

327static void 327static void
328encode_rv (enc_t *enc, SV *sv) 328encode_rv (enc_t *enc, SV *sv)
329{ 329{
330 SvGETMAGIC (sv); 330 SvGETMAGIC (sv);
331 331
332 if (ecb_expect_false (enc->cbor.flags & F_ALLOW_SHARING)
333 && ecb_expect_false (SvREFCNT (sv) > 1))
334 {
335 if (!enc->shareable)
336 enc->shareable = (HV *)sv_2mortal ((SV *)newHV ());
337
338 SV **svp = hv_fetch (enc->shareable, (char *)&sv, sizeof (sv), 1);
339
340 if (SvOK (*svp))
341 {
342 encode_tag (enc, CBOR_TAG_VALUE_SHAREDREF);
343 encode_uint (enc, 0x00, SvUV (*svp));
344 return;
345 }
346 else
347 {
348 sv_setuv (*svp, enc->shareable_idx);
349 ++enc->shareable_idx;
350 encode_tag (enc, CBOR_TAG_VALUE_SHAREABLE);
351 }
352 }
353
354 svtype svt = SvTYPE (sv); 332 svtype svt = SvTYPE (sv);
355 333
356 if (ecb_expect_false (SvOBJECT (sv))) 334 if (ecb_expect_false (SvOBJECT (sv)))
357 { 335 {
358 HV *boolean_stash = !CBOR_SLOW || types_boolean_stash 336 HV *boolean_stash = !CBOR_SLOW || types_boolean_stash
440 encode_hv (enc, (HV *)sv); 418 encode_hv (enc, (HV *)sv);
441 else if (svt == SVt_PVAV) 419 else if (svt == SVt_PVAV)
442 encode_av (enc, (AV *)sv); 420 encode_av (enc, (AV *)sv);
443 else 421 else
444 { 422 {
423 if (ecb_expect_false (SvREFCNT (sv) > 1)
424 && ecb_expect_false (enc->cbor.flags & F_ALLOW_SHARING))
425 {
426 if (!enc->shareable)
427 enc->shareable = (HV *)sv_2mortal ((SV *)newHV ());
428
429 SV **svp = hv_fetch (enc->shareable, (char *)&sv, sizeof (sv), 1);
430
431 if (SvOK (*svp))
432 {
433 encode_tag (enc, CBOR_TAG_VALUE_SHAREDREF);
434 encode_uint (enc, 0x00, SvUV (*svp));
435 return;
436 }
437 else
438 {
439 sv_setuv (*svp, enc->shareable_idx);
440 ++enc->shareable_idx;
441 encode_tag (enc, CBOR_TAG_VALUE_SHAREABLE);
442 }
443 }
444
445 encode_tag (enc, CBOR_TAG_INDIRECTION); 445 encode_tag (enc, CBOR_TAG_INDIRECTION);
446 encode_sv (enc, sv); 446 encode_sv (enc, sv);
447 } 447 }
448} 448}
449 449
753{ 753{
754 SV *sv = 0; 754 SV *sv = 0;
755 755
756 if ((*dec->cur & 31) == 31) 756 if ((*dec->cur & 31) == 31)
757 { 757 {
758 // indefinite length strings
758 ++dec->cur; 759 ++dec->cur;
759 760
761 unsigned char major = *dec->cur & 0xe0;
762
760 sv = newSVpvn ("", 0); 763 sv = newSVpvn ("", 0);
761 764
762 // not very fast, and certainly not robust against illegal input
763 for (;;) 765 for (;;)
764 { 766 {
765 WANT (1); 767 WANT (1);
766 768
769 if ((*dec->cur ^ major) >= 31)
767 if (*dec->cur == (0xe0 | 31)) 770 if (*dec->cur == (0xe0 | 31))
768 { 771 {
769 ++dec->cur; 772 ++dec->cur;
770 break; 773 break;
771 } 774 }
775 else
776 ERR ("corrupted CBOR data (invalid chunks in indefinite length string)");
772 777
773 sv_catsv (sv, decode_sv (dec)); 778 STRLEN len = decode_uint (dec);
779
780 WANT (len);
781 sv_catpvn (sv, dec->cur, len);
782 dec->cur += len;
774 } 783 }
775 } 784 }
776 else 785 else
777 { 786 {
778 STRLEN len = decode_uint (dec); 787 STRLEN len = decode_uint (dec);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines