--- CBOR-XS/XS.xs 2013/11/28 09:13:12 1.29 +++ CBOR-XS/XS.xs 2013/11/28 11:36:53 1.30 @@ -232,9 +232,18 @@ encode_uint (enc, 0xc0, tag); } -static void +ecb_inline void encode_str (enc_t *enc, int utf8, char *str, STRLEN len) { + encode_uint (enc, utf8 ? 0x60 : 0x40, len); + need (enc, len); + memcpy (enc->cur, str, len); + enc->cur += len; +} + +static void +encode_strref (enc_t *enc, int utf8, char *str, STRLEN len) +{ if (ecb_expect_false (enc->cbor.flags & F_ALLOW_STRINGREF)) { SV **svp = hv_fetch (enc->stringref[!!utf8], str, len, 1); @@ -254,10 +263,7 @@ } } - encode_uint (enc, utf8 ? 0x60 : 0x40, len); - need (enc, len); - memcpy (enc->cur, str, len); - enc->cur += len; + encode_str (enc, utf8, str, len); } static void encode_sv (enc_t *enc, SV *sv); @@ -306,7 +312,7 @@ if (HeKLEN (he) == HEf_SVKEY) encode_sv (enc, HeSVKEY (he)); else - encode_str (enc, HeKUTF8 (he), HeKEY (he), HeKLEN (he)); + encode_strref (enc, HeKUTF8 (he), HeKEY (he), HeKLEN (he)); encode_sv (enc, ecb_expect_false (mg) ? hv_iterval (hv, he) : HeVAL (he)); } @@ -417,7 +423,7 @@ encode_tag (enc, CBOR_TAG_PERL_OBJECT); encode_uint (enc, 0x80, count + 1); - encode_str (enc, HvNAMEUTF8 (stash), HvNAME (stash), HvNAMELEN (stash)); + encode_strref (enc, HvNAMEUTF8 (stash), HvNAME (stash), HvNAMELEN (stash)); while (count) encode_sv (enc, SP[1 - count--]); @@ -486,7 +492,7 @@ { STRLEN len; char *str = SvPV (sv, len); - encode_str (enc, SvUTF8 (sv), str, len); + encode_strref (enc, SvUTF8 (sv), str, len); } else if (SvNOKp (sv)) encode_nv (enc, sv);