]> git.vpit.fr Git - perl/modules/Scope-Upper.git/blobdiff - Upper.xs
This is 0.12
[perl/modules/Scope-Upper.git] / Upper.xs
index d78c722b3a36a0ba4ac33824d708d7f1ada398b5..24e3f0a2e09d5dd9029ab23e6d6022121a345b2b 100644 (file)
--- a/Upper.xs
+++ b/Upper.xs
@@ -69,6 +69,7 @@
 #endif
 
 #define SU_HAS_PERL(R, V, S) (PERL_REVISION > (R) || (PERL_REVISION == (R) && (PERL_VERSION > (V) || (PERL_VERSION == (V) && (PERL_SUBVERSION >= (S))))))
+#define SU_HAS_PERL_EXACT(R, V, S) ((PERL_REVISION == (R)) && (PERL_VERSION == (V)) && (PERL_SUBVERSION == (S)))
 
 /* --- Threads and multiplicity -------------------------------------------- */
 
@@ -163,7 +164,7 @@ START_MY_CXT
 
 #if !SU_HAS_PERL(5, 8, 9)
 # define SU_SAVE_GP_SIZE 6
-#elif !SU_HAS_PERL(5, 13, 0)
+#elif !SU_HAS_PERL(5, 13, 0) || (SU_RELEASE && SU_HAS_PERL_EXACT(5, 13, 0))
 # define SU_SAVE_GP_SIZE 3
 #else
 # define SU_SAVE_GP_SIZE 4
@@ -402,6 +403,13 @@ typedef struct {
  svtype type;
 } su_ud_localize;
 
+#define SU_UD_LOCALIZE_FREE(U) STMT_START { \
+ SvREFCNT_dec((U)->elem); \
+ SvREFCNT_dec((U)->val);  \
+ SvREFCNT_dec((U)->sv);   \
+ SU_UD_FREE(U);           \
+} STMT_END
+
 STATIC I32 su_ud_localize_init(pTHX_ su_ud_localize *ud, SV *sv, SV *val, SV *elem) {
 #define su_ud_localize_init(UD, S, V, E) su_ud_localize_init(aTHX_ (UD), (S), (V), (E))
  UV deref = 0;
@@ -546,10 +554,7 @@ STATIC void su_localize(pTHX_ void *ud_) {
   SvSetMagicSV((SV *) gv, val);
 
 done:
- SvREFCNT_dec(ud->elem);
- SvREFCNT_dec(ud->val);
- SvREFCNT_dec(ud->sv);
- SU_UD_FREE(ud);
+ SU_UD_LOCALIZE_FREE(ud);
 }
 
 /* --- Pop a context back -------------------------------------------------- */
@@ -620,8 +625,8 @@ STATIC void su_pop(pTHX_ void *ud) {
 
 /* --- Initialize the stack and the action userdata ------------------------ */
 
-STATIC I32 su_init(pTHX_ I32 cxix, void *ud, I32 size) {
-#define su_init(L, U, S) su_init(aTHX_ (L), (U), (S))
+STATIC I32 su_init(pTHX_ void *ud, I32 cxix, I32 size) {
+#define su_init(U, C, S) su_init(aTHX_ (U), (C), (S))
  I32 i, depth = 1, pad, offset, *origin;
 
  SU_D(PerlIO_printf(Perl_debug_log, "%p: ### init for cx %d\n", ud, cxix));
@@ -1047,7 +1052,7 @@ CODE:
  SU_UD_ORIGIN(ud)  = NULL;
  SU_UD_HANDLER(ud) = su_reap;
  ud->cb = newSVsv(hook);
- su_init(cxix, ud, SU_SAVE_DESTRUCTOR_SIZE);
+ su_init(ud, cxix, SU_SAVE_DESTRUCTOR_SIZE);
 
 void
 localize(SV *sv, SV *val, ...)
@@ -1062,7 +1067,7 @@ CODE:
  SU_UD_ORIGIN(ud)  = NULL;
  SU_UD_HANDLER(ud) = su_localize;
  size = su_ud_localize_init(ud, sv, val, NULL);
- su_init(cxix, ud, size);
+ su_init(ud, cxix, size);
 
 void
 localize_elem(SV *sv, SV *elem, SV *val, ...)
@@ -1080,10 +1085,10 @@ CODE:
  SU_UD_HANDLER(ud) = su_localize;
  size = su_ud_localize_init(ud, sv, val, elem);
  if (ud->type != SVt_PVAV && ud->type != SVt_PVHV) {
-  Safefree(ud);
+  SU_UD_LOCALIZE_FREE(ud);
   croak("Can't localize an element of something that isn't an array or a hash");
  }
- su_init(cxix, ud, size);
+ su_init(ud, cxix, size);
 
 void
 localize_delete(SV *sv, SV *elem, ...)
@@ -1098,4 +1103,4 @@ CODE:
  SU_UD_ORIGIN(ud)  = NULL;
  SU_UD_HANDLER(ud) = su_localize;
  size = su_ud_localize_init(ud, sv, NULL, elem);
- su_init(cxix, ud, size);
+ su_init(ud, cxix, size);