if (SvTHINKFIRST(sv)) {
if (SvROK(sv)) {
SV* tmpstr;
- if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
+ if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
+ (SvRV(tmpstr) != SvRV(sv)))
return SvIV(tmpstr);
return PTR2IV(SvRV(sv));
}
if (SvTHINKFIRST(sv)) {
if (SvROK(sv)) {
SV* tmpstr;
- if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
+ if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
+ (SvRV(tmpstr) != SvRV(sv)))
return SvUV(tmpstr);
return PTR2UV(SvRV(sv));
}
if (SvTHINKFIRST(sv)) {
if (SvROK(sv)) {
SV* tmpstr;
- if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)))
+ if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)) &&
+ (SvRV(tmpstr) != SvRV(sv)))
return SvNV(tmpstr);
return PTR2NV(SvRV(sv));
}
if (SvTHINKFIRST(sv)) {
if (SvROK(sv)) {
SV* tmpstr;
- if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)))
+ if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)) &&
+ (SvRV(tmpstr) != SvRV(sv)))
return SvPV(tmpstr,*lp);
sv = (SV*)SvRV(sv);
if (!sv)
if (SvROK(sv)) {
dTHR;
SV* tmpsv;
- if (SvAMAGIC(sv) && (tmpsv = AMG_CALLun(sv,bool_)))
+ if (SvAMAGIC(sv) && (tmpsv=AMG_CALLun(sv,bool_)) &&
+ (SvRV(tmpsv) != SvRV(sv)))
return SvTRUE(tmpsv);
return SvRV(sv) != 0;
}
void
Perl_sv_utf8_upgrade(pTHX_ register SV *sv)
{
- int hicount;
- char *c;
- char *s;
+ char *s, *t;
+ bool hibit;
if (!sv || !SvPOK(sv) || SvUTF8(sv))
return;
- /* This function could be much more efficient if we had a FLAG
- * to signal if there are any hibit chars in the string
+ /* This function could be much more efficient if we had a FLAG in SVs
+ * to signal if there are any hibit chars in the PV.
*/
- hicount = 0;
- for (c = s = SvPVX(sv); c < SvEND(sv); c++) {
- if (*c & 0x80)
- hicount++;
- }
+ for (s = t = SvPVX(sv), hibit = FALSE; t < SvEND(sv) && !hibit; t++)
+ if (*t & 0x80)
+ hibit = TRUE;
- if (hicount) {
+ if (hibit) {
STRLEN len = SvCUR(sv) + 1; /* Plus the \0 */
SvPVX(sv) = (char*)bytes_to_utf8((U8*)s, &len);
SvCUR(sv) = len - 1;
- Safefree(s); /* No longer using what was there before */
+ SvLEN(sv) = len; /* No longer know the real size. */
SvUTF8_on(sv);
+ Safefree(s); /* No longer using what was there before. */
}
}
if (fail_ok)
return FALSE;
else
- Perl_croak("big byte");
+ Perl_croak(aTHX_ "big byte");
}
SvCUR(sv) = len - 1;
SvUTF8_off(sv);
}
if (GvHV(gv) && !HvNAME(GvHV(gv))) {
hv_clear(GvHV(gv));
-#ifndef VMS /* VMS has no environ array */
+#if !defined( VMS) && !defined(EPOC) /* VMS has no environ array */
if (gv == PL_envgv)
environ[0] = Nullch;
#endif
break;
}
if (utf)
- iv = (IV)utf8_to_uv(vecstr, &ulen, 0);
+ iv = (IV)utf8_to_uv_chk(vecstr, &ulen, 0);
else {
iv = *vecstr;
ulen = 1;
break;
}
if (utf)
- uv = utf8_to_uv(vecstr, &ulen, 0);
+ uv = utf8_to_uv_chk(vecstr, &ulen, 0);
else {
uv = *vecstr;
ulen = 1;