]> git.vpit.fr Git - perl/modules/Scope-Upper.git/blobdiff - Upper.xs
Introduce SU_THREADSAFE
[perl/modules/Scope-Upper.git] / Upper.xs
index d628f1d3e47d0637c1ffbb058f4e79ada7c5bbd6..95a22ed74520b2f521fc871b075b60b7ba4489e5 100644 (file)
--- a/Upper.xs
+++ b/Upper.xs
@@ -247,7 +247,7 @@ STATIC void su_save_helem(pTHX_ HV *hv, SV *keysv, SV *val) {
  if (val) { /* local $x{$keysv} = $val; */
   SvSetMagicSV(*svp, val);
  } else {   /* local $x{$keysv}; delete $x{$keysv}; */
-  hv_delete_ent(hv, keysv, G_DISCARD, HeHASH(he));
+  (void)hv_delete_ent(hv, keysv, G_DISCARD, HeHASH(he));
  }
 }
 
@@ -278,7 +278,9 @@ typedef struct {
 STATIC void su_call(pTHX_ void *ud_) {
  su_ud_reap *ud = (su_ud_reap *) ud_;
 #if SU_HAS_PERL(5, 10, 0)
+ PERL_CONTEXT saved_cx;
  I32 dieing = PL_op->op_type == OP_DIE;
+ I32 cxix;
 #endif
 
  dSP;
@@ -295,21 +297,22 @@ STATIC void su_call(pTHX_ void *ud_) {
   * when the new sub scope will be created in call_sv. */
 
 #if SU_HAS_PERL(5, 10, 0)
- if (dieing)
+ if (dieing) {
   if (cxstack_ix < cxstack_max)
-   ++cxstack_ix;
+   cxix = cxstack_ix + 1;
   else
-   cxstack_ix = Perl_cxinc(aTHX);
+   cxix = Perl_cxinc(aTHX);
+  saved_cx = cxstack[cxix];
+ }
 #endif
 
  call_sv(ud->cb, G_VOID);
 
 #if SU_HAS_PERL(5, 10, 0)
- if (dieing && cxstack_ix > 0)
-  --cxstack_ix;
+ if (dieing)
+  cxstack[cxix] = saved_cx;
 #endif
 
- SPAGAIN;
  PUTBACK;
 
  FREETMPS;
@@ -350,11 +353,9 @@ STATIC void su_localize(pTHX_ void *ud_) {
 
  if (SvTYPE(sv) >= SVt_PVGV) {
   gv = (GV *) sv;
-  if (!val) {               /* local *x; */
+  if (!val || !SvROK(val)) { /* local *x; or local *x = $val; */
    t = SVt_PVGV;
-  } else if (!SvROK(val)) { /* local *x = $val; */
-   goto assign;
-  } else {                  /* local *x = \$val; */
+  } else {                   /* local *x = \$val; */
    t = SvTYPE(SvRV(val));
    deref = 1;
   }
@@ -429,7 +430,6 @@ STATIC void su_localize(pTHX_ void *ud_) {
                                      ud, PL_savestack_ix,
                                          PL_scopestack[PL_scopestack_ix]));
 
-assign:
  if (val)
   SvSetMagicSV((SV *) gv, val);
 
@@ -640,13 +640,15 @@ STATIC void su_unwind(pTHX_ void *ud_) {
  STMT_START {                  \
   if (items > A) {             \
    SV *csv = ST(B);            \
-   if (SvOK(csv))              \
-    cxix = SvIV(csv);          \
+   if (!SvOK(csv))             \
+    goto default_cx;           \
+   cxix = SvIV(csv);           \
    if (cxix < 0)               \
     cxix = 0;                  \
    else if (cxix > cxstack_ix) \
     cxix = cxstack_ix;         \
   } else {                     \
+default_cx:                    \
    cxix = cxstack_ix;          \
    if (PL_DBsub)               \
     SU_SKIP_DB(cxix);          \
@@ -655,14 +657,15 @@ STATIC void su_unwind(pTHX_ void *ud_) {
 
 #define SU_GET_LEVEL(A, B) \
  STMT_START {              \
+  level = 0;               \
   if (items > 0) {         \
    SV *lsv = ST(B);        \
-   if (SvOK(lsv))          \
+   if (SvOK(lsv)) {        \
     level = SvIV(lsv);     \
-   if (level < 0)          \
-    level = 0;             \
-  } else                   \
-   level = 0;              \
+    if (level < 0)         \
+     level = 0;            \
+   }                       \
+  }                        \
  } STMT_END
 
 XS(XS_Scope__Upper_unwind); /* prototype to pass -Wmissing-prototypes */
@@ -717,17 +720,22 @@ BOOT:
  HV *stash;
  MY_CXT_INIT;
  stash = gv_stashpv(__PACKAGE__, 1);
- newCONSTSUB(stash, "TOP", newSViv(0));
+ newCONSTSUB(stash, "TOP",           newSViv(0));
+ newCONSTSUB(stash, "SU_THREADSAFE", newSVuv(SU_THREADSAFE));
  newXSproto("Scope::Upper::unwind", XS_Scope__Upper_unwind, file, NULL);
 }
 
+#if SU_THREADSAFE
+
 void
 CLONE(...)
 PROTOTYPE: DISABLE
 CODE:
  PERL_UNUSED_VAR(items);
-#if SU_THREADSAFE
- MY_CXT_CLONE;
+ {
+  MY_CXT_CLONE;
+ }
+
 #endif /* SU_THREADSAFE */
 
 SV *