Skip to content

Commit

Permalink
Add a key flag HVhek_KEYCANONICAL for Perl_hv_common(), which signals…
Browse files Browse the repository at this point in the history
… that the

key is in canonical form - any key passed encoded in UTF-8 cannot be represented
as bytes, hence the downgrade check can be skipped. Use this internally for
shared hash key scalars, as they are always canonical.
  • Loading branch information
nwc10 committed Dec 28, 2008
1 parent 90acdc2 commit 44b87b5
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 2 deletions.
8 changes: 6 additions & 2 deletions hv.c
Expand Up @@ -388,8 +388,12 @@ Perl_hv_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen,
if (flags & HVhek_FREEKEY)
Safefree(key);
key = SvPV_const(keysv, klen);
flags = 0;
is_utf8 = (SvUTF8(keysv) != 0);
if (SvIsCOW_shared_hash(keysv)) {
flags = HVhek_KEYCANONICAL | (is_utf8 ? HVhek_UTF8 : 0);
} else {
flags = 0;
}
} else {
is_utf8 = ((flags & HVhek_UTF8) ? TRUE : FALSE);
}
Expand Down Expand Up @@ -595,7 +599,7 @@ Perl_hv_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen,
}
}

if (is_utf8) {
if (is_utf8 & !(flags & HVhek_KEYCANONICAL)) {
char * const keysave = (char *)key;
key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8);
if (is_utf8)
Expand Down
3 changes: 3 additions & 0 deletions hv.h
Expand Up @@ -367,6 +367,9 @@ C<SV*>.
#define HVhek_FREEKEY 0x100 /* Internal flag to say key is malloc()ed. */
#define HVhek_PLACEHOLD 0x200 /* Internal flag to create placeholder.
* (may change, but Storable is a core module) */
#define HVhek_KEYCANONICAL 0x400 /* Internal flag - key is in canonical form.
If the string is UTF-8, it cannot be
converted to bytes. */
#define HVhek_MASK 0xFF

/* Which flags enable HvHASKFLAGS? Somewhat a hack on a hack, as
Expand Down

0 comments on commit 44b87b5

Please sign in to comment.