STATIC U32 vmg_svt_len(pTHX_ SV *sv, MAGIC *mg) {
SV *svr;
- I32 len, has_array;
- U32 ret;
+ U32 len, ret;
+ svtype t = SvTYPE(sv);
dSP;
- has_array = SvTYPE(sv) == SVt_PVAV;
-
ENTER;
SAVETMPS;
EXTEND(SP, 3);
PUSHs(sv_2mortal(newRV_inc(sv)));
PUSHs(mg->mg_obj ? mg->mg_obj : &PL_sv_undef);
- if (has_array) {
+ if (t < SVt_PVAV) {
+ STRLEN l;
+ U8 *s = (U8 *) SvPV_const(sv, l);
+ if (DO_UTF8(sv))
+ len = utf8_length(s, s + l);
+ else
+ len = l;
+ mPUSHu(len);
+ } else if (t == SVt_PVAV) {
len = av_len((AV *) sv) + 1;
- mPUSHi(len);
+ mPUSHu(len);
} else {
len = 0;
PUSHs(&PL_sv_undef);
FREETMPS;
LEAVE;
- return has_array ? ret - 1 : ret;
+ return t == SVt_PVAV ? ret - 1 : ret;
}
STATIC int vmg_svt_clear(pTHX_ SV *sv, MAGIC *mg) {