]> git.vpit.fr Git - perl/modules/Scope-Upper.git/blobdiff - Upper.xs
Also preserve PL_scopestack[cx->blk_oldscopesp - 1] in formats
[perl/modules/Scope-Upper.git] / Upper.xs
index bb4300de7e24ce302efce94a317d291d7c5d05d6..5b0685d97502efdab9caa4a15d4c958615757ccf 100644 (file)
--- a/Upper.xs
+++ b/Upper.xs
@@ -1001,9 +1001,26 @@ static void su_pop(pTHX_ void *ud) {
                      ud,                24, ' ',    mark,        base));
 
  if (base < mark) {
+#if SU_HAS_PERL(5, 19, 4)
+  I32 save = -1;
+  PERL_CONTEXT *cx;
+#endif
+
   SU_D(PerlIO_printf(Perl_debug_log, "%p: clear leftovers\n", ud));
+
+#if SU_HAS_PERL(5, 19, 4)
+  cx = cxstack + cxstack_ix;
+  if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
+   save = PL_scopestack[cx->blk_oldscopesp - 1];
+#endif
+
   PL_savestack_ix = mark;
   leave_scope(base);
+
+#if SU_HAS_PERL(5, 19, 4)
+  if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
+   PL_scopestack[cx->blk_oldscopesp - 1] = save;
+#endif
  }
  PL_savestack_ix = base;
 
@@ -1381,6 +1398,8 @@ static su_uplevel_ud *su_uplevel_storage_new(pTHX_ I32 cxix) {
  return sud;
 }
 
+#if SU_HAS_PERL(5, 13, 7)
+
 static void su_uplevel_storage_delete(pTHX_ su_uplevel_ud *sud) {
 #define su_uplevel_storage_delete(S) su_uplevel_storage_delete(aTHX_ (S))
  dMY_CXT;
@@ -1408,6 +1427,8 @@ static void su_uplevel_storage_delete(pTHX_ su_uplevel_ud *sud) {
  }
 }
 
+#endif
+
 static int su_uplevel_goto_static(const OP *o) {
  for (; o; o = OpSIBLING(o)) {
   /* goto ops are unops with kids. */
@@ -2211,6 +2232,13 @@ static void su_global_teardown(pTHX_ void *root) {
   return;
 #endif
 
+ SU_LOCK(&su_uid_seq_counter_mutex);
+ PerlMemShared_free(su_uid_seq_counter.seqs);
+ su_uid_seq_counter.size = 0;
+ SU_UNLOCK(&su_uid_seq_counter_mutex);
+
+ MUTEX_DESTROY(&su_uid_seq_counter_mutex);
+
  su_initialized = 0;
 
  return;
@@ -2235,8 +2263,10 @@ static void su_global_setup(pTHX_ SU_XS_FILE_TYPE *file) {
 
  MUTEX_INIT(&su_uid_seq_counter_mutex);
 
+ SU_LOCK(&su_uid_seq_counter_mutex);
  su_uid_seq_counter.seqs = NULL;
  su_uid_seq_counter.size = 0;
+ SU_UNLOCK(&su_uid_seq_counter_mutex);
 
  stash = gv_stashpv(__PACKAGE__, 1);
  newCONSTSUB(stash, "TOP",           newSViv(0));