123123# define NEED_sv_2pv_flags
124124# define NEED_vnewSVpvf
125125# define NEED_warner
126+ # define NEED_newSVpvn_flags
126127# include "ppport.h"
127128# include "shared.h"
128129#endif
@@ -872,10 +873,15 @@ sharedsv_elem_mg_FETCH(pTHX_ SV *sv, MAGIC *mg)
872873 svp = av_fetch ((AV * ) saggregate , mg -> mg_len , 0 );
873874 } else {
874875 char * key = mg -> mg_ptr ;
875- STRLEN len = mg -> mg_len ;
876+ I32 len = mg -> mg_len ;
876877 assert ( mg -> mg_ptr != 0 );
877878 if (mg -> mg_len == HEf_SVKEY ) {
878- key = SvPV ((SV * ) mg -> mg_ptr , len );
879+ STRLEN slen ;
880+ key = SvPV ((SV * )mg -> mg_ptr , slen );
881+ len = slen ;
882+ if (SvUTF8 ((SV * )mg -> mg_ptr )) {
883+ len = - len ;
884+ }
879885 }
880886 SHARED_CONTEXT ;
881887 svp = hv_fetch ((HV * ) saggregate , key , len , 0 );
@@ -923,10 +929,16 @@ sharedsv_elem_mg_STORE(pTHX_ SV *sv, MAGIC *mg)
923929 svp = av_fetch ((AV * ) saggregate , mg -> mg_len , 1 );
924930 } else {
925931 char * key = mg -> mg_ptr ;
926- STRLEN len = mg -> mg_len ;
932+ I32 len = mg -> mg_len ;
927933 assert ( mg -> mg_ptr != 0 );
928- if (mg -> mg_len == HEf_SVKEY )
929- key = SvPV ((SV * ) mg -> mg_ptr , len );
934+ if (mg -> mg_len == HEf_SVKEY ) {
935+ STRLEN slen ;
936+ key = SvPV ((SV * )mg -> mg_ptr , slen );
937+ len = slen ;
938+ if (SvUTF8 ((SV * )mg -> mg_ptr )) {
939+ len = - len ;
940+ }
941+ }
930942 SHARED_CONTEXT ;
931943 svp = hv_fetch ((HV * ) saggregate , key , len , 1 );
932944 }
@@ -954,10 +966,16 @@ sharedsv_elem_mg_DELETE(pTHX_ SV *sv, MAGIC *mg)
954966 av_delete ((AV * ) saggregate , mg -> mg_len , G_DISCARD );
955967 } else {
956968 char * key = mg -> mg_ptr ;
957- STRLEN len = mg -> mg_len ;
969+ I32 len = mg -> mg_len ;
958970 assert ( mg -> mg_ptr != 0 );
959- if (mg -> mg_len == HEf_SVKEY )
960- key = SvPV ((SV * ) mg -> mg_ptr , len );
971+ if (mg -> mg_len == HEf_SVKEY ) {
972+ STRLEN slen ;
973+ key = SvPV ((SV * )mg -> mg_ptr , slen );
974+ len = slen ;
975+ if (SvUTF8 ((SV * )mg -> mg_ptr )) {
976+ len = - len ;
977+ }
978+ }
961979 SHARED_CONTEXT ;
962980 hv_delete ((HV * ) saggregate , key , len , G_DISCARD );
963981 }
@@ -1274,8 +1292,13 @@ EXISTS(SV *obj, SV *index)
12741292 SHARED_EDIT ;
12751293 exists = av_exists ((AV * ) sobj , SvIV (index ));
12761294 } else {
1277- STRLEN len ;
1278- char * key = SvPV (index ,len );
1295+ I32 len ;
1296+ STRLEN slen ;
1297+ char * key = SvPVutf8 (index , slen );
1298+ len = slen ;
1299+ if (SvUTF8 (index )) {
1300+ len = - len ;
1301+ }
12791302 SHARED_EDIT ;
12801303 exists = hv_exists ((HV * ) sobj , key , len );
12811304 }
@@ -1297,9 +1320,10 @@ FIRSTKEY(SV *obj)
12971320 hv_iterinit ((HV * ) sobj );
12981321 entry = hv_iternext ((HV * ) sobj );
12991322 if (entry ) {
1323+ I32 utf8 = HeKUTF8 (entry );
13001324 key = hv_iterkey (entry ,& len );
13011325 CALLER_CONTEXT ;
1302- ST (0 ) = sv_2mortal (newSVpv (key , len ));
1326+ ST (0 ) = sv_2mortal (newSVpvn_utf8 (key , len , utf8 ));
13031327 } else {
13041328 CALLER_CONTEXT ;
13051329 ST (0 ) = & PL_sv_undef ;
@@ -1323,9 +1347,10 @@ NEXTKEY(SV *obj, SV *oldkey)
13231347 SHARED_CONTEXT ;
13241348 entry = hv_iternext ((HV * ) sobj );
13251349 if (entry ) {
1350+ I32 utf8 = HeKUTF8 (entry );
13261351 key = hv_iterkey (entry ,& len );
13271352 CALLER_CONTEXT ;
1328- ST (0 ) = sv_2mortal (newSVpv (key , len ));
1353+ ST (0 ) = sv_2mortal (newSVpvn_utf8 (key , len , utf8 ));
13291354 } else {
13301355 CALLER_CONTEXT ;
13311356 ST (0 ) = & PL_sv_undef ;
0 commit comments