]> git.vpit.fr Git - perl/modules/Variable-Magic.git/blobdiff - Magic.xs
Set $_[2] to the default length for len magic on scalars
[perl/modules/Variable-Magic.git] / Magic.xs
index 08c61d23c9c37b61eb65228db5bc0cc196d8170c..65858173557c76dd7977609b65b4dc462af8df5c 100644 (file)
--- a/Magic.xs
+++ b/Magic.xs
@@ -546,13 +546,11 @@ STATIC int vmg_svt_set(pTHX_ SV *sv, MAGIC *mg) {
 
 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;
 
@@ -560,9 +558,17 @@ STATIC U32 vmg_svt_len(pTHX_ SV *sv, MAGIC *mg) {
  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);
@@ -579,7 +585,7 @@ STATIC U32 vmg_svt_len(pTHX_ SV *sv, MAGIC *mg) {
  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) {
@@ -694,7 +700,7 @@ STATIC I32 vmg_svt_val(pTHX_ IV action, SV *sv) {
     continue;
    case 2:
     if (!newkey)
-     newkey = key = umg->mg_obj = sv_2mortal(newSVsv(umg->mg_obj));
+     newkey = key = umg->mg_obj = sv_mortalcopy(umg->mg_obj);
   }
   switch (action) {
    case 0:
@@ -971,13 +977,14 @@ BOOT:
  newCONSTSUB(stash, "VMG_THREADSAFE",      newSVuv(VMG_THREADSAFE));
 }
 
+#if VMG_THREADSAFE
+
 void
 CLONE(...)
 PROTOTYPE: DISABLE
 PREINIT:
  HV *hv;
 CODE:
-#if VMG_THREADSAFE
  {
   HE *key;
   dMY_CXT;
@@ -1000,6 +1007,7 @@ CODE:
   MY_CXT_CLONE;
   MY_CXT = hv;
  }
+
 #endif /* VMG_THREADSAFE */
 
 SV *_wizard(...)