diff options
author | Simon Cozens <simon@netthink.co.uk> | 2000-12-02 19:49:35 +0000 |
---|---|---|
committer | Jarkko Hietaniemi <jhi@iki.fi> | 2000-12-04 16:25:15 +0000 |
commit | 3c1071f27f81b6dfd8d73d825ae7de3c747da907 (patch) | |
tree | 7a254a84ba48570e24432b4a0dc4e9417d7adc64 /hv.c | |
parent | 8e4bc33bdf4ed8200ffbc530cba09e11f3edc232 (diff) | |
download | perl-3c1071f27f81b6dfd8d73d825ae7de3c747da907.tar.gz |
(Retracted by #7978, too shaky yet.)
Subject: Re: utf8 in hash keys, implementor missing
Message-ID: <20001202194935.A25673@pembro33.pmb.ox.ac.uk>
The first step at UTF-8 hash keys.
p4raw-id: //depot/perl@7977
Diffstat (limited to 'hv.c')
-rw-r--r-- | hv.c | 17 |
1 files changed, 17 insertions, 0 deletions
@@ -245,6 +245,9 @@ Perl_hv_fetch_ent(pTHX_ HV *hv, SV *keysv, I32 lval, register U32 hash) if (!hv) return 0; + if (SvUTF8((SV*)hv) && !SvUTF8(keysv)) + sv_utf8_upgrade(keysv); + if (SvRMAGICAL(hv)) { if (mg_find((SV*)hv,'P')) { dTHR; @@ -463,6 +466,20 @@ Perl_hv_store_ent(pTHX_ HV *hv, SV *keysv, SV *val, register U32 hash) return 0; xhv = (XPVHV*)SvANY(hv); + + if (SvUTF8((SV*)hv) && !SvUTF8(keysv)) + sv_utf8_upgrade(keysv); + else if (SvUTF8(keysv) && !SvUTF8((SV*)hv)) { /* Upgrade hash */ + SvUTF8_on((SV*)hv); + /* XXX Need to save iterator to prevent weird things during "each" */ + (void)hv_iterinit(hv); + while (entry = hv_iternext(hv)) { + if (HeKLEN(entry) != HEf_SVKEY) /* Upgrade to SV key */ + HeSVKEY_set(entry, newSVpvn(HeKEY(entry), HeKLEN(entry))); + sv_utf8_upgrade(HeKEY_sv(entry)); + } + } + if (SvMAGICAL(hv)) { dTHR; bool needs_copy; |