… | |
… | |
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, 32); |
511 | need (enc, sizeof (UV) * 3); |
512 | enc->cur += |
512 | enc->cur += |
513 | SvIsUV(sv) |
513 | SvIsUV(sv) |
514 | ? snprintf (enc->cur, 32, "%"UVuf, (UV)SvUVX (sv)) |
514 | ? snprintf (enc->cur, sizeof (UV) * 3, "%"UVuf, (UV)SvUVX (sv)) |
515 | : snprintf (enc->cur, 32, "%"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)) |