]> git.vpit.fr Git - perl/modules/Lexical-Types.git/blobdiff - Types.xs
Update author tests, and add a POD spelling test
[perl/modules/Lexical-Types.git] / Types.xs
index 27d5d435dde1c9650d9af67167d4325dba9f0eca..9c02bd8a434caf16346b08e3edfb0dfa6c6cc064 100644 (file)
--- a/Types.xs
+++ b/Types.xs
 # 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 ...................................... */
 
+/* Safe unless stated otherwise in Makefile.PL */
+#ifndef LT_FORKSAFE
+# define LT_FORKSAFE 1
+#endif
+
 #ifndef LT_MULTIPLICITY
 # if defined(MULTIPLICITY) || defined(PERL_IMPLICIT_CONTEXT)
 #  define LT_MULTIPLICITY 1
@@ -140,14 +145,15 @@ typedef SV lt_hint_t;
 
 /* ... "Seen" pointer table ................................................ */
 
-#if !LT_HAS_RPEEP
-
 #define PTABLE_NAME        ptable_seen
 #define PTABLE_VAL_FREE(V) NOOP
 
 #include "ptable.h"
 
-#endif /* !LT_HAS_RPEEP */
+/* PerlMemShared_free() needs the [ap]PTBLMS_? default values */
+#define ptable_seen_store(T, K, V) ptable_seen_store(aPTBLMS_ (T), (K), (V))
+#define ptable_seen_clear(T)       ptable_seen_clear(aPTBLMS_ (T))
+#define ptable_seen_free(T)        ptable_seen_free(aPTBLMS_ (T))
 
 /* ... Global data ......................................................... */
 
@@ -158,9 +164,7 @@ typedef struct {
  ptable *tbl; /* It really is a ptable_hints */
  tTHX    owner;
 #endif
-#if !LT_HAS_RPEEP
  ptable *seen; /* It really is a ptable_seen */
-#endif
  SV     *default_meth;
 } my_cxt_t;
 
@@ -223,9 +227,7 @@ STATIC void lt_thread_cleanup(pTHX_ void *ud) {
  dMY_CXT;
 
  ptable_hints_free(MY_CXT.tbl);
-#if !LT_HAS_RPEEP
  ptable_seen_free(MY_CXT.seen);
-#endif /* !LT_HAS_RPEEP */
 }
 
 #endif /* LT_THREADSAFE */
@@ -289,7 +291,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);
   }
  }
 
@@ -352,7 +354,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;
@@ -369,6 +371,7 @@ STATIC SV *lt_hint(pTHX) {
 
 /* PerlMemShared_free() needs the [ap]PTBLMS_? default values */
 #define ptable_map_store(T, K, V) ptable_map_store(aPTBLMS_ (T), (K), (V))
+#define ptable_map_delete(T, K)   ptable_map_delete(aPTBLMS_ (T), (K))
 
 STATIC ptable *lt_op_map = NULL;
 
@@ -613,12 +616,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);
@@ -642,31 +645,15 @@ STATIC OP *lt_ck_padsv(pTHX_ OP *o) {
 
 STATIC peep_t lt_old_peep = 0; /* This is actually the rpeep past 5.13.5 */
 
-#if !LT_HAS_RPEEP
-# define LT_PEEP_REC_PROTO STATIC void lt_peep_rec(pTHX_ OP *o, ptable *seen)
-#else /* !LT_HAS_RPEEP */
-# define LT_PEEP_REC_PROTO STATIC void lt_peep_rec(pTHX_ OP *o)
-#endif /* LT_HAS_RPEEP */
-
-LT_PEEP_REC_PROTO;
-LT_PEEP_REC_PROTO {
-#if !LT_HAS_RPEEP
-# define lt_peep_rec(O) lt_peep_rec(aTHX_ (O), seen)
-#else /* !LT_HAS_RPEEP */
-# define lt_peep_rec(O) lt_peep_rec(aTHX_ (O))
-#endif /* LT_HAS_RPEEP */
-
-#if !LT_HAS_RPEEP
- if (ptable_fetch(seen, o))
-  return;
-#endif
-
+STATIC void lt_peep_rec(pTHX_ OP *o, ptable *seen) {
+#define lt_peep_rec(O) lt_peep_rec(aTHX_ (O), seen)
  for (; o; o = o->op_next) {
   lt_op_info *oi = NULL;
 
-#if !LT_HAS_RPEEP
+  if (ptable_fetch(seen, o))
+   break;
   ptable_seen_store(seen, o, o);
-#endif
+
   switch (o->op_type) {
    case OP_PADSV:
     if (o->op_ppaddr != lt_pp_padsv && o->op_private & OPpLVAL_INTRO) {
@@ -720,15 +707,14 @@ LT_PEEP_REC_PROTO {
 }
 
 STATIC void lt_peep(pTHX_ OP *o) {
-#if !LT_HAS_RPEEP
  dMY_CXT;
  ptable *seen = MY_CXT.seen;
 
- ptable_seen_clear(seen);
-#endif /* !LT_HAS_RPEEP */
-
  lt_old_peep(aTHX_ o);
+
+ ptable_seen_clear(seen);
  lt_peep_rec(o);
+ ptable_seen_clear(seen);
 }
 
 /* --- Interpreter setup/teardown ------------------------------------------ */
@@ -750,9 +736,7 @@ STATIC void lt_teardown(pTHX_ void *root) {
 #if LT_THREADSAFE
   ptable_hints_free(MY_CXT.tbl);
 #endif
-#if !LT_HAS_RPEEP
   ptable_seen_free(MY_CXT.seen);
-#endif
   SvREFCNT_dec(MY_CXT.default_meth);
  }
 
@@ -782,9 +766,7 @@ STATIC void lt_setup(pTHX) {
   MY_CXT.tbl          = ptable_new();
   MY_CXT.owner        = aTHX;
 #endif
-#if !LT_HAS_RPEEP
   MY_CXT.seen         = ptable_new();
-#endif
   MY_CXT.default_meth = newSVpvn("TYPEDSCALAR", 11);
   SvREADONLY_on(MY_CXT.default_meth);
  }
@@ -833,6 +815,7 @@ BOOT:
 
   stash = gv_stashpvn(__PACKAGE__, __PACKAGE_LEN__, 1);
   newCONSTSUB(stash, "LT_THREADSAFE", newSVuv(LT_THREADSAFE));
+  newCONSTSUB(stash, "LT_FORKSAFE",   newSVuv(LT_FORKSAFE));
  }
 
  lt_setup();
@@ -845,9 +828,7 @@ CLONE(...)
 PROTOTYPE: DISABLE
 PREINIT:
  ptable *t;
-#if !LT_HAS_RPEEP
  ptable *s;
-#endif
  SV     *cloned_default_meth;
 PPCODE:
  {
@@ -861,17 +842,13 @@ PPCODE:
    cloned_default_meth = lt_dup_inc(MY_CXT.default_meth, &ud);
    lt_ptable_clone_ud_deinit(ud);
   }
-#if !LT_HAS_RPEEP
   s = ptable_new();
-#endif
  }
  {
   MY_CXT_CLONE;
   MY_CXT.tbl          = t;
   MY_CXT.owner        = aTHX;
-#if !LT_HAS_RPEEP
   MY_CXT.seen         = s;
-#endif
   MY_CXT.default_meth = cloned_default_meth;
  }
  reap(3, lt_thread_cleanup, NULL);