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

Comparing JSON-XS/XS.xs (file contents):
Revision 1.36 by root, Wed Jun 6 17:27:33 2007 UTC vs.
Revision 1.37 by root, Wed Jun 6 17:49:01 2007 UTC

506 else if (SvIOKp (sv)) 506 else if (SvIOKp (sv))
507 { 507 {
508 // we assume we can always read an IV as a UV 508 // we assume we can always read an IV as a UV
509 if (SvUV (sv) & ~(UV)0x7fff) 509 if (SvUV (sv) & ~(UV)0x7fff)
510 { 510 {
511 need (enc, 64); 511 need (enc, sizeof (UV) * 3);
512 enc->cur += 512 enc->cur +=
513 SvIsUV(sv) 513 SvIsUV(sv)
514 ? snprintf (enc->cur, 64, "%"UVuf, (UV)SvUVX (sv)) 514 ? snprintf (enc->cur, sizeof (UV) * 3, "%"UVuf, (UV)SvUVX (sv))
515 : snprintf (enc->cur, 64, "%"IVdf, (IV)SvIVX (sv)); 515 : snprintf (enc->cur, sizeof (UV) * 3, "%"IVdf, (IV)SvIVX (sv));
516 } 516 }
517 else 517 else
518 { 518 {
519 // optimise the "small number case" 519 // optimise the "small number case"
520 // code will likely be branchless and use only a single multiplication 520 // code will likely be branchless and use only a single multiplication
529 // convert to 4.28 fixed-point representation 529 // convert to 4.28 fixed-point representation
530 u = u * ((0xfffffff + 10000) / 10000); // 10**5, 5 fractional digits 530 u = u * ((0xfffffff + 10000) / 10000); // 10**5, 5 fractional digits
531 531
532 char digit, nz = 0; 532 char digit, nz = 0;
533 533
534 digit = u >> 28; *enc->cur = digit + '0'; nz |= digit; enc->cur += nz ? 1 : 0; u = (u & 0xfffffff) * 5; 534 digit = u >> 28; *enc->cur = digit + '0'; enc->cur += (nz = nz || digit); u = (u & 0xfffffff) * 5;
535 digit = u >> 27; *enc->cur = digit + '0'; nz |= digit; enc->cur += nz ? 1 : 0; u = (u & 0x7ffffff) * 5; 535 digit = u >> 27; *enc->cur = digit + '0'; enc->cur += (nz = nz || digit); u = (u & 0x7ffffff) * 5;
536 digit = u >> 26; *enc->cur = digit + '0'; nz |= digit; enc->cur += nz ? 1 : 0; u = (u & 0x3ffffff) * 5; 536 digit = u >> 26; *enc->cur = digit + '0'; enc->cur += (nz = nz || digit); u = (u & 0x3ffffff) * 5;
537 digit = u >> 25; *enc->cur = digit + '0'; nz |= digit; enc->cur += nz ? 1 : 0; u = (u & 0x1ffffff) * 5; 537 digit = u >> 25; *enc->cur = digit + '0'; enc->cur += (nz = nz || digit); u = (u & 0x1ffffff) * 5;
538 digit = u >> 24; *enc->cur = digit + '0'; nz |= digit; enc->cur += 1; 538 digit = u >> 24; *enc->cur = digit + '0'; enc->cur += 1;
539 } 539 }
540 } 540 }
541 else if (SvROK (sv)) 541 else if (SvROK (sv))
542 encode_rv (enc, SvRV (sv)); 542 encode_rv (enc, SvRV (sv));
543 else if (!SvOK (sv)) 543 else if (!SvOK (sv))

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines