This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Accessing unicode keys in tie hashes via hv_exists was broken.
[perl5.git] / universal.c
index b4563e4..83df6c5 100644 (file)
@@ -45,6 +45,9 @@ S_isa_lookup(pTHX_ HV *stash, const char *name, HV* name_stash,
     if (strEQ(HvNAME(stash), name))
        return &PL_sv_yes;
 
+    if (strEQ(name, "UNIVERSAL"))
+       return &PL_sv_yes;
+
     if (level > 100)
        Perl_croak(aTHX_ "Recursive inheritance detected in package '%s'",
                   HvNAME(stash));
@@ -112,8 +115,7 @@ S_isa_lookup(pTHX_ HV *stash, const char *name, HV* name_stash,
            (void)hv_store(hv,name,len,&PL_sv_no,0);
        }
     }
-
-    return boolSV(strEQ(name, "UNIVERSAL"));
+    return &PL_sv_no;
 }
 
 /*
@@ -185,6 +187,9 @@ XS(XS_Internals_SvREFCNT);
 XS(XS_Internals_hv_clear_placehold);
 XS(XS_PerlIO_get_layers);
 XS(XS_Regexp_DESTROY);
+XS(XS_Internals_hash_seed);
+XS(XS_Internals_rehash_seed);
+XS(XS_Internals_HvREHASH);
 
 void
 Perl_boot_core_UNIVERSAL(pTHX)
@@ -228,6 +233,9 @@ Perl_boot_core_UNIVERSAL(pTHX)
     newXSproto("PerlIO::get_layers",
                XS_PerlIO_get_layers, file, "*;@");
     newXS("Regexp::DESTROY", XS_Regexp_DESTROY, file);
+    newXSproto("Internals::hash_seed",XS_Internals_hash_seed, file, "");
+    newXSproto("Internals::rehash_seed",XS_Internals_rehash_seed, file, "");
+    newXSproto("Internals::HvREHASH", XS_Internals_HvREHASH, file, "\\%");
 }
 
 
@@ -753,7 +761,7 @@ XS(XS_Internals_hv_clear_placehold)
             && items) {
             SV *val = hv_iterval(hv, entry);
 
-            if (val == &PL_sv_undef) {
+            if (val == &PL_sv_placeholder) {
 
                 /* It seems that I have to go back in the front of the hash
                    API to delete a hash, even though I have a HE structure
@@ -904,3 +912,33 @@ XS(XS_PerlIO_get_layers)
     XSRETURN(0);
 }
 
+XS(XS_Internals_hash_seed)
+{
+    /* Using dXSARGS would also have dITEM and dSP,
+     * which define 2 unused local variables.  */
+    dMARK; dAX;
+    XSRETURN_UV(PERL_HASH_SEED);
+}
+
+XS(XS_Internals_rehash_seed)
+{
+    /* Using dXSARGS would also have dITEM and dSP,
+     * which define 2 unused local variables.  */
+    dMARK; dAX;
+    XSRETURN_UV(PL_rehash_seed);
+}
+
+XS(XS_Internals_HvREHASH)      /* Subject to change  */
+{
+    dXSARGS;
+    if (SvROK(ST(0))) {
+       HV *hv = (HV *) SvRV(ST(0));
+       if (items == 1 && SvTYPE(hv) == SVt_PVHV) {
+           if (HvREHASH(hv))
+               XSRETURN_YES;
+           else
+               XSRETURN_NO;
+       }
+    }
+    Perl_croak(aTHX_ "Internals::HvREHASH $hashref");
+}