Lines Matching refs:hv

0 /*    hv.c
172 /* (klen == HEf_SVKEY) is special for MAGICAL hv entries, meaning key slot
207 Perl_hv_store(pTHX_ HV *hv, const char *key, I32 klen_i32, SV *val, U32 hash)
220 hek = hv_fetch_common (hv, NULL, key, klen, flags,
226 Perl_hv_store_flags(pTHX_ HV *hv, const char *key, I32 klen, SV *val,
229 HE *hek = hv_fetch_common (hv, NULL, key, klen, flags,
264 Perl_hv_store_ent(pTHX_ HV *hv, SV *keysv, SV *val, U32 hash)
266 return hv_fetch_common(hv, keysv, NULL, 0, 0, HV_FETCH_ISSTORE, val, hash);
279 Perl_hv_exists(pTHX_ HV *hv, const char *key, I32 klen_i32)
291 return hv_fetch_common(hv, NULL, key, klen, flags, HV_FETCH_ISEXISTS, 0, 0)
310 Perl_hv_fetch(pTHX_ HV *hv, const char *key, I32 klen_i32, I32 lval)
323 hek = hv_fetch_common (hv, NULL, key, klen, flags,
340 Perl_hv_exists_ent(pTHX_ HV *hv, SV *keysv, U32 hash)
342 return hv_fetch_common(hv, keysv, NULL, 0, 0, HV_FETCH_ISEXISTS, 0, hash)
366 Perl_hv_fetch_ent(pTHX_ HV *hv, SV *keysv, I32 lval, register U32 hash)
368 return hv_fetch_common(hv, keysv, NULL, 0, 0,
373 S_hv_fetch_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen,
384 if (!hv)
397 xhv = (XPVHV*)SvANY(hv);
398 if (SvMAGICAL(hv)) {
399 if (SvRMAGICAL(hv) && !(action & (HV_FETCH_ISSTORE|HV_FETCH_ISEXISTS)))
401 if (mg_find((SV*)hv, PERL_MAGIC_tied) || SvGMAGICAL((SV*)hv)) {
415 mg_copy((SV*)hv, sv, (char *)keysv, HEf_SVKEY);
442 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
451 entry = hv_fetch_common(hv, Nullsv, nkey, klen,
460 entry = hv_fetch_common(hv, keysv, key, klen,
472 else if (SvRMAGICAL(hv) && (action & HV_FETCH_ISEXISTS)) {
473 if (mg_find((SV*)hv, PERL_MAGIC_tied) || SvGMAGICAL((SV*)hv)) {
487 mg_copy((SV*)hv, sv, (char *)sv_2mortal(keysv), HEf_SVKEY);
489 mg_copy((SV*)hv, sv, key, klen);
496 And I know hv is not NULL. */
497 return SvTRUE(svret) ? (HE *)hv : NULL;
500 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
519 hv_magic_check (hv, &needs_copy, &needs_store);
530 mg_copy((SV*)hv, val, (char*)keysv, HEf_SVKEY);
532 mg_copy((SV*)hv, val, key, klen);
536 if (!xhv->xhv_array /* !HvARRAY(hv) */ && !needs_store) {
542 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
561 if (!xhv->xhv_array /* !HvARRAY(hv) */) {
564 || (SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env))
567 Newz(503, xhv->xhv_array /* HvARRAY(hv) */,
568 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
573 store call, so avoid creating HvARRAY(hv) right now. */
599 if (HvREHASH(hv)) {
601 /* We don't have a pointer to the hv, so we have to replicate the
623 if (!xhv->xhv_array /* !HvARRAY(hv) */) entry = Null(HE*);
627 /* entry = (HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
646 if (HvSHAREKEYS(hv)) {
658 HvHASKFLAGS_on(hv);
663 if (SvMAGICAL(hv)) {
699 && SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env)) {
705 return hv_fetch_common(hv,keysv,key,klen,flags,HV_FETCH_ISSTORE,sv,
711 if (!entry && SvREADONLY(hv) && !(action & HV_FETCH_ISEXISTS)) {
724 if (SvMAGICAL(hv)) {
729 return hv_fetch_common(hv, keysv, key, klen, flags,
742 Newz(503, xhv->xhv_array /* HvARRAY(hv) */,
743 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
752 if (HvSHAREKEYS(hv))
763 HvHASKFLAGS_on(hv);
765 xhv->xhv_keys++; /* HvKEYS(hv)++ */
767 xhv->xhv_fill++; /* HvFILL(hv)++ */
769 || ((n_links > HV_MAX_LENGTH_BEFORE_SPLIT) && !HvREHASH(hv))) {
770 /* Use only the old HvKEYS(hv) > HvMAX(hv) condition to limit bucket
776 hsplit(hv);
783 S_hv_magic_check(pTHX_ HV *hv, bool *needs_copy, bool *needs_store)
785 MAGIC *mg = SvMAGIC(hv);
810 Perl_hv_scalar(pTHX_ HV *hv)
815 if ((SvRMAGICAL(hv) && (mg = mg_find((SV*)hv, PERL_MAGIC_tied)))) {
816 sv = magic_scalarpack(hv, mg);
821 if (HvFILL((HV*)hv))
823 (long)HvFILL(hv), (long)HvMAX(hv) + 1);
842 Perl_hv_delete(pTHX_ HV *hv, const char *key, I32 klen_i32, I32 flags)
853 return hv_delete_common(hv, NULL, key, klen, k_flags, flags, 0);
868 Perl_hv_delete_ent(pTHX_ HV *hv, SV *keysv, I32 flags, U32 hash)
870 return hv_delete_common(hv, keysv, NULL, 0, 0, flags, hash);
874 S_hv_delete_common(pTHX_ HV *hv, SV *keysv, const char *key, STRLEN klen,
885 if (!hv)
898 if (SvRMAGICAL(hv)) {
901 hv_magic_check (hv, &needs_copy, &needs_store);
904 entry = hv_fetch_common(hv, keysv, key, klen,
921 else if (mg_find((SV*)hv, PERL_MAGIC_env)) {
936 xhv = (XPVHV*)SvANY(hv);
937 if (!xhv->xhv_array /* !HvARRAY(hv) */)
956 HvHASKFLAGS_on((SV*)hv);
959 if (HvREHASH(hv)) {
975 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
996 else if (SvREADONLY(hv) && HeVAL(entry) && SvREADONLY(HeVAL(entry))) {
1017 if (SvREADONLY(hv)) {
1022 xhv->xhv_placeholders++; /* HvPLACEHOLDERS(hv)++ */
1026 xhv->xhv_fill--; /* HvFILL(hv)-- */
1027 if (entry == xhv->xhv_eiter /* HvEITER(hv) */)
1028 HvLAZYDEL_on(hv);
1030 hv_free_ent(hv, entry);
1031 xhv->xhv_keys--; /* HvKEYS(hv)-- */
1033 HvHASKFLAGS_off(hv);
1037 if (SvREADONLY(hv)) {
1049 S_hsplit(pTHX_ HV *hv)
1051 register XPVHV* xhv = (XPVHV*)SvANY(hv);
1052 I32 oldsize = (I32) xhv->xhv_max+1; /* HvMAX(hv)+1 (sick) */
1055 register char *a = xhv->xhv_array; /* HvARRAY(hv) */
1064 hv, (int) oldsize);*/
1066 if (HvPLACEHOLDERS(hv) && !SvREADONLY(hv)) {
1071 hv_clear_placeholders(hv);
1087 Copy(xhv->xhv_array /* HvARRAY(hv) */, a, oldsize * sizeof(HE*), char);
1089 offer_nice_chunk(xhv->xhv_array /* HvARRAY(hv) */,
1093 Safefree(xhv->xhv_array /* HvARRAY(hv) */);
1098 xhv->xhv_max = --newsize; /* HvMAX(hv) = --newsize */
1099 xhv->xhv_array = a; /* HvARRAY(hv) = a */
1114 xhv->xhv_fill++; /* HvFILL(hv)++ */
1125 xhv->xhv_fill--; /* HvFILL(hv)-- */
1138 || HvREHASH(hv)) {
1142 if (hv == PL_strtab) {
1149 /*PerlIO_printf(PerlIO_stderr(), "%p %d of %d with %d/%d buckets\n", hv,
1150 longest_chain, HvTOTALKEYS(hv), HvFILL(hv), 1+HvMAX(hv));*/
1154 was_shared = HvSHAREKEYS(hv);
1157 HvSHAREKEYS_off(hv);
1158 HvREHASH_on(hv);
1191 xhv->xhv_fill++; /* HvFILL(hv)++ */
1199 xhv->xhv_array = a; /* HvARRAY(hv) = a */
1203 Perl_hv_ksplit(pTHX_ HV *hv, IV newmax)
1205 register XPVHV* xhv = (XPVHV*)SvANY(hv);
1206 I32 oldsize = (I32) xhv->xhv_max+1; /* HvMAX(hv)+1 (sick) */
1226 a = xhv->xhv_array; /* HvARRAY(hv) */
1241 Copy(xhv->xhv_array /* HvARRAY(hv) */, a, oldsize * sizeof(HE*), char);
1243 offer_nice_chunk(xhv->xhv_array /* HvARRAY(hv) */,
1247 Safefree(xhv->xhv_array /* HvARRAY(hv) */);
1255 xhv->xhv_max = --newsize; /* HvMAX(hv) = --newsize */
1256 xhv->xhv_array = a; /* HvARRAY(hv) = a */
1257 if (!xhv->xhv_fill /* !HvFILL(hv) */) /* skip rest if no entries */
1269 xhv->xhv_fill++; /* HvFILL(hv)++ */
1277 xhv->xhv_fill--; /* HvFILL(hv)-- */
1292 register HV *hv;
1295 hv = (HV*)NEWSV(502,0);
1296 sv_upgrade((SV *)hv, SVt_PVHV);
1297 xhv = (XPVHV*)SvANY(hv);
1298 SvPOK_off(hv);
1299 SvNOK_off(hv);
1301 HvSHAREKEYS_on(hv); /* key-sharing on by default */
1304 xhv->xhv_max = 7; /* HvMAX(hv) = 7 (start with 8 buckets) */
1305 xhv->xhv_fill = 0; /* HvFILL(hv) = 0 */
1306 xhv->xhv_pmroot = 0; /* HvPMROOT(hv) = 0 */
1307 (void)hv_iterinit(hv); /* so each() will start off right */
1308 return hv;
1314 HV *hv = newHV();
1318 return hv;
1360 HvMAX(hv) = hv_max;
1361 HvFILL(hv) = hv_fill;
1362 HvTOTALKEYS(hv) = HvTOTALKEYS(ohv);
1363 HvARRAY(hv) = ents;
1374 HvMAX(hv) = hv_max;
1378 hv_store_flags(hv, HeKEY(entry), HeKLEN(entry),
1386 return hv;
1390 Perl_hv_free_ent(pTHX_ HV *hv, register HE *entry)
1397 if (val && isGV(val) && GvCVu(val) && HvNAME(hv))
1404 else if (HvSHAREKEYS(hv))
1412 Perl_hv_delayfree_ent(pTHX_ HV *hv, register HE *entry)
1416 if (isGV(HeVAL(entry)) && GvCVu(HeVAL(entry)) && HvNAME(hv))
1423 else if (HvSHAREKEYS(hv))
1439 Perl_hv_clear(pTHX_ HV *hv)
1442 if (!hv)
1445 xhv = (XPVHV*)SvANY(hv);
1447 if (SvREADONLY(hv) && xhv->xhv_array != NULL) {
1464 xhv->xhv_placeholders++; /* HvPLACEHOLDERS(hv)++ */
1471 hfreeentries(hv);
1472 xhv->xhv_placeholders = 0; /* HvPLACEHOLDERS(hv) = 0 */
1473 if (xhv->xhv_array /* HvARRAY(hv) */)
1474 (void)memzero(xhv->xhv_array /* HvARRAY(hv) */,
1475 (xhv->xhv_max+1 /* HvMAX(hv)+1 */) * sizeof(HE*));
1477 if (SvRMAGICAL(hv))
1478 mg_clear((SV*)hv);
1480 HvHASKFLAGS_off(hv);
1481 HvREHASH_off(hv);
1483 HvEITER(hv) = NULL;
1501 Perl_hv_clear_placeholders(pTHX_ HV *hv)
1503 I32 items = (I32)HvPLACEHOLDERS(hv);
1504 I32 i = HvMAX(hv);
1512 HE **oentry = &(HvARRAY(hv))[i];
1522 HvFILL(hv)--; /* This linked list is now empty. */
1523 if (HvEITER(hv))
1524 HvLAZYDEL_on(hv);
1526 hv_free_ent(hv, entry);
1530 HvTOTALKEYS(hv) -= HvPLACEHOLDERS(hv);
1531 if (HvKEYS(hv) == 0)
1532 HvHASKFLAGS_off(hv);
1533 HvPLACEHOLDERS(hv) = 0;
1548 S_hfreeentries(pTHX_ HV *hv)
1556 if (!hv)
1558 if (!HvARRAY(hv))
1562 max = HvMAX(hv);
1563 array = HvARRAY(hv);
1566 HvARRAY(hv) = Null(HE**);
1567 HvFILL(hv) = 0;
1568 ((XPVHV*) SvANY(hv))->xhv_keys = 0;
1575 hv_free_ent(hv, oentry);
1583 HvARRAY(hv) = array;
1584 (void)hv_iterinit(hv);
1596 Perl_hv_undef(pTHX_ HV *hv)
1599 if (!hv)
1601 xhv = (XPVHV*)SvANY(hv);
1602 hfreeentries(hv);
1603 Safefree(xhv->xhv_array /* HvARRAY(hv) */);
1604 if (HvNAME(hv)) {
1606 hv_delete(PL_stashcache, HvNAME(hv), strlen(HvNAME(hv)), G_DISCARD);
1607 Safefree(HvNAME(hv));
1608 HvNAME(hv) = 0;
1610 xhv->xhv_max = 7; /* HvMAX(hv) = 7 (it's a normal hash) */
1611 xhv->xhv_array = 0; /* HvARRAY(hv) = 0 */
1612 xhv->xhv_placeholders = 0; /* HvPLACEHOLDERS(hv) = 0 */
1614 if (SvRMAGICAL(hv))
1615 mg_clear((SV*)hv);
1634 Perl_hv_iterinit(pTHX_ HV *hv)
1639 if (!hv)
1641 xhv = (XPVHV*)SvANY(hv);
1642 entry = xhv->xhv_eiter; /* HvEITER(hv) */
1643 if (entry && HvLAZYDEL(hv)) { /* was deleted earlier? */
1644 HvLAZYDEL_off(hv);
1645 hv_free_ent(hv, entry);
1647 xhv->xhv_riter = -1; /* HvRITER(hv) = -1 */
1648 xhv->xhv_eiter = Null(HE*); /* HvEITER(hv) = Null(HE*) */
1669 Perl_hv_iternext(pTHX_ HV *hv)
1671 return hv_iternext_flags(hv, 0);
1690 Perl_hv_iternext_flags(pTHX_ HV *hv, I32 flags)
1697 if (!hv)
1699 xhv = (XPVHV*)SvANY(hv);
1700 oldentry = entry = xhv->xhv_eiter; /* HvEITER(hv) */
1702 if ((mg = SvTIED_mg((SV*)hv, PERL_MAGIC_tied))) {
1713 xhv->xhv_eiter = entry = new_HE(); /* HvEITER(hv) = new_HE() */
1720 magic_nextpack((SV*) hv,mg,key);
1730 xhv->xhv_eiter = Null(HE*); /* HvEITER(hv) = Null(HE*) */
1734 if (!entry && SvRMAGICAL((SV*)hv) && mg_find((SV*)hv, PERL_MAGIC_env))
1738 if (!xhv->xhv_array /* !HvARRAY(hv) */)
1739 Newz(506, xhv->xhv_array /* HvARRAY(hv) */,
1740 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max+1 /* HvMAX(hv)+1 */),
1759 xhv->xhv_riter++; /* HvRITER(hv)++ */
1760 if (xhv->xhv_riter > (I32)xhv->xhv_max /* HvRITER(hv) > HvMAX(hv) */) {
1762 xhv->xhv_riter = -1; /* HvRITER(hv) = -1 */
1765 /* entry = (HvARRAY(hv))[HvRITER(hv)]; */
1779 if (oldentry && HvLAZYDEL(hv)) { /* was deleted earlier? */
1780 HvLAZYDEL_off(hv);
1781 hv_free_ent(hv, oldentry);
1784 /*if (HvREHASH(hv) && entry && !HeKREHASH(entry))
1785 PerlIO_printf(PerlIO_stderr(), "Awooga %p %p\n", hv, entry);*/
1787 xhv->xhv_eiter = entry; /* HvEITER(hv) = entry */
1845 /* We don't have a pointer to the hv, so we have to replicate the
1846 flag into every HEK. This hv is using custom a hasing
1849 into an hv routine with a regular hash */
1874 Perl_hv_iterval(pTHX_ HV *hv, register HE *entry)
1876 if (SvRMAGICAL(hv)) {
1877 if (mg_find((SV*)hv, PERL_MAGIC_tied)) {
1880 mg_copy((SV*)hv, sv, (char*)HeKEY_sv(entry), HEf_SVKEY);
1881 else mg_copy((SV*)hv, sv, HeKEY(entry), HeKLEN(entry));
1898 Perl_hv_iternextsv(pTHX_ HV *hv, char **key, I32 *retlen)
1901 if ( (he = hv_iternext_flags(hv, 0)) == NULL)
1904 return hv_iterval(hv, he);
1916 Perl_hv_magic(pTHX_ HV *hv, GV *gv, int how)
1918 sv_magic((SV*)hv, (SV*)gv, how, Nullch, 0);
1921 #if 0 /* use the macro from hv.h instead */
1985 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
2014 xhv->xhv_fill--; /* HvFILL(hv)-- */
2017 xhv->xhv_keys--; /* HvKEYS(hv)-- */
2083 /* oentry = &(HvARRAY(hv))[hash & (I32) HvMAX(hv)]; */
2103 xhv->xhv_keys++; /* HvKEYS(hv)++ */
2105 xhv->xhv_fill++; /* HvFILL(hv)++ */
2106 } else if (xhv->xhv_keys > (IV)xhv->xhv_max /* HvKEYS(hv) > HvMAX(hv) */) {