:utf8 works only with perlio.
[p5sagit/p5-mst-13.2.git] / sharedsv.c
index dde1153..755481e 100644 (file)
@@ -89,12 +89,24 @@ Perl_sharedsv_find(pTHX_ SV* sv)
     shared_sv* ssv = NULL; 
     switch (SvTYPE(sv)) {
         case SVt_PVMG:
-            {MAGIC* mg = mg_find(sv, PERL_MAGIC_ext);
-            
-            if(strcmp(mg->mg_ptr,"threads::shared"))
-                break;
-            ssv = (shared_sv*) SvIV(mg->mg_obj);
-           }
+        case SVt_PVAV:
+        case SVt_PVHV: {
+            MAGIC* mg = mg_find(sv, PERL_MAGIC_ext);
+            if(mg) {
+               if(strcmp(mg->mg_ptr,"threads::shared"))
+                    break;
+                ssv = INT2PTR(shared_sv *, SvIV(mg->mg_obj));
+               break;
+             }
+           
+            mg = mg_find(sv,PERL_MAGIC_tied);
+             if(mg) {
+                 SV* obj = SvTIED_obj(sv,mg);
+                if(sv_derived_from(obj, "threads::shared"))
+                     ssv = INT2PTR(shared_sv *, SvIV(SvRV(obj)));
+                 break;
+             }
+       }
     }            
     return ssv;
 }
@@ -206,7 +218,8 @@ Perl_sharedsv_thrcnt_dec(pTHX_ shared_sv* ssv)
 
             while (items-- > 0) {
             if(SvTYPE(*src_ary))
-                Perl_sharedsv_thrcnt_dec(aTHX_ INT2PTR(shared_sv *, SvIV(*src_ary++)));
+                Perl_sharedsv_thrcnt_dec(aTHX_ INT2PTR(shared_sv *, SvIV(*src_ary)));
+                src_ary++;
             }
             break;
         }