This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate mainline
[perl5.git] / hv.c
... / ...
CommitLineData
1/* hv.c
2 *
3 * Copyright (c) 1991-2001, Larry Wall
4 *
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
7 *
8 */
9
10/*
11 * "I sit beside the fire and think of all that I have seen." --Bilbo
12 */
13
14#include "EXTERN.h"
15#define PERL_IN_HV_C
16#include "perl.h"
17
18STATIC HE*
19S_new_he(pTHX)
20{
21 HE* he;
22 LOCK_SV_MUTEX;
23 if (!PL_he_root)
24 more_he();
25 he = PL_he_root;
26 PL_he_root = HeNEXT(he);
27 UNLOCK_SV_MUTEX;
28 return he;
29}
30
31STATIC void
32S_del_he(pTHX_ HE *p)
33{
34 LOCK_SV_MUTEX;
35 HeNEXT(p) = (HE*)PL_he_root;
36 PL_he_root = p;
37 UNLOCK_SV_MUTEX;
38}
39
40STATIC void
41S_more_he(pTHX)
42{
43 register HE* he;
44 register HE* heend;
45 XPV *ptr;
46 New(54, ptr, 1008/sizeof(XPV), XPV);
47 ptr->xpv_pv = (char*)PL_he_arenaroot;
48 PL_he_arenaroot = ptr;
49
50 he = (HE*)ptr;
51 heend = &he[1008 / sizeof(HE) - 1];
52 PL_he_root = ++he;
53 while (he < heend) {
54 HeNEXT(he) = (HE*)(he + 1);
55 he++;
56 }
57 HeNEXT(he) = 0;
58}
59
60#ifdef PURIFY
61
62#define new_HE() (HE*)safemalloc(sizeof(HE))
63#define del_HE(p) safefree((char*)p)
64
65#else
66
67#define new_HE() new_he()
68#define del_HE(p) del_he(p)
69
70#endif
71
72STATIC HEK *
73S_save_hek(pTHX_ const char *str, I32 len, U32 hash)
74{
75 char *k;
76 register HEK *hek;
77 bool is_utf8 = FALSE;
78
79 if (len < 0) {
80 len = -len;
81 is_utf8 = TRUE;
82 }
83
84 New(54, k, HEK_BASESIZE + len + 1, char);
85 hek = (HEK*)k;
86 Copy(str, HEK_KEY(hek), len, char);
87 HEK_LEN(hek) = len;
88 HEK_HASH(hek) = hash;
89 HEK_UTF8(hek) = (char)is_utf8;
90 return hek;
91}
92
93void
94Perl_unshare_hek(pTHX_ HEK *hek)
95{
96 unsharepvn(HEK_KEY(hek),HEK_UTF8(hek)?-HEK_LEN(hek):HEK_LEN(hek),
97 HEK_HASH(hek));
98}
99
100#if defined(USE_ITHREADS)
101HE *
102Perl_he_dup(pTHX_ HE *e, bool shared, clone_params* param)
103{
104 HE *ret;
105
106 if (!e)
107 return Nullhe;
108 /* look for it in the table first */
109 ret = (HE*)ptr_table_fetch(PL_ptr_table, e);
110 if (ret)
111 return ret;
112
113 /* create anew and remember what it is */
114 ret = new_HE();
115 ptr_table_store(PL_ptr_table, e, ret);
116
117 HeNEXT(ret) = he_dup(HeNEXT(e),shared, param);
118 if (HeKLEN(e) == HEf_SVKEY)
119 HeKEY_sv(ret) = SvREFCNT_inc(sv_dup(HeKEY_sv(e), param));
120 else if (shared)
121 HeKEY_hek(ret) = share_hek(HeKEY(e), HeKLEN_UTF8(e), HeHASH(e));
122 else
123 HeKEY_hek(ret) = save_hek(HeKEY(e), HeKLEN_UTF8(e), HeHASH(e));
124 HeVAL(ret) = SvREFCNT_inc(sv_dup(HeVAL(e), param));
125 return ret;
126}
127#endif /* USE_ITHREADS */
128
129/* (klen == HEf_SVKEY) is special for MAGICAL hv entries, meaning key slot
130 * contains an SV* */
131
132/*
133=for apidoc hv_fetch
134
135Returns the SV which corresponds to the specified key in the hash. The
136C<klen> is the length of the key. If C<lval> is set then the fetch will be
137part of a store. Check that the return value is non-null before
138dereferencing it to a C<SV*>.
139
140See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
141information on how to use this function on tied hashes.
142
143=cut
144*/
145
146SV**
147Perl_hv_fetch(pTHX_ HV *hv, const char *key, I32 klen, I32 lval)
148{
149 register XPVHV* xhv;
150 register U32 hash;
151 register HE *entry;
152 SV *sv;
153 bool is_utf8 = FALSE;
154 const char *keysave = key;
155
156 if (!hv)
157 return 0;
158
159 if (klen < 0) {
160 klen = -klen;
161 is_utf8 = TRUE;
162 }
163
164 if (SvRMAGICAL(hv)) {
165 if (mg_find((SV*)hv, PERL_MAGIC_tied) || SvGMAGICAL((SV*)hv)) {
166 sv = sv_newmortal();
167 mg_copy((SV*)hv, sv, key, klen);
168 PL_hv_fetch_sv = sv;
169 return &PL_hv_fetch_sv;
170 }
171#ifdef ENV_IS_CASELESS
172 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
173 U32 i;
174 for (i = 0; i < klen; ++i)
175 if (isLOWER(key[i])) {
176 char *nkey = strupr(SvPVX(sv_2mortal(newSVpvn(key,klen))));
177 SV **ret = hv_fetch(hv, nkey, klen, 0);
178 if (!ret && lval)
179 ret = hv_store(hv, key, klen, NEWSV(61,0), 0);
180 return ret;
181 }
182 }
183#endif
184 }
185
186 /* We use xhv->xhv_foo fields directly instead of HvFOO(hv) to
187 avoid unnecessary pointer dereferencing. */
188 xhv = (XPVHV*)SvANY(hv);
189 if (!xhv->xhv_array /* !HvARRAY(hv) */) {
190 if (lval
191#ifdef DYNAMIC_ENV_FETCH /* if it's an %ENV lookup, we may get it on the fly */
192 || (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env))
193#endif
194 )
195 Newz(503, xhv->xhv_array /* HvARRAY(hv) */,
196 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
197 char);
198 else
199 return 0;
200 }
201
202 if (is_utf8) {
203 STRLEN tmplen = klen;
204 /* Just casting the &klen to (STRLEN) won't work well
205 * if STRLEN and I32 are of different widths. --jhi */
206 key = (char*)bytes_from_utf8((U8*)key, &tmplen, &is_utf8);
207 klen = tmplen;
208 }
209
210 PERL_HASH(hash, key, klen);
211
212 /* entry = (HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
213 entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
214 for (; entry; entry = HeNEXT(entry)) {
215 if (HeHASH(entry) != hash) /* strings can't be equal */
216 continue;
217 if (HeKLEN(entry) != klen)
218 continue;
219 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
220 continue;
221 if (HeKUTF8(entry) != (char)is_utf8)
222 continue;
223 if (key != keysave)
224 Safefree(key);
225 return &HeVAL(entry);
226 }
227#ifdef DYNAMIC_ENV_FETCH /* %ENV lookup? If so, try to fetch the value now */
228 if (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env)) {
229 unsigned long len;
230 char *env = PerlEnv_ENVgetenv_len(key,&len);
231 if (env) {
232 sv = newSVpvn(env,len);
233 SvTAINTED_on(sv);
234 if (key != keysave)
235 Safefree(key);
236 return hv_store(hv,key,klen,sv,hash);
237 }
238 }
239#endif
240 if (lval) { /* gonna assign to this, so it better be there */
241 sv = NEWSV(61,0);
242 if (key != keysave) { /* must be is_utf8 == 0 */
243 SV **ret = hv_store(hv,key,klen,sv,hash);
244 Safefree(key);
245 return ret;
246 }
247 else
248 return hv_store(hv,key,is_utf8?-klen:klen,sv,hash);
249 }
250 if (key != keysave)
251 Safefree(key);
252 return 0;
253}
254
255/* returns a HE * structure with the all fields set */
256/* note that hent_val will be a mortal sv for MAGICAL hashes */
257/*
258=for apidoc hv_fetch_ent
259
260Returns the hash entry which corresponds to the specified key in the hash.
261C<hash> must be a valid precomputed hash number for the given C<key>, or 0
262if you want the function to compute it. IF C<lval> is set then the fetch
263will be part of a store. Make sure the return value is non-null before
264accessing it. The return value when C<tb> is a tied hash is a pointer to a
265static location, so be sure to make a copy of the structure if you need to
266store it somewhere.
267
268See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
269information on how to use this function on tied hashes.
270
271=cut
272*/
273
274HE *
275Perl_hv_fetch_ent(pTHX_ HV *hv, SV *keysv, I32 lval, register U32 hash)
276{
277 register XPVHV* xhv;
278 register char *key;
279 STRLEN klen;
280 register HE *entry;
281 SV *sv;
282 bool is_utf8;
283 char *keysave;
284
285 if (!hv)
286 return 0;
287
288 if (SvRMAGICAL(hv)) {
289 if (mg_find((SV*)hv, PERL_MAGIC_tied) || SvGMAGICAL((SV*)hv)) {
290 sv = sv_newmortal();
291 keysv = sv_2mortal(newSVsv(keysv));
292 mg_copy((SV*)hv, sv, (char*)keysv, HEf_SVKEY);
293 if (!HeKEY_hek(&PL_hv_fetch_ent_mh)) {
294 char *k;
295 New(54, k, HEK_BASESIZE + sizeof(SV*), char);
296 HeKEY_hek(&PL_hv_fetch_ent_mh) = (HEK*)k;
297 }
298 HeSVKEY_set(&PL_hv_fetch_ent_mh, keysv);
299 HeVAL(&PL_hv_fetch_ent_mh) = sv;
300 return &PL_hv_fetch_ent_mh;
301 }
302#ifdef ENV_IS_CASELESS
303 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
304 U32 i;
305 key = SvPV(keysv, klen);
306 for (i = 0; i < klen; ++i)
307 if (isLOWER(key[i])) {
308 SV *nkeysv = sv_2mortal(newSVpvn(key,klen));
309 (void)strupr(SvPVX(nkeysv));
310 entry = hv_fetch_ent(hv, nkeysv, 0, 0);
311 if (!entry && lval)
312 entry = hv_store_ent(hv, keysv, NEWSV(61,0), hash);
313 return entry;
314 }
315 }
316#endif
317 }
318
319 xhv = (XPVHV*)SvANY(hv);
320 if (!xhv->xhv_array /* !HvARRAY(hv) */) {
321 if (lval
322#ifdef DYNAMIC_ENV_FETCH /* if it's an %ENV lookup, we may get it on the fly */
323 || (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env))
324#endif
325 )
326 Newz(503, xhv->xhv_array /* HvARRAY(hv) */,
327 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
328 char);
329 else
330 return 0;
331 }
332
333 keysave = key = SvPV(keysv, klen);
334 is_utf8 = (SvUTF8(keysv)!=0);
335
336 if (is_utf8)
337 key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8);
338
339 if (!hash)
340 PERL_HASH(hash, key, klen);
341
342 /* entry = (HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
343 entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
344 for (; entry; entry = HeNEXT(entry)) {
345 if (HeHASH(entry) != hash) /* strings can't be equal */
346 continue;
347 if (HeKLEN(entry) != klen)
348 continue;
349 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
350 continue;
351 if (HeKUTF8(entry) != (char)is_utf8)
352 continue;
353 if (key != keysave)
354 Safefree(key);
355 return entry;
356 }
357#ifdef DYNAMIC_ENV_FETCH /* %ENV lookup? If so, try to fetch the value now */
358 if (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env)) {
359 unsigned long len;
360 char *env = PerlEnv_ENVgetenv_len(key,&len);
361 if (env) {
362 sv = newSVpvn(env,len);
363 SvTAINTED_on(sv);
364 return hv_store_ent(hv,keysv,sv,hash);
365 }
366 }
367#endif
368 if (key != keysave)
369 Safefree(key);
370 if (lval) { /* gonna assign to this, so it better be there */
371 sv = NEWSV(61,0);
372 return hv_store_ent(hv,keysv,sv,hash);
373 }
374 return 0;
375}
376
377STATIC void
378S_hv_magic_check(pTHX_ HV *hv, bool *needs_copy, bool *needs_store)
379{
380 MAGIC *mg = SvMAGIC(hv);
381 *needs_copy = FALSE;
382 *needs_store = TRUE;
383 while (mg) {
384 if (isUPPER(mg->mg_type)) {
385 *needs_copy = TRUE;
386 switch (mg->mg_type) {
387 case PERL_MAGIC_tied:
388 case PERL_MAGIC_sig:
389 *needs_store = FALSE;
390 }
391 }
392 mg = mg->mg_moremagic;
393 }
394}
395
396/*
397=for apidoc hv_store
398
399Stores an SV in a hash. The hash key is specified as C<key> and C<klen> is
400the length of the key. The C<hash> parameter is the precomputed hash
401value; if it is zero then Perl will compute it. The return value will be
402NULL if the operation failed or if the value did not need to be actually
403stored within the hash (as in the case of tied hashes). Otherwise it can
404be dereferenced to get the original C<SV*>. Note that the caller is
405responsible for suitably incrementing the reference count of C<val> before
406the call, and decrementing it if the function returned NULL.
407
408See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
409information on how to use this function on tied hashes.
410
411=cut
412*/
413
414SV**
415Perl_hv_store(pTHX_ HV *hv, const char *key, I32 klen, SV *val, register U32 hash)
416{
417 register XPVHV* xhv;
418 register I32 i;
419 register HE *entry;
420 register HE **oentry;
421 bool is_utf8 = FALSE;
422 const char *keysave = key;
423
424 if (!hv)
425 return 0;
426
427 if (klen < 0) {
428 klen = -klen;
429 is_utf8 = TRUE;
430 }
431
432 xhv = (XPVHV*)SvANY(hv);
433 if (SvMAGICAL(hv)) {
434 bool needs_copy;
435 bool needs_store;
436 hv_magic_check (hv, &needs_copy, &needs_store);
437 if (needs_copy) {
438 mg_copy((SV*)hv, val, key, klen);
439 if (!xhv->xhv_array /* !HvARRAY */ && !needs_store)
440 return 0;
441#ifdef ENV_IS_CASELESS
442 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
443 key = savepvn(key,klen);
444 key = (const char*)strupr((char*)key);
445 hash = 0;
446 }
447#endif
448 }
449 }
450 if (is_utf8) {
451 STRLEN tmplen = klen;
452 /* See the note in hv_fetch(). --jhi */
453 key = (char*)bytes_from_utf8((U8*)key, &tmplen, &is_utf8);
454 klen = tmplen;
455 }
456
457 if (!hash)
458 PERL_HASH(hash, key, klen);
459
460 if (!xhv->xhv_array /* !HvARRAY(hv) */)
461 Newz(505, xhv->xhv_array /* HvARRAY(hv) */,
462 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
463 char);
464
465 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
466 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
467 i = 1;
468
469 for (entry = *oentry; entry; i=0, entry = HeNEXT(entry)) {
470 if (HeHASH(entry) != hash) /* strings can't be equal */
471 continue;
472 if (HeKLEN(entry) != klen)
473 continue;
474 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
475 continue;
476 if (HeKUTF8(entry) != (char)is_utf8)
477 continue;
478 SvREFCNT_dec(HeVAL(entry));
479 HeVAL(entry) = val;
480 if (key != keysave)
481 Safefree(key);
482 return &HeVAL(entry);
483 }
484
485 entry = new_HE();
486 if (HvSHAREKEYS(hv))
487 HeKEY_hek(entry) = share_hek(key, is_utf8?-klen:klen, hash);
488 else /* gotta do the real thing */
489 HeKEY_hek(entry) = save_hek(key, is_utf8?-klen:klen, hash);
490 if (key != keysave)
491 Safefree(key);
492 HeVAL(entry) = val;
493 HeNEXT(entry) = *oentry;
494 *oentry = entry;
495
496 xhv->xhv_keys++; /* HvKEYS(hv)++ */
497 if (i) { /* initial entry? */
498 xhv->xhv_fill++; /* HvFILL(hv)++ */
499 if (xhv->xhv_keys > xhv->xhv_max /* HvKEYS(hv) > HvMAX(hv) */)
500 hsplit(hv);
501 }
502
503 return &HeVAL(entry);
504}
505
506/*
507=for apidoc hv_store_ent
508
509Stores C<val> in a hash. The hash key is specified as C<key>. The C<hash>
510parameter is the precomputed hash value; if it is zero then Perl will
511compute it. The return value is the new hash entry so created. It will be
512NULL if the operation failed or if the value did not need to be actually
513stored within the hash (as in the case of tied hashes). Otherwise the
514contents of the return value can be accessed using the C<He?> macros
515described here. Note that the caller is responsible for suitably
516incrementing the reference count of C<val> before the call, and
517decrementing it if the function returned NULL.
518
519See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
520information on how to use this function on tied hashes.
521
522=cut
523*/
524
525HE *
526Perl_hv_store_ent(pTHX_ HV *hv, SV *keysv, SV *val, register U32 hash)
527{
528 register XPVHV* xhv;
529 register char *key;
530 STRLEN klen;
531 register I32 i;
532 register HE *entry;
533 register HE **oentry;
534 bool is_utf8;
535 char *keysave;
536
537 if (!hv)
538 return 0;
539
540 xhv = (XPVHV*)SvANY(hv);
541 if (SvMAGICAL(hv)) {
542 bool needs_copy;
543 bool needs_store;
544 hv_magic_check (hv, &needs_copy, &needs_store);
545 if (needs_copy) {
546 bool save_taint = PL_tainted;
547 if (PL_tainting)
548 PL_tainted = SvTAINTED(keysv);
549 keysv = sv_2mortal(newSVsv(keysv));
550 mg_copy((SV*)hv, val, (char*)keysv, HEf_SVKEY);
551 TAINT_IF(save_taint);
552 if (!xhv->xhv_array /* !HvARRAY(hv) */ && !needs_store)
553 return Nullhe;
554#ifdef ENV_IS_CASELESS
555 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
556 key = SvPV(keysv, klen);
557 keysv = sv_2mortal(newSVpvn(key,klen));
558 (void)strupr(SvPVX(keysv));
559 hash = 0;
560 }
561#endif
562 }
563 }
564
565 keysave = key = SvPV(keysv, klen);
566 is_utf8 = (SvUTF8(keysv) != 0);
567
568 if (is_utf8)
569 key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8);
570
571 if (!hash)
572 PERL_HASH(hash, key, klen);
573
574 if (!xhv->xhv_array /* !HvARRAY(hv) */)
575 Newz(505, xhv->xhv_array /* HvARRAY(hv) */,
576 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
577 char);
578
579 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
580 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
581 i = 1;
582
583 for (entry = *oentry; entry; i=0, entry = HeNEXT(entry)) {
584 if (HeHASH(entry) != hash) /* strings can't be equal */
585 continue;
586 if (HeKLEN(entry) != klen)
587 continue;
588 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
589 continue;
590 if (HeKUTF8(entry) != (char)is_utf8)
591 continue;
592 SvREFCNT_dec(HeVAL(entry));
593 HeVAL(entry) = val;
594 if (key != keysave)
595 Safefree(key);
596 return entry;
597 }
598
599 entry = new_HE();
600 if (HvSHAREKEYS(hv))
601 HeKEY_hek(entry) = share_hek(key, is_utf8?-(I32)klen:klen, hash);
602 else /* gotta do the real thing */
603 HeKEY_hek(entry) = save_hek(key, is_utf8?-(I32)klen:klen, hash);
604 if (key != keysave)
605 Safefree(key);
606 HeVAL(entry) = val;
607 HeNEXT(entry) = *oentry;
608 *oentry = entry;
609
610 xhv->xhv_keys++; /* HvKEYS(hv)++ */
611 if (i) { /* initial entry? */
612 xhv->xhv_fill++; /* HvFILL(hv)++ */
613 if (xhv->xhv_keys > xhv->xhv_max /* HvKEYS(hv) > HvMAX(hv) */)
614 hsplit(hv);
615 }
616
617 return entry;
618}
619
620/*
621=for apidoc hv_delete
622
623Deletes a key/value pair in the hash. The value SV is removed from the
624hash and returned to the caller. The C<klen> is the length of the key.
625The C<flags> value will normally be zero; if set to G_DISCARD then NULL
626will be returned.
627
628=cut
629*/
630
631SV *
632Perl_hv_delete(pTHX_ HV *hv, const char *key, I32 klen, I32 flags)
633{
634 register XPVHV* xhv;
635 register I32 i;
636 register U32 hash;
637 register HE *entry;
638 register HE **oentry;
639 SV **svp;
640 SV *sv;
641 bool is_utf8 = FALSE;
642 const char *keysave = key;
643
644 if (!hv)
645 return Nullsv;
646 if (klen < 0) {
647 klen = -klen;
648 is_utf8 = TRUE;
649 }
650 if (SvRMAGICAL(hv)) {
651 bool needs_copy;
652 bool needs_store;
653 hv_magic_check (hv, &needs_copy, &needs_store);
654
655 if (needs_copy && (svp = hv_fetch(hv, key, klen, TRUE))) {
656 sv = *svp;
657 mg_clear(sv);
658 if (!needs_store) {
659 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
660 /* No longer an element */
661 sv_unmagic(sv, PERL_MAGIC_tiedelem);
662 return sv;
663 }
664 return Nullsv; /* element cannot be deleted */
665 }
666#ifdef ENV_IS_CASELESS
667 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
668 sv = sv_2mortal(newSVpvn(key,klen));
669 key = strupr(SvPVX(sv));
670 }
671#endif
672 }
673 }
674 xhv = (XPVHV*)SvANY(hv);
675 if (!xhv->xhv_array /* !HvARRAY(hv) */)
676 return Nullsv;
677
678 if (is_utf8) {
679 STRLEN tmplen = klen;
680 /* See the note in hv_fetch(). --jhi */
681 key = (char*)bytes_from_utf8((U8*)key, &tmplen, &is_utf8);
682 klen = tmplen;
683 }
684
685 PERL_HASH(hash, key, klen);
686
687 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
688 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
689 entry = *oentry;
690 i = 1;
691 for (; entry; i=0, oentry = &HeNEXT(entry), entry = *oentry) {
692 if (HeHASH(entry) != hash) /* strings can't be equal */
693 continue;
694 if (HeKLEN(entry) != klen)
695 continue;
696 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
697 continue;
698 if (HeKUTF8(entry) != (char)is_utf8)
699 continue;
700 if (key != keysave)
701 Safefree(key);
702 *oentry = HeNEXT(entry);
703 if (i && !*oentry)
704 xhv->xhv_fill--; /* HvFILL(hv)-- */
705 if (flags & G_DISCARD)
706 sv = Nullsv;
707 else {
708 sv = sv_2mortal(HeVAL(entry));
709 HeVAL(entry) = &PL_sv_undef;
710 }
711 if (entry == xhv->xhv_eiter /* HvEITER(hv) */)
712 HvLAZYDEL_on(hv);
713 else
714 hv_free_ent(hv, entry);
715 xhv->xhv_keys--; /* HvKEYS(hv)-- */
716 return sv;
717 }
718 if (key != keysave)
719 Safefree(key);
720 return Nullsv;
721}
722
723/*
724=for apidoc hv_delete_ent
725
726Deletes a key/value pair in the hash. The value SV is removed from the
727hash and returned to the caller. The C<flags> value will normally be zero;
728if set to G_DISCARD then NULL will be returned. C<hash> can be a valid
729precomputed hash value, or 0 to ask for it to be computed.
730
731=cut
732*/
733
734SV *
735Perl_hv_delete_ent(pTHX_ HV *hv, SV *keysv, I32 flags, U32 hash)
736{
737 register XPVHV* xhv;
738 register I32 i;
739 register char *key;
740 STRLEN klen;
741 register HE *entry;
742 register HE **oentry;
743 SV *sv;
744 bool is_utf8;
745 char *keysave;
746
747 if (!hv)
748 return Nullsv;
749 if (SvRMAGICAL(hv)) {
750 bool needs_copy;
751 bool needs_store;
752 hv_magic_check (hv, &needs_copy, &needs_store);
753
754 if (needs_copy && (entry = hv_fetch_ent(hv, keysv, TRUE, hash))) {
755 sv = HeVAL(entry);
756 mg_clear(sv);
757 if (!needs_store) {
758 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
759 /* No longer an element */
760 sv_unmagic(sv, PERL_MAGIC_tiedelem);
761 return sv;
762 }
763 return Nullsv; /* element cannot be deleted */
764 }
765#ifdef ENV_IS_CASELESS
766 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
767 key = SvPV(keysv, klen);
768 keysv = sv_2mortal(newSVpvn(key,klen));
769 (void)strupr(SvPVX(keysv));
770 hash = 0;
771 }
772#endif
773 }
774 }
775 xhv = (XPVHV*)SvANY(hv);
776 if (!xhv->xhv_array /* !HvARRAY(hv) */)
777 return Nullsv;
778
779 keysave = key = SvPV(keysv, klen);
780 is_utf8 = (SvUTF8(keysv) != 0);
781
782 if (is_utf8)
783 key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8);
784
785 if (!hash)
786 PERL_HASH(hash, key, klen);
787
788 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
789 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
790 entry = *oentry;
791 i = 1;
792 for (; entry; i=0, oentry = &HeNEXT(entry), entry = *oentry) {
793 if (HeHASH(entry) != hash) /* strings can't be equal */
794 continue;
795 if (HeKLEN(entry) != klen)
796 continue;
797 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
798 continue;
799 if (HeKUTF8(entry) != (char)is_utf8)
800 continue;
801 if (key != keysave)
802 Safefree(key);
803 *oentry = HeNEXT(entry);
804 if (i && !*oentry)
805 xhv->xhv_fill--; /* HvFILL(hv)-- */
806 if (flags & G_DISCARD)
807 sv = Nullsv;
808 else {
809 sv = sv_2mortal(HeVAL(entry));
810 HeVAL(entry) = &PL_sv_undef;
811 }
812 if (entry == xhv->xhv_eiter /* HvEITER(hv) */)
813 HvLAZYDEL_on(hv);
814 else
815 hv_free_ent(hv, entry);
816 xhv->xhv_keys--; /* HvKEYS(hv)-- */
817 return sv;
818 }
819 if (key != keysave)
820 Safefree(key);
821 return Nullsv;
822}
823
824/*
825=for apidoc hv_exists
826
827Returns a boolean indicating whether the specified hash key exists. The
828C<klen> is the length of the key.
829
830=cut
831*/
832
833bool
834Perl_hv_exists(pTHX_ HV *hv, const char *key, I32 klen)
835{
836 register XPVHV* xhv;
837 register U32 hash;
838 register HE *entry;
839 SV *sv;
840 bool is_utf8 = FALSE;
841 const char *keysave = key;
842
843 if (!hv)
844 return 0;
845
846 if (klen < 0) {
847 klen = -klen;
848 is_utf8 = TRUE;
849 }
850
851 if (SvRMAGICAL(hv)) {
852 if (mg_find((SV*)hv, PERL_MAGIC_tied) || SvGMAGICAL((SV*)hv)) {
853 sv = sv_newmortal();
854 mg_copy((SV*)hv, sv, key, klen);
855 magic_existspack(sv, mg_find(sv, PERL_MAGIC_tiedelem));
856 return SvTRUE(sv);
857 }
858#ifdef ENV_IS_CASELESS
859 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
860 sv = sv_2mortal(newSVpvn(key,klen));
861 key = strupr(SvPVX(sv));
862 }
863#endif
864 }
865
866 xhv = (XPVHV*)SvANY(hv);
867#ifndef DYNAMIC_ENV_FETCH
868 if (!xhv->xhv_array /* !HvARRAY(hv) */)
869 return 0;
870#endif
871
872 if (is_utf8) {
873 STRLEN tmplen = klen;
874 /* See the note in hv_fetch(). --jhi */
875 key = (char*)bytes_from_utf8((U8*)key, &tmplen, &is_utf8);
876 klen = tmplen;
877 }
878
879 PERL_HASH(hash, key, klen);
880
881#ifdef DYNAMIC_ENV_FETCH
882 if (!xhv->xhv_array /* !HvARRAY(hv) */) entry = Null(HE*);
883 else
884#endif
885 /* entry = (HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
886 entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
887 for (; entry; entry = HeNEXT(entry)) {
888 if (HeHASH(entry) != hash) /* strings can't be equal */
889 continue;
890 if (HeKLEN(entry) != klen)
891 continue;
892 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
893 continue;
894 if (HeKUTF8(entry) != (char)is_utf8)
895 continue;
896 if (key != keysave)
897 Safefree(key);
898 return TRUE;
899 }
900#ifdef DYNAMIC_ENV_FETCH /* is it out there? */
901 if (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env)) {
902 unsigned long len;
903 char *env = PerlEnv_ENVgetenv_len(key,&len);
904 if (env) {
905 sv = newSVpvn(env,len);
906 SvTAINTED_on(sv);
907 (void)hv_store(hv,key,klen,sv,hash);
908 return TRUE;
909 }
910 }
911#endif
912 if (key != keysave)
913 Safefree(key);
914 return FALSE;
915}
916
917
918/*
919=for apidoc hv_exists_ent
920
921Returns a boolean indicating whether the specified hash key exists. C<hash>
922can be a valid precomputed hash value, or 0 to ask for it to be
923computed.
924
925=cut
926*/
927
928bool
929Perl_hv_exists_ent(pTHX_ HV *hv, SV *keysv, U32 hash)
930{
931 register XPVHV* xhv;
932 register char *key;
933 STRLEN klen;
934 register HE *entry;
935 SV *sv;
936 bool is_utf8;
937 char *keysave;
938
939 if (!hv)
940 return 0;
941
942 if (SvRMAGICAL(hv)) {
943 if (mg_find((SV*)hv, PERL_MAGIC_tied) || SvGMAGICAL((SV*)hv)) {
944 SV* svret = sv_newmortal();
945 sv = sv_newmortal();
946 keysv = sv_2mortal(newSVsv(keysv));
947 mg_copy((SV*)hv, sv, (char*)keysv, HEf_SVKEY);
948 magic_existspack(svret, mg_find(sv, PERL_MAGIC_tiedelem));
949 return SvTRUE(svret);
950 }
951#ifdef ENV_IS_CASELESS
952 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
953 key = SvPV(keysv, klen);
954 keysv = sv_2mortal(newSVpvn(key,klen));
955 (void)strupr(SvPVX(keysv));
956 hash = 0;
957 }
958#endif
959 }
960
961 xhv = (XPVHV*)SvANY(hv);
962#ifndef DYNAMIC_ENV_FETCH
963 if (!xhv->xhv_array /* !HvARRAY(hv) */)
964 return 0;
965#endif
966
967 keysave = key = SvPV(keysv, klen);
968 is_utf8 = (SvUTF8(keysv) != 0);
969 if (is_utf8)
970 key = (char*)bytes_from_utf8((U8*)key, &klen, &is_utf8);
971 if (!hash)
972 PERL_HASH(hash, key, klen);
973
974#ifdef DYNAMIC_ENV_FETCH
975 if (!xhv->xhv_array /* !HvARRAY(hv) */) entry = Null(HE*);
976 else
977#endif
978 /* entry = (HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
979 entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
980 for (; entry; entry = HeNEXT(entry)) {
981 if (HeHASH(entry) != hash) /* strings can't be equal */
982 continue;
983 if (HeKLEN(entry) != klen)
984 continue;
985 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
986 continue;
987 if (HeKUTF8(entry) != (char)is_utf8)
988 continue;
989 if (key != keysave)
990 Safefree(key);
991 return TRUE;
992 }
993#ifdef DYNAMIC_ENV_FETCH /* is it out there? */
994 if (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env)) {
995 unsigned long len;
996 char *env = PerlEnv_ENVgetenv_len(key,&len);
997 if (env) {
998 sv = newSVpvn(env,len);
999 SvTAINTED_on(sv);
1000 (void)hv_store_ent(hv,keysv,sv,hash);
1001 return TRUE;
1002 }
1003 }
1004#endif
1005 if (key != keysave)
1006 Safefree(key);
1007 return FALSE;
1008}
1009
1010STATIC void
1011S_hsplit(pTHX_ HV *hv)
1012{
1013 register XPVHV* xhv = (XPVHV*)SvANY(hv);
1014 I32 oldsize = (I32) xhv->xhv_max+1; /* HvMAX(hv)+1 (sick) */
1015 register I32 newsize = oldsize * 2;
1016 register I32 i;
1017 register char *a = xhv->xhv_array; /* HvARRAY(hv) */
1018 register HE **aep;
1019 register HE **bep;
1020 register HE *entry;
1021 register HE **oentry;
1022
1023 PL_nomemok = TRUE;
1024#if defined(STRANGE_MALLOC) || defined(MYMALLOC)
1025 Renew(a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
1026 if (!a) {
1027 PL_nomemok = FALSE;
1028 return;
1029 }
1030#else
1031 New(2, a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
1032 if (!a) {
1033 PL_nomemok = FALSE;
1034 return;
1035 }
1036 Copy(xhv->xhv_array /* HvARRAY(hv) */, a, oldsize * sizeof(HE*), char);
1037 if (oldsize >= 64) {
1038 offer_nice_chunk(xhv->xhv_array /* HvARRAY(hv) */,
1039 PERL_HV_ARRAY_ALLOC_BYTES(oldsize));
1040 }
1041 else
1042 Safefree(xhv->xhv_array /* HvARRAY(hv) */);
1043#endif
1044
1045 PL_nomemok = FALSE;
1046 Zero(&a[oldsize * sizeof(HE*)], (newsize-oldsize) * sizeof(HE*), char); /* zero 2nd half*/
1047 xhv->xhv_max = --newsize; /* HvMAX(hv) = --newsize */
1048 xhv->xhv_array = a; /* HvARRAY(hv) = a */
1049 aep = (HE**)a;
1050
1051 for (i=0; i<oldsize; i++,aep++) {
1052 if (!*aep) /* non-existent */
1053 continue;
1054 bep = aep+oldsize;
1055 for (oentry = aep, entry = *aep; entry; entry = *oentry) {
1056 if ((HeHASH(entry) & newsize) != i) {
1057 *oentry = HeNEXT(entry);
1058 HeNEXT(entry) = *bep;
1059 if (!*bep)
1060 xhv->xhv_fill++; /* HvFILL(hv)++ */
1061 *bep = entry;
1062 continue;
1063 }
1064 else
1065 oentry = &HeNEXT(entry);
1066 }
1067 if (!*aep) /* everything moved */
1068 xhv->xhv_fill--; /* HvFILL(hv)-- */
1069 }
1070}
1071
1072void
1073Perl_hv_ksplit(pTHX_ HV *hv, IV newmax)
1074{
1075 register XPVHV* xhv = (XPVHV*)SvANY(hv);
1076 I32 oldsize = (I32) xhv->xhv_max+1; /* HvMAX(hv)+1 (sick) */
1077 register I32 newsize;
1078 register I32 i;
1079 register I32 j;
1080 register char *a;
1081 register HE **aep;
1082 register HE *entry;
1083 register HE **oentry;
1084
1085 newsize = (I32) newmax; /* possible truncation here */
1086 if (newsize != newmax || newmax <= oldsize)
1087 return;
1088 while ((newsize & (1 + ~newsize)) != newsize) {
1089 newsize &= ~(newsize & (1 + ~newsize)); /* get proper power of 2 */
1090 }
1091 if (newsize < newmax)
1092 newsize *= 2;
1093 if (newsize < newmax)
1094 return; /* overflow detection */
1095
1096 a = xhv->xhv_array; /* HvARRAY(hv) */
1097 if (a) {
1098 PL_nomemok = TRUE;
1099#if defined(STRANGE_MALLOC) || defined(MYMALLOC)
1100 Renew(a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
1101 if (!a) {
1102 PL_nomemok = FALSE;
1103 return;
1104 }
1105#else
1106 New(2, a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
1107 if (!a) {
1108 PL_nomemok = FALSE;
1109 return;
1110 }
1111 Copy(xhv->xhv_array /* HvARRAY(hv) */, a, oldsize * sizeof(HE*), char);
1112 if (oldsize >= 64) {
1113 offer_nice_chunk(xhv->xhv_array /* HvARRAY(hv) */,
1114 PERL_HV_ARRAY_ALLOC_BYTES(oldsize));
1115 }
1116 else
1117 Safefree(xhv->xhv_array /* HvARRAY(hv) */);
1118#endif
1119 PL_nomemok = FALSE;
1120 Zero(&a[oldsize * sizeof(HE*)], (newsize-oldsize) * sizeof(HE*), char); /* zero 2nd half*/
1121 }
1122 else {
1123 Newz(0, a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
1124 }
1125 xhv->xhv_max = --newsize; /* HvMAX(hv) = --newsize */
1126 xhv->xhv_array = a; /* HvARRAY(hv) = a */
1127 if (!xhv->xhv_fill /* !HvFILL(hv) */) /* skip rest if no entries */
1128 return;
1129
1130 aep = (HE**)a;
1131 for (i=0; i<oldsize; i++,aep++) {
1132 if (!*aep) /* non-existent */
1133 continue;
1134 for (oentry = aep, entry = *aep; entry; entry = *oentry) {
1135 if ((j = (HeHASH(entry) & newsize)) != i) {
1136 j -= i;
1137 *oentry = HeNEXT(entry);
1138 if (!(HeNEXT(entry) = aep[j]))
1139 xhv->xhv_fill++; /* HvFILL(hv)++ */
1140 aep[j] = entry;
1141 continue;
1142 }
1143 else
1144 oentry = &HeNEXT(entry);
1145 }
1146 if (!*aep) /* everything moved */
1147 xhv->xhv_fill--; /* HvFILL(hv)-- */
1148 }
1149}
1150
1151/*
1152=for apidoc newHV
1153
1154Creates a new HV. The reference count is set to 1.
1155
1156=cut
1157*/
1158
1159HV *
1160Perl_newHV(pTHX)
1161{
1162 register HV *hv;
1163 register XPVHV* xhv;
1164
1165 hv = (HV*)NEWSV(502,0);
1166 sv_upgrade((SV *)hv, SVt_PVHV);
1167 xhv = (XPVHV*)SvANY(hv);
1168 SvPOK_off(hv);
1169 SvNOK_off(hv);
1170#ifndef NODEFAULT_SHAREKEYS
1171 HvSHAREKEYS_on(hv); /* key-sharing on by default */
1172#endif
1173 xhv->xhv_max = 7; /* HvMAX(hv) = 7 (start with 8 buckets) */
1174 xhv->xhv_fill = 0; /* HvFILL(hv) = 0 */
1175 xhv->xhv_pmroot = 0; /* HvPMROOT(hv) = 0 */
1176 (void)hv_iterinit(hv); /* so each() will start off right */
1177 return hv;
1178}
1179
1180HV *
1181Perl_newHVhv(pTHX_ HV *ohv)
1182{
1183 register HV *hv;
1184 STRLEN hv_max = ohv ? HvMAX(ohv) : 0;
1185 STRLEN hv_fill = ohv ? HvFILL(ohv) : 0;
1186
1187 hv = newHV();
1188 while (hv_max && hv_max + 1 >= hv_fill * 2)
1189 hv_max = hv_max / 2; /* Is always 2^n-1 */
1190 HvMAX(hv) = hv_max;
1191 if (!hv_fill)
1192 return hv;
1193
1194#if 0
1195 if (! SvTIED_mg((SV*)ohv, PERL_MAGIC_tied)) {
1196 /* Quick way ???*/
1197 }
1198 else
1199#endif
1200 {
1201 HE *entry;
1202 I32 hv_riter = HvRITER(ohv); /* current root of iterator */
1203 HE *hv_eiter = HvEITER(ohv); /* current entry of iterator */
1204
1205 /* Slow way */
1206 hv_iterinit(ohv);
1207 while ((entry = hv_iternext(ohv))) {
1208 hv_store(hv, HeKEY(entry), HeKLEN_UTF8(entry),
1209 newSVsv(HeVAL(entry)), HeHASH(entry));
1210 }
1211 HvRITER(ohv) = hv_riter;
1212 HvEITER(ohv) = hv_eiter;
1213 }
1214
1215 return hv;
1216}
1217
1218void
1219Perl_hv_free_ent(pTHX_ HV *hv, register HE *entry)
1220{
1221 SV *val;
1222
1223 if (!entry)
1224 return;
1225 val = HeVAL(entry);
1226 if (val && isGV(val) && GvCVu(val) && HvNAME(hv))
1227 PL_sub_generation++; /* may be deletion of method from stash */
1228 SvREFCNT_dec(val);
1229 if (HeKLEN(entry) == HEf_SVKEY) {
1230 SvREFCNT_dec(HeKEY_sv(entry));
1231 Safefree(HeKEY_hek(entry));
1232 }
1233 else if (HvSHAREKEYS(hv))
1234 unshare_hek(HeKEY_hek(entry));
1235 else
1236 Safefree(HeKEY_hek(entry));
1237 del_HE(entry);
1238}
1239
1240void
1241Perl_hv_delayfree_ent(pTHX_ HV *hv, register HE *entry)
1242{
1243 if (!entry)
1244 return;
1245 if (isGV(HeVAL(entry)) && GvCVu(HeVAL(entry)) && HvNAME(hv))
1246 PL_sub_generation++; /* may be deletion of method from stash */
1247 sv_2mortal(HeVAL(entry)); /* free between statements */
1248 if (HeKLEN(entry) == HEf_SVKEY) {
1249 sv_2mortal(HeKEY_sv(entry));
1250 Safefree(HeKEY_hek(entry));
1251 }
1252 else if (HvSHAREKEYS(hv))
1253 unshare_hek(HeKEY_hek(entry));
1254 else
1255 Safefree(HeKEY_hek(entry));
1256 del_HE(entry);
1257}
1258
1259/*
1260=for apidoc hv_clear
1261
1262Clears a hash, making it empty.
1263
1264=cut
1265*/
1266
1267void
1268Perl_hv_clear(pTHX_ HV *hv)
1269{
1270 register XPVHV* xhv;
1271 if (!hv)
1272 return;
1273 xhv = (XPVHV*)SvANY(hv);
1274 hfreeentries(hv);
1275 xhv->xhv_fill = 0; /* HvFILL(hv) = 0 */
1276 xhv->xhv_keys = 0; /* HvKEYS(hv) = 0 */
1277 if (xhv->xhv_array /* HvARRAY(hv) */)
1278 (void)memzero(xhv->xhv_array /* HvARRAY(hv) */,
1279 (xhv->xhv_max+1 /* HvMAX(hv)+1 */) * sizeof(HE*));
1280
1281 if (SvRMAGICAL(hv))
1282 mg_clear((SV*)hv);
1283}
1284
1285STATIC void
1286S_hfreeentries(pTHX_ HV *hv)
1287{
1288 register HE **array;
1289 register HE *entry;
1290 register HE *oentry = Null(HE*);
1291 I32 riter;
1292 I32 max;
1293
1294 if (!hv)
1295 return;
1296 if (!HvARRAY(hv))
1297 return;
1298
1299 riter = 0;
1300 max = HvMAX(hv);
1301 array = HvARRAY(hv);
1302 entry = array[0];
1303 for (;;) {
1304 if (entry) {
1305 oentry = entry;
1306 entry = HeNEXT(entry);
1307 hv_free_ent(hv, oentry);
1308 }
1309 if (!entry) {
1310 if (++riter > max)
1311 break;
1312 entry = array[riter];
1313 }
1314 }
1315 (void)hv_iterinit(hv);
1316}
1317
1318/*
1319=for apidoc hv_undef
1320
1321Undefines the hash.
1322
1323=cut
1324*/
1325
1326void
1327Perl_hv_undef(pTHX_ HV *hv)
1328{
1329 register XPVHV* xhv;
1330 if (!hv)
1331 return;
1332 xhv = (XPVHV*)SvANY(hv);
1333 hfreeentries(hv);
1334 Safefree(xhv->xhv_array /* HvARRAY(hv) */);
1335 if (HvNAME(hv)) {
1336 Safefree(HvNAME(hv));
1337 HvNAME(hv) = 0;
1338 }
1339 xhv->xhv_max = 7; /* HvMAX(hv) = 7 (it's a normal hash) */
1340 xhv->xhv_array = 0; /* HvARRAY(hv) = 0 */
1341 xhv->xhv_fill = 0; /* HvFILL(hv) = 0 */
1342 xhv->xhv_keys = 0; /* HvKEYS(hv) = 0 */
1343
1344 if (SvRMAGICAL(hv))
1345 mg_clear((SV*)hv);
1346}
1347
1348/*
1349=for apidoc hv_iterinit
1350
1351Prepares a starting point to traverse a hash table. Returns the number of
1352keys in the hash (i.e. the same as C<HvKEYS(tb)>). The return value is
1353currently only meaningful for hashes without tie magic.
1354
1355NOTE: Before version 5.004_65, C<hv_iterinit> used to return the number of
1356hash buckets that happen to be in use. If you still need that esoteric
1357value, you can get it through the macro C<HvFILL(tb)>.
1358
1359=cut
1360*/
1361
1362I32
1363Perl_hv_iterinit(pTHX_ HV *hv)
1364{
1365 register XPVHV* xhv;
1366 HE *entry;
1367
1368 if (!hv)
1369 Perl_croak(aTHX_ "Bad hash");
1370 xhv = (XPVHV*)SvANY(hv);
1371 entry = xhv->xhv_eiter; /* HvEITER(hv) */
1372 if (entry && HvLAZYDEL(hv)) { /* was deleted earlier? */
1373 HvLAZYDEL_off(hv);
1374 hv_free_ent(hv, entry);
1375 }
1376 xhv->xhv_riter = -1; /* HvRITER(hv) = -1 */
1377 xhv->xhv_eiter = Null(HE*); /* HvEITER(hv) = Null(HE*) */
1378 /* used to be xhv->xhv_fill before 5.004_65 */
1379 return xhv->xhv_keys; /* HvKEYS(hv) */
1380}
1381
1382/*
1383=for apidoc hv_iternext
1384
1385Returns entries from a hash iterator. See C<hv_iterinit>.
1386
1387=cut
1388*/
1389
1390HE *
1391Perl_hv_iternext(pTHX_ HV *hv)
1392{
1393 register XPVHV* xhv;
1394 register HE *entry;
1395 HE *oldentry;
1396 MAGIC* mg;
1397
1398 if (!hv)
1399 Perl_croak(aTHX_ "Bad hash");
1400 xhv = (XPVHV*)SvANY(hv);
1401 oldentry = entry = xhv->xhv_eiter; /* HvEITER(hv) */
1402
1403 if ((mg = SvTIED_mg((SV*)hv, PERL_MAGIC_tied))) {
1404 SV *key = sv_newmortal();
1405 if (entry) {
1406 sv_setsv(key, HeSVKEY_force(entry));
1407 SvREFCNT_dec(HeSVKEY(entry)); /* get rid of previous key */
1408 }
1409 else {
1410 char *k;
1411 HEK *hek;
1412
1413 /* one HE per MAGICAL hash */
1414 xhv->xhv_eiter = entry = new_HE(); /* HvEITER(hv) = new_HE() */
1415 Zero(entry, 1, HE);
1416 Newz(54, k, HEK_BASESIZE + sizeof(SV*), char);
1417 hek = (HEK*)k;
1418 HeKEY_hek(entry) = hek;
1419 HeKLEN(entry) = HEf_SVKEY;
1420 }
1421 magic_nextpack((SV*) hv,mg,key);
1422 if (SvOK(key)) {
1423 /* force key to stay around until next time */
1424 HeSVKEY_set(entry, SvREFCNT_inc(key));
1425 return entry; /* beware, hent_val is not set */
1426 }
1427 if (HeVAL(entry))
1428 SvREFCNT_dec(HeVAL(entry));
1429 Safefree(HeKEY_hek(entry));
1430 del_HE(entry);
1431 xhv->xhv_eiter = Null(HE*); /* HvEITER(hv) = Null(HE*) */
1432 return Null(HE*);
1433 }
1434#ifdef DYNAMIC_ENV_FETCH /* set up %ENV for iteration */
1435 if (!entry && SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env))
1436 prime_env_iter();
1437#endif
1438
1439 if (!xhv->xhv_array /* !HvARRAY(hv) */)
1440 Newz(506, xhv->xhv_array /* HvARRAY(hv) */,
1441 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
1442 char);
1443 if (entry)
1444 entry = HeNEXT(entry);
1445 while (!entry) {
1446 xhv->xhv_riter++; /* HvRITER(hv)++ */
1447 if (xhv->xhv_riter > xhv->xhv_max /* HvRITER(hv) > HvMAX(hv) */) {
1448 xhv->xhv_riter = -1; /* HvRITER(hv) = -1 */
1449 break;
1450 }
1451 /* entry = (HvARRAY(hv))[HvRITER(hv)]; */
1452 entry = ((HE**)xhv->xhv_array)[xhv->xhv_riter];
1453 }
1454
1455 if (oldentry && HvLAZYDEL(hv)) { /* was deleted earlier? */
1456 HvLAZYDEL_off(hv);
1457 hv_free_ent(hv, oldentry);
1458 }
1459
1460 xhv->xhv_eiter = entry; /* HvEITER(hv) = entry */
1461 return entry;
1462}
1463
1464/*
1465=for apidoc hv_iterkey
1466
1467Returns the key from the current position of the hash iterator. See
1468C<hv_iterinit>.
1469
1470=cut
1471*/
1472
1473char *
1474Perl_hv_iterkey(pTHX_ register HE *entry, I32 *retlen)
1475{
1476 if (HeKLEN(entry) == HEf_SVKEY) {
1477 STRLEN len;
1478 char *p = SvPV(HeKEY_sv(entry), len);
1479 *retlen = len;
1480 return p;
1481 }
1482 else {
1483 *retlen = HeKLEN(entry);
1484 return HeKEY(entry);
1485 }
1486}
1487
1488/* unlike hv_iterval(), this always returns a mortal copy of the key */
1489/*
1490=for apidoc hv_iterkeysv
1491
1492Returns the key as an C<SV*> from the current position of the hash
1493iterator. The return value will always be a mortal copy of the key. Also
1494see C<hv_iterinit>.
1495
1496=cut
1497*/
1498
1499SV *
1500Perl_hv_iterkeysv(pTHX_ register HE *entry)
1501{
1502 if (HeKLEN(entry) == HEf_SVKEY)
1503 return sv_mortalcopy(HeKEY_sv(entry));
1504 else
1505 return sv_2mortal(newSVpvn_share((HeKLEN(entry) ? HeKEY(entry) : ""),
1506 HeKLEN_UTF8(entry), HeHASH(entry)));
1507}
1508
1509/*
1510=for apidoc hv_iterval
1511
1512Returns the value from the current position of the hash iterator. See
1513C<hv_iterkey>.
1514
1515=cut
1516*/
1517
1518SV *
1519Perl_hv_iterval(pTHX_ HV *hv, register HE *entry)
1520{
1521 if (SvRMAGICAL(hv)) {
1522 if (mg_find((SV*)hv, PERL_MAGIC_tied)) {
1523 SV* sv = sv_newmortal();
1524 if (HeKLEN(entry) == HEf_SVKEY)
1525 mg_copy((SV*)hv, sv, (char*)HeKEY_sv(entry), HEf_SVKEY);
1526 else mg_copy((SV*)hv, sv, HeKEY(entry), HeKLEN(entry));
1527 return sv;
1528 }
1529 }
1530 return HeVAL(entry);
1531}
1532
1533/*
1534=for apidoc hv_iternextsv
1535
1536Performs an C<hv_iternext>, C<hv_iterkey>, and C<hv_iterval> in one
1537operation.
1538
1539=cut
1540*/
1541
1542SV *
1543Perl_hv_iternextsv(pTHX_ HV *hv, char **key, I32 *retlen)
1544{
1545 HE *he;
1546 if ( (he = hv_iternext(hv)) == NULL)
1547 return NULL;
1548 *key = hv_iterkey(he, retlen);
1549 return hv_iterval(hv, he);
1550}
1551
1552/*
1553=for apidoc hv_magic
1554
1555Adds magic to a hash. See C<sv_magic>.
1556
1557=cut
1558*/
1559
1560void
1561Perl_hv_magic(pTHX_ HV *hv, GV *gv, int how)
1562{
1563 sv_magic((SV*)hv, (SV*)gv, how, Nullch, 0);
1564}
1565
1566char*
1567Perl_sharepvn(pTHX_ const char *sv, I32 len, U32 hash)
1568{
1569 return HEK_KEY(share_hek(sv, len, hash));
1570}
1571
1572/* possibly free a shared string if no one has access to it
1573 * len and hash must both be valid for str.
1574 */
1575void
1576Perl_unsharepvn(pTHX_ const char *str, I32 len, U32 hash)
1577{
1578 register XPVHV* xhv;
1579 register HE *entry;
1580 register HE **oentry;
1581 register I32 i = 1;
1582 I32 found = 0;
1583 bool is_utf8 = FALSE;
1584 const char *save = str;
1585
1586 if (len < 0) {
1587 STRLEN tmplen = -len;
1588 is_utf8 = TRUE;
1589 /* See the note in hv_fetch(). --jhi */
1590 str = (char*)bytes_from_utf8((U8*)str, &tmplen, &is_utf8);
1591 len = tmplen;
1592 }
1593
1594 /* what follows is the moral equivalent of:
1595 if ((Svp = hv_fetch(PL_strtab, tmpsv, FALSE, hash))) {
1596 if (--*Svp == Nullsv)
1597 hv_delete(PL_strtab, str, len, G_DISCARD, hash);
1598 } */
1599 xhv = (XPVHV*)SvANY(PL_strtab);
1600 /* assert(xhv_array != 0) */
1601 LOCK_STRTAB_MUTEX;
1602 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
1603 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
1604 for (entry = *oentry; entry; i=0, oentry = &HeNEXT(entry), entry = *oentry) {
1605 if (HeHASH(entry) != hash) /* strings can't be equal */
1606 continue;
1607 if (HeKLEN(entry) != len)
1608 continue;
1609 if (HeKEY(entry) != str && memNE(HeKEY(entry),str,len)) /* is this it? */
1610 continue;
1611 if (HeKUTF8(entry) != (char)is_utf8)
1612 continue;
1613 found = 1;
1614 if (--HeVAL(entry) == Nullsv) {
1615 *oentry = HeNEXT(entry);
1616 if (i && !*oentry)
1617 xhv->xhv_fill--; /* HvFILL(hv)-- */
1618 Safefree(HeKEY_hek(entry));
1619 del_HE(entry);
1620 xhv->xhv_keys--; /* HvKEYS(hv)-- */
1621 }
1622 break;
1623 }
1624 UNLOCK_STRTAB_MUTEX;
1625 if (str != save)
1626 Safefree(str);
1627 if (!found && ckWARN_d(WARN_INTERNAL))
1628 Perl_warner(aTHX_ WARN_INTERNAL, "Attempt to free non-existent shared string '%s'",str);
1629}
1630
1631/* get a (constant) string ptr from the global string table
1632 * string will get added if it is not already there.
1633 * len and hash must both be valid for str.
1634 */
1635HEK *
1636Perl_share_hek(pTHX_ const char *str, I32 len, register U32 hash)
1637{
1638 register XPVHV* xhv;
1639 register HE *entry;
1640 register HE **oentry;
1641 register I32 i = 1;
1642 I32 found = 0;
1643 bool is_utf8 = FALSE;
1644 const char *save = str;
1645
1646 if (len < 0) {
1647 STRLEN tmplen = -len;
1648 is_utf8 = TRUE;
1649 /* See the note in hv_fetch(). --jhi */
1650 str = (char*)bytes_from_utf8((U8*)str, &tmplen, &is_utf8);
1651 len = tmplen;
1652 }
1653
1654 /* what follows is the moral equivalent of:
1655
1656 if (!(Svp = hv_fetch(PL_strtab, str, len, FALSE)))
1657 hv_store(PL_strtab, str, len, Nullsv, hash);
1658 */
1659 xhv = (XPVHV*)SvANY(PL_strtab);
1660 /* assert(xhv_array != 0) */
1661 LOCK_STRTAB_MUTEX;
1662 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
1663 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
1664 for (entry = *oentry; entry; i=0, entry = HeNEXT(entry)) {
1665 if (HeHASH(entry) != hash) /* strings can't be equal */
1666 continue;
1667 if (HeKLEN(entry) != len)
1668 continue;
1669 if (HeKEY(entry) != str && memNE(HeKEY(entry),str,len)) /* is this it? */
1670 continue;
1671 if (HeKUTF8(entry) != (char)is_utf8)
1672 continue;
1673 found = 1;
1674 break;
1675 }
1676 if (!found) {
1677 entry = new_HE();
1678 HeKEY_hek(entry) = save_hek(str, is_utf8?-len:len, hash);
1679 HeVAL(entry) = Nullsv;
1680 HeNEXT(entry) = *oentry;
1681 *oentry = entry;
1682 xhv->xhv_keys++; /* HvKEYS(hv)++ */
1683 if (i) { /* initial entry? */
1684 xhv->xhv_fill++; /* HvFILL(hv)++ */
1685 if (xhv->xhv_keys > xhv->xhv_max /* HvKEYS(hv) > HvMAX(hv) */)
1686 hsplit(PL_strtab);
1687 }
1688 }
1689
1690 ++HeVAL(entry); /* use value slot as REFCNT */
1691 UNLOCK_STRTAB_MUTEX;
1692 if (str != save)
1693 Safefree(str);
1694 return HeKEY_hek(entry);
1695}