]> git.vpit.fr Git - perl/modules/Lexical-Types.git/blobdiff - Types.xs
Remove obsolete kwalitee workarounds
[perl/modules/Lexical-Types.git] / Types.xs
index 1e763696ffd4d3d1a139f5dbed301750e8e1334d..518fd8f1122c37f5d51966b6270c17f02c156f3e 100644 (file)
--- a/Types.xs
+++ b/Types.xs
@@ -39,8 +39,8 @@
 # define HvNAMELEN_get(H) strlen(HvNAME_get(H))
 #endif
 
-#ifndef SvREFCNT_inc_simple_NN
-# define SvREFCNT_inc_simple_NN SvREFCNT_inc
+#ifndef SvREFCNT_inc_simple_void_NN
+# define SvREFCNT_inc_simple_void_NN(S) ((void) SvREFCNT_inc(S))
 #endif
 
 /* ... Thread safety and multiplicity ...................................... */
 # define aMY_CXT_
 #endif
 
+#if defined(OP_CHECK_MUTEX_LOCK) && defined(OP_CHECK_MUTEX_UNLOCK)
+# define LT_CHECK_MUTEX_LOCK   OP_CHECK_MUTEX_LOCK
+# define LT_CHECK_MUTEX_UNLOCK OP_CHECK_MUTEX_UNLOCK
+#else
+# define LT_CHECK_MUTEX_LOCK   OP_REFCNT_LOCK
+# define LT_CHECK_MUTEX_UNLOCK OP_REFCNT_UNLOCK
+#endif
+
+typedef OP *(*lt_ck_t)(pTHX_ OP *);
+
+#ifdef wrap_op_checker
+
+# define lt_ck_replace(T, NC, OCP) wrap_op_checker((T), (NC), (OCP))
+
+#else
+
+STATIC void lt_ck_replace(pTHX_ OPCODE type, lt_ck_t new_ck, lt_ck_t *old_ck_p){
+#define lt_ck_replace(T, NC, OCP) lt_ck_replace(aTHX_ (T), (NC), (OCP))
+ LT_CHECK_MUTEX_LOCK;
+ if (!*old_ck_p) {
+  *old_ck_p      = PL_check[type];
+  PL_check[type] = new_ck;
+ }
+ LT_CHECK_MUTEX_UNLOCK;
+}
+
+#endif
+
+STATIC void lt_ck_restore(pTHX_ OPCODE type, lt_ck_t *old_ck_p) {
+#define lt_ck_restore(T, OCP) lt_ck_restore(aTHX_ (T), (OCP))
+ LT_CHECK_MUTEX_LOCK;
+ if (*old_ck_p) {
+  PL_check[type] = *old_ck_p;
+  *old_ck_p      = 0;
+ }
+ LT_CHECK_MUTEX_UNLOCK;
+}
+
 /* --- Helpers ------------------------------------------------------------- */
 
 /* ... Thread-safe hints ................................................... */
@@ -291,7 +329,7 @@ STATIC SV *lt_tag(pTHX_ SV *value) {
   value = SvRV(value);
   if (SvTYPE(value) >= SVt_PVCV) {
    code = value;
-   SvREFCNT_inc_simple_NN(code);
+   SvREFCNT_inc_simple_void_NN(code);
   }
  }
 
@@ -354,7 +392,7 @@ STATIC SV *lt_hint(pTHX) {
                                        0,
                                        lt_hash);
 #else
- SV **val = hv_fetch(GvHV(PL_hintgv), __PACKAGE__, __PACKAGE_LEN__, lt_hash);
+ SV **val = hv_fetch(GvHV(PL_hintgv), __PACKAGE__, __PACKAGE_LEN__, 0);
  if (!val)
   return 0;
  hint = *val;
@@ -616,12 +654,12 @@ STATIC OP *lt_ck_padany(pTHX_ OP *o) {
 
   if (!type_pkg) {
    type_pkg = orig_pkg;
-   SvREFCNT_inc(orig_pkg);
+   SvREFCNT_inc_simple_void_NN(orig_pkg);
   }
 
   if (!type_meth) {
    type_meth = orig_meth;
-   SvREFCNT_inc(orig_meth);
+   SvREFCNT_inc_simple_void_NN(orig_meth);
   }
 
   lt_map_store(o, orig_pkg, type_pkg, type_meth, o->op_ppaddr);
@@ -740,10 +778,8 @@ STATIC void lt_teardown(pTHX_ void *root) {
   SvREFCNT_dec(MY_CXT.default_meth);
  }
 
- PL_check[OP_PADANY] = MEMBER_TO_FPTR(lt_old_ck_padany);
- lt_old_ck_padany    = 0;
- PL_check[OP_PADSV]  = MEMBER_TO_FPTR(lt_old_ck_padsv);
- lt_old_ck_padsv     = 0;
+ lt_ck_restore(OP_PADANY, &lt_old_ck_padany);
+ lt_ck_restore(OP_PADSV,  &lt_old_ck_padsv);
 
 #if LT_HAS_RPEEP
  PL_rpeepp   = lt_old_peep;
@@ -771,10 +807,8 @@ STATIC void lt_setup(pTHX) {
   SvREADONLY_on(MY_CXT.default_meth);
  }
 
- lt_old_ck_padany    = PL_check[OP_PADANY];
- PL_check[OP_PADANY] = MEMBER_TO_FPTR(lt_ck_padany);
- lt_old_ck_padsv     = PL_check[OP_PADSV];
- PL_check[OP_PADSV]  = MEMBER_TO_FPTR(lt_ck_padsv);
+ lt_ck_replace(OP_PADANY, lt_ck_padany, &lt_old_ck_padany);
+ lt_ck_replace(OP_PADSV,  lt_ck_padsv,  &lt_old_ck_padsv);
 
 #if LT_HAS_RPEEP
  lt_old_peep = PL_rpeepp;